agim-cli 1.1.8 → 1.1.10

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.
Files changed (46) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/dist/cli-ui/entry-menu.d.ts +2 -0
  3. package/dist/cli-ui/entry-menu.d.ts.map +1 -1
  4. package/dist/cli-ui/entry-menu.js +2 -1
  5. package/dist/cli-ui/entry-menu.js.map +1 -1
  6. package/dist/cli-ui/i18n.d.ts +14 -0
  7. package/dist/cli-ui/i18n.d.ts.map +1 -1
  8. package/dist/cli-ui/i18n.js +30 -0
  9. package/dist/cli-ui/i18n.js.map +1 -1
  10. package/dist/cli-ui/token-menu.d.ts +3 -0
  11. package/dist/cli-ui/token-menu.d.ts.map +1 -0
  12. package/dist/cli-ui/token-menu.js +127 -0
  13. package/dist/cli-ui/token-menu.js.map +1 -0
  14. package/dist/cli.js +90 -11
  15. package/dist/cli.js.map +1 -1
  16. package/dist/core/a2a-notify.d.ts +35 -0
  17. package/dist/core/a2a-notify.d.ts.map +1 -0
  18. package/dist/core/a2a-notify.js +265 -0
  19. package/dist/core/a2a-notify.js.map +1 -0
  20. package/dist/core/a2a.d.ts +5 -0
  21. package/dist/core/a2a.d.ts.map +1 -1
  22. package/dist/core/a2a.js +59 -3
  23. package/dist/core/a2a.js.map +1 -1
  24. package/dist/core/access-token.d.ts +41 -0
  25. package/dist/core/access-token.d.ts.map +1 -0
  26. package/dist/core/access-token.js +179 -0
  27. package/dist/core/access-token.js.map +1 -0
  28. package/dist/core/agent-base.d.ts.map +1 -1
  29. package/dist/core/agent-base.js +4 -1
  30. package/dist/core/agent-base.js.map +1 -1
  31. package/dist/core/message-sink.d.ts +14 -0
  32. package/dist/core/message-sink.d.ts.map +1 -1
  33. package/dist/core/message-sink.js +7 -5
  34. package/dist/core/message-sink.js.map +1 -1
  35. package/dist/core/restart-flow.d.ts.map +1 -1
  36. package/dist/core/restart-flow.js +50 -12
  37. package/dist/core/restart-flow.js.map +1 -1
  38. package/dist/core/types.d.ts +6 -0
  39. package/dist/core/types.d.ts.map +1 -1
  40. package/dist/web/public/_app.js +59 -0
  41. package/dist/web/public/login.html +196 -0
  42. package/dist/web/public/settings.html +140 -1
  43. package/dist/web/server.d.ts.map +1 -1
  44. package/dist/web/server.js +190 -8
  45. package/dist/web/server.js.map +1 -1
  46. package/package.json +1 -1
@@ -117,6 +117,16 @@ export async function initiateRestart(initiator) {
117
117
  ? 'agim.service'
118
118
  : (existsSync('/etc/systemd/system/im-hub.service') ? 'im-hub.service' : null);
119
119
  if (unitName) {
120
+ // v1.1.10: deliver the "🔄 重启中…" ack SYNCHRONOUSLY before issuing
121
+ // systemctl restart. Otherwise the message sits in outbox while the
122
+ // process dies, the new process pushes "✅ 已重启完成…" first via
123
+ // priority='high', and the worker only flushes the ack afterwards.
124
+ // Result: completion appears in IM BEFORE the in-flight notice — the
125
+ // exact reversal the screenshot showed.
126
+ const ackMessage = pre.warnings.length === 0
127
+ ? '🔄 重启中(systemd 接管)… 预计 5-10 秒内回来。'
128
+ : `🔄 重启中(systemd 接管)… 预计 5-10 秒内回来。\n 注意:${pre.warnings.join(';')}`;
129
+ await deliverRestartAck(initiator, ackMessage);
120
130
  log.info({
121
131
  event: 'restart-flow.systemd_restart',
122
132
  unit: unitName,
@@ -134,12 +144,9 @@ export async function initiateRestart(initiator) {
134
144
  err: err instanceof Error ? err.message : String(err),
135
145
  });
136
146
  }
137
- return {
138
- ok: true,
139
- message: pre.warnings.length === 0
140
- ? '🔄 重启中(systemd 接管)… 预计 5-10 秒内回来。'
141
- : `🔄 重启中(systemd 接管)… 预计 5-10 秒内回来。\n 注意:${pre.warnings.join(';')}`,
142
- };
147
+ // ack already in flight — return empty message so the command handler
148
+ // doesn't push a duplicate via the normal reply pipeline.
149
+ return { ok: true, message: '' };
143
150
  }
144
151
  log.warn({ event: 'restart-flow.systemd_unit_missing' }, 'detectService said systemd but no unit file found; falling through to background helper');
145
152
  }
@@ -168,6 +175,14 @@ export async function initiateRestart(initiator) {
168
175
  errors: [String(err)],
169
176
  };
170
177
  }
178
+ // v1.1.10: deliver the ack synchronously so it arrives before the
179
+ // shutdown signal lands. Otherwise the new process's "✅ 已重启完成…"
180
+ // push (priority='high') reaches IM first and the worker only flushes
181
+ // this ack afterwards — reversing the order seen in chat.
182
+ const helperAck = pre.warnings.length === 0
183
+ ? '🔄 重启中… 预计 5–10 秒内回来。'
184
+ : `🔄 重启中… 预计 5–10 秒内回来。\n 注意:${pre.warnings.join(';')}`;
185
+ await deliverRestartAck(initiator, helperAck);
171
186
  setTimeout(() => {
172
187
  try {
173
188
  process.kill(process.pid, 'SIGTERM');
@@ -176,12 +191,35 @@ export async function initiateRestart(initiator) {
176
191
  process.exit(0);
177
192
  }
178
193
  }, 300);
179
- return {
180
- ok: true,
181
- message: pre.warnings.length === 0
182
- ? '🔄 重启中… 预计 5–10 秒内回来。'
183
- : `🔄 重启中… 预计 5–10 秒内回来。\n 注意:${pre.warnings.join(';')}`,
184
- };
194
+ return { ok: true, message: '' };
195
+ }
196
+ /**
197
+ * Push the "🔄 重启中…" notice via sink with priority='high' so the
198
+ * adapter actually delivers it before the process exits. Non-IM initiators
199
+ * (web / CLI) get the message back through their own return channel and
200
+ * don't need a push — we skip in those cases.
201
+ */
202
+ async function deliverRestartAck(initiator, body) {
203
+ if (initiator.source !== 'im' || !initiator.platform || !initiator.threadId)
204
+ return;
205
+ try {
206
+ const { sink } = await import('./message-sink.js');
207
+ await sink.deliver({
208
+ platform: initiator.platform,
209
+ channelId: initiator.channelId ?? '',
210
+ threadId: initiator.threadId,
211
+ payload: body,
212
+ kind: 'text',
213
+ priority: 'high',
214
+ source: 'system',
215
+ });
216
+ }
217
+ catch (err) {
218
+ log.warn({
219
+ event: 'restart-flow.ack_deliver_failed',
220
+ err: err instanceof Error ? err.message : String(err),
221
+ }, 'failed to deliver restart-in-progress ack; falling back to return-message path');
222
+ }
185
223
  }
186
224
  /**
187
225
  * Build the detached helper script. It:
@@ -1 +1 @@
1
- {"version":3,"file":"restart-flow.js","sourceRoot":"","sources":["../../src/core/restart-flow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"restart-flow.js","sourceRoot":"","sources":["../../src/core/restart-flow.ts"],"names":[],"mappings":"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"}
@@ -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)
@@ -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":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAElC;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;CAChB;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAChF;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACxE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAEpD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;;yDAKqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,IAAI,CAAA;IACf,YAAY,EAAE,IAAI,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;mCAE+B;IAC/B,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,4CAA4C;IAC5C,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAA;IACxB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;gEAE4D;IAC5D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;0DAEsD;IACtD,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B;;;kEAG8D;IAC9D,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;mBAGe;IACf,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;;;iFAM6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,4DAA4D;AAC5D,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAA;IACpE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;IACf,WAAW,CAAC,EAAE,IAAI,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAChE,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1D;;;;OAIG;IACH,UAAU,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/D;;;;OAIG;IACH,QAAQ,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzD;;;;;;;;OAQG;IACH,YAAY,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAA;IAClF;;;;;;;;OAQG;IACH,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACvE;;;;;;;;;OASG;IACH,gBAAgB,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/F;;;;;OAKG;IACH,gBAAgB,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACpG;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd;;yEAEqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;iDAC6C;IAC7C,SAAS,EAAE,MAAM,CAAA;IACjB;4EACwE;IACxE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACtC;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC;;2BAEuB;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAA;IACjB;sDACkD;IAClD,IAAI,EAAE,QAAQ,GAAG,YAAY,CAAA;IAC7B,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EACJ,SAAS,GACT,gBAAgB,GAChB,QAAQ,GACR,gBAAgB,GAChB,SAAS,CAAA;IACb,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,IAAI,CAAA;CACb;AAED;6DAC6D;AAC7D,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;AAEhD;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;gDAK4C;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;sEAEkE;IAClE,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B;;;;iEAI6D;IAC7D,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC;;6EAEyE;IACzE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IAC5F;;;gFAG4E;IAC5E,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;mDAG+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;mEAE+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;sEAIkE;IAClE,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAA;IAC1B,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;IACpH,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB"}
@@ -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
- return fetch(url, { ...init, headers, credentials: 'same-origin' });
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');
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"AAsDA,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,CAksB/C"}
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"}