@agent-native/core 0.171.3 → 0.172.0

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 (55) hide show
  1. package/dist/agent/actions/set-tool-approval-policy.d.ts +8 -0
  2. package/dist/agent/actions/set-tool-approval-policy.js +26 -0
  3. package/dist/agent/harness/migrations.js +8 -0
  4. package/dist/agent/harness/runner.js +114 -33
  5. package/dist/agent/harness/store.d.ts +9 -0
  6. package/dist/agent/harness/store.js +87 -23
  7. package/dist/agent/production-agent.d.ts +3 -0
  8. package/dist/agent/production-agent.js +23 -1
  9. package/dist/agent/run-manager.js +40 -9
  10. package/dist/agent/tool-approval-migrations.d.ts +21 -0
  11. package/dist/agent/tool-approval-migrations.js +32 -0
  12. package/dist/agent/tool-approval-store.d.ts +11 -0
  13. package/dist/agent/tool-approval-store.js +76 -1
  14. package/dist/cli/code-agent-executor.js +20 -3
  15. package/dist/client/AgentPanel.d.ts +4 -1
  16. package/dist/client/AgentPanel.js +11 -3
  17. package/dist/client/AssistantChat.d.ts +5 -5
  18. package/dist/client/AssistantChat.js +24 -11
  19. package/dist/client/chat/tool-call-display.d.ts +5 -5
  20. package/dist/client/chat/tool-call-display.js +27 -11
  21. package/dist/client/resources/McpIntegrationDialog.js +5 -5
  22. package/dist/client/resources/mcp-integration-catalog.js +1 -1
  23. package/dist/coding-tools/index.d.ts +31 -0
  24. package/dist/coding-tools/index.js +139 -3
  25. package/dist/collab/struct-routes.d.ts +1 -1
  26. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  27. package/dist/localization/core-messages/ar-SA.js +3 -0
  28. package/dist/localization/core-messages/de-DE.js +3 -0
  29. package/dist/localization/core-messages/en-US.d.ts +3 -0
  30. package/dist/localization/core-messages/en-US.js +3 -0
  31. package/dist/localization/core-messages/es-ES.js +3 -0
  32. package/dist/localization/core-messages/fr-FR.js +3 -0
  33. package/dist/localization/core-messages/hi-IN.js +3 -0
  34. package/dist/localization/core-messages/ja-JP.js +3 -0
  35. package/dist/localization/core-messages/ko-KR.js +3 -0
  36. package/dist/localization/core-messages/pt-BR.js +3 -0
  37. package/dist/localization/core-messages/zh-CN.js +3 -0
  38. package/dist/localization/core-messages/zh-TW.js +3 -0
  39. package/dist/localization/core-messages.d.ts +3 -0
  40. package/dist/localization/default-messages.d.ts +1 -0
  41. package/dist/localization/default-messages.js +7 -6
  42. package/dist/progress/routes.d.ts +1 -1
  43. package/dist/provider-api/actions/custom-provider-registration.d.ts +7 -7
  44. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  45. package/dist/resources/handlers.d.ts +1 -1
  46. package/dist/secrets/routes.d.ts +6 -6
  47. package/dist/server/action-discovery.js +5 -0
  48. package/dist/server/agent-chat/prompt-resources.d.ts +9 -0
  49. package/dist/server/agent-chat/prompt-resources.js +12 -2
  50. package/dist/server/realtime-token.d.ts +1 -1
  51. package/dist/server/release-schema.js +4 -1
  52. package/dist/triggers/dispatcher.d.ts +24 -0
  53. package/dist/triggers/dispatcher.js +76 -18
  54. package/dist/vite/action-types-plugin.js +4 -0
  55. package/package.json +2 -1
@@ -3,6 +3,10 @@ import fs from "node:fs";
3
3
  import path from "node:path";
4
4
  const DEFAULT_COMMAND_TIMEOUT_MS = 120_000;
5
5
  const DEFAULT_MAX_OUTPUT_CHARS = 50_000;
6
+ /** How long `close` may lag `exit` before we settle on the exit code anyway. */
7
+ const CLOSE_GRACE_MS = 500;
8
+ /** How long a signalled process group has to exit before it is SIGKILLed. */
9
+ const SIGKILL_GRACE_MS = 1_000;
6
10
  const DEFAULT_MAX_FILE_READ_CHARS = 120_000;
7
11
  /**
8
12
  * Output retention window for bash: keep first HEAD_CHARS + last TAIL_CHARS,
@@ -305,17 +309,45 @@ export function createCodingToolRegistry(options = {}) {
305
309
  };
306
310
  }
307
311
  export async function runCodingCommand(command, cwd, timeoutMs, options = {}) {
312
+ // `detached` puts the child in its own process group so `abort` can signal
313
+ // everything it spawned. Without it a timeout signals only the `sh -c`
314
+ // wrapper, which a backgrounding command has usually already outlived.
308
315
  const child = spawn(command, {
309
316
  cwd,
310
317
  shell: true,
311
318
  stdio: ["pipe", "pipe", "pipe"],
319
+ detached: true,
312
320
  env: { ...process.env, FORCE_COLOR: "0" },
313
321
  });
314
322
  let stdout = "";
315
323
  let stderr = "";
316
324
  let timedOut = false;
325
+ let outputStillOpen = false;
317
326
  const startMs = Date.now();
318
- const abort = () => child.kill("SIGTERM");
327
+ const killGroup = (signal) => {
328
+ try {
329
+ if (child.pid !== undefined)
330
+ process.kill(-child.pid, signal);
331
+ else
332
+ child.kill(signal);
333
+ }
334
+ catch {
335
+ // The group is already gone, or we never got a pid. Fall back to the
336
+ // direct child; if that also throws the process is already reaped.
337
+ try {
338
+ child.kill(signal);
339
+ }
340
+ catch {
341
+ /* already exited */
342
+ }
343
+ }
344
+ };
345
+ let sigkillTimer;
346
+ const abort = () => {
347
+ killGroup("SIGTERM");
348
+ sigkillTimer ??= setTimeout(() => killGroup("SIGKILL"), SIGKILL_GRACE_MS);
349
+ sigkillTimer.unref?.();
350
+ };
319
351
  const timer = setTimeout(() => {
320
352
  timedOut = true;
321
353
  abort();
@@ -341,9 +373,39 @@ export async function runCodingCommand(command, cwd, timeoutMs, options = {}) {
341
373
  options.signal.addEventListener("abort", abort, { once: true });
342
374
  }
343
375
  try {
376
+ // `close` fires only once every inherited pipe is closed, so a command that
377
+ // leaves a grandchild running (`npm run dev &`) never reaches it. Treat
378
+ // `exit` as authoritative and allow `close` a short grace to deliver
379
+ // buffered output, then settle on what we have.
344
380
  const code = await new Promise((resolve, reject) => {
345
- child.once("error", reject);
346
- child.once("close", resolve);
381
+ let settled = false;
382
+ let graceTimer;
383
+ const settle = (value) => {
384
+ if (settled)
385
+ return;
386
+ settled = true;
387
+ if (graceTimer)
388
+ clearTimeout(graceTimer);
389
+ resolve(value);
390
+ };
391
+ child.once("error", (err) => {
392
+ if (settled)
393
+ return;
394
+ settled = true;
395
+ if (graceTimer)
396
+ clearTimeout(graceTimer);
397
+ reject(err);
398
+ });
399
+ child.once("close", (closeCode) => settle(closeCode));
400
+ child.once("exit", (exitCode) => {
401
+ if (settled)
402
+ return;
403
+ graceTimer = setTimeout(() => {
404
+ outputStillOpen = true;
405
+ settle(exitCode);
406
+ }, CLOSE_GRACE_MS);
407
+ graceTimer.unref?.();
408
+ });
347
409
  });
348
410
  return {
349
411
  code,
@@ -351,10 +413,16 @@ export async function runCodingCommand(command, cwd, timeoutMs, options = {}) {
351
413
  stderr,
352
414
  timedOut,
353
415
  durationMs: Date.now() - startMs,
416
+ ...(outputStillOpen ? { outputStillOpen: true } : {}),
354
417
  };
355
418
  }
356
419
  finally {
357
420
  clearTimeout(timer);
421
+ // Deliberately NOT clearing `sigkillTimer`. It exists only when abort ran,
422
+ // and the exit-grace path can settle before the 1s escalation fires — a
423
+ // descendant that ignored SIGTERM would then outlive the call untouched.
424
+ // Letting it run costs nothing: it is unref'd, and `killGroup` on an
425
+ // already-dead group is a caught no-op.
358
426
  options.signal?.removeEventListener("abort", abort);
359
427
  }
360
428
  }
@@ -399,6 +467,9 @@ export function formatCodingCommandResult(result, maxChars = DEFAULT_MAX_OUTPUT_
399
467
  ? ""
400
468
  : `exitCode: ${result.code}`,
401
469
  result.timedOut ? "timedOut: true" : "",
470
+ result.outputStillOpen
471
+ ? "note: the command exited but a process it started is still running and holding the output stream, so the output below may be incomplete"
472
+ : "",
402
473
  result.stdout ? `stdout:\n${result.stdout}` : "",
403
474
  result.stderr ? `stderr:\n${result.stderr}` : "",
404
475
  ].filter(Boolean);
@@ -422,6 +493,71 @@ export function truncateBashOutput(value, headChars = BASH_OUTPUT_HEAD_CHARS, ta
422
493
  const omitted = value.length - max;
423
494
  return `${value.slice(0, headChars)}\n\n...[${omitted} chars omitted]\n\n${value.slice(value.length - tailChars)}`;
424
495
  }
496
+ /**
497
+ * Strip shell quoting so a policy regex sees the word the shell will actually
498
+ * run. Bash removes quotes before the command word exists, so `git 'checkout'`
499
+ * and `gi''t checkout` both execute `git checkout` while matching no rule
500
+ * written against the literal text — every denylist entry is otherwise one pair
501
+ * of quotes away from being bypassed.
502
+ *
503
+ * `unanalyzable` reports constructs whose executed text this pass cannot
504
+ * recover, so no rule matched against the canonical form can be trusted:
505
+ * `$'…'` ANSI-C escapes (`$'\x67it'` → `git`) and command substitution
506
+ * (`$(printf git) $(printf checkout) main` runs the forbidden operation while
507
+ * the string contains neither token). Callers must escalate rather than clear a
508
+ * command when this is set. Substitution inside single quotes is literal, so it
509
+ * does not set the flag.
510
+ *
511
+ * ponytail: plain parameter expansion (`$VAR`, `${VAR}`) can also build a token
512
+ * at runtime and is NOT flagged — doing so would make ordinary `cd $TMPDIR`
513
+ * commands require approval. Closing that needs a real shell parser, which is
514
+ * the upgrade path if this boundary ever has to hold against a determined
515
+ * attacker rather than a misbehaving model.
516
+ */
517
+ export function canonicalizeShellCommand(command) {
518
+ let canonical = "";
519
+ let unanalyzable = false;
520
+ let quote = null;
521
+ for (let i = 0; i < command.length; i += 1) {
522
+ const ch = command[i];
523
+ if (quote === "'") {
524
+ if (ch === "'")
525
+ quote = null;
526
+ else
527
+ canonical += ch;
528
+ continue;
529
+ }
530
+ if (ch === "\\") {
531
+ const next = command[i + 1];
532
+ if (next === undefined)
533
+ continue;
534
+ // Backslash-newline is a line continuation: both characters vanish.
535
+ if (next !== "\n")
536
+ canonical += next;
537
+ i += 1;
538
+ continue;
539
+ }
540
+ // Substitution expands inside double quotes as well as unquoted.
541
+ if (ch === "`" || (ch === "$" && command[i + 1] === "(")) {
542
+ unanalyzable = true;
543
+ }
544
+ if (quote === '"') {
545
+ if (ch === '"')
546
+ quote = null;
547
+ else
548
+ canonical += ch;
549
+ continue;
550
+ }
551
+ if (ch === "$" && command[i + 1] === "'")
552
+ unanalyzable = true;
553
+ if (ch === "'" || ch === '"') {
554
+ quote = ch;
555
+ continue;
556
+ }
557
+ canonical += ch;
558
+ }
559
+ return { canonical, unanalyzable };
560
+ }
425
561
  export function isReadOnlyShellCommand(command) {
426
562
  const normalized = command.trim().toLowerCase();
427
563
  if (!normalized)
@@ -13,8 +13,8 @@
13
13
  * Body: { json: any, fieldName?: string, type?: "map"|"array", requestSource?: string }
14
14
  */
15
15
  export declare const postCollabJson: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
16
- ok?: undefined;
17
16
  error: string;
17
+ ok?: undefined;
18
18
  } | {
19
19
  error?: undefined;
20
20
  ok: boolean;
@@ -17,11 +17,11 @@ declare const _default: import("../../action.js").ActionDefinition<{
17
17
  id?: undefined;
18
18
  provider?: undefined;
19
19
  } | {
20
- error?: undefined;
21
20
  configured?: undefined;
22
21
  connectPath?: undefined;
23
22
  url: string;
24
23
  id: string;
25
24
  provider: string;
25
+ error?: undefined;
26
26
  }>;
27
27
  export default _default;
@@ -1,10 +1,13 @@
1
1
  const messages = {
2
2
  "approval.alwaysAllow": "السماح دائمًا",
3
3
  "approval.alwaysAllowHint": "الموافقة على هذا الأمر المحدد والسماح به دائمًا",
4
+ "approval.alwaysAllowAction": "السماح بهذا الإجراء دائمًا",
5
+ "approval.alwaysAllowActionHint": "الموافقة والسماح بهذا الإجراء دائمًا",
4
6
  "approval.approve": "موافقة",
5
7
  "approval.approved": "تمت الموافقة. جارٍ إعادة تشغيل {{tool}}...",
6
8
  "approval.denied": "تم الرفض. لم يتم تشغيل {{tool}}.",
7
9
  "approval.deny": "رفض",
10
+ "approval.moreOptions": "المزيد من خيارات الموافقة",
8
11
  "approval.question": "هل توافق على تشغيل {{tool}}؟",
9
12
  "auth.expiredDescription": "ربما انتهت صلاحية جلستك. سجّل الخروج ثم ادخل مجددًا لإعادة الاتصال.",
10
13
  "auth.expiredTitle": "انتهت صلاحية الجلسة",
@@ -1,10 +1,13 @@
1
1
  const messages = {
2
2
  "approval.alwaysAllow": "Immer erlauben",
3
3
  "approval.alwaysAllowHint": "Diesen exakten Befehl genehmigen und immer erlauben",
4
+ "approval.alwaysAllowAction": "Diese Aktion immer erlauben",
5
+ "approval.alwaysAllowActionHint": "Genehmigen und diese Aktion immer erlauben",
4
6
  "approval.approve": "Genehmigen",
5
7
  "approval.approved": "Genehmigt. {{tool}} wird erneut ausgeführt...",
6
8
  "approval.denied": "Abgelehnt. {{tool}} wurde nicht ausgeführt.",
7
9
  "approval.deny": "Ablehnen",
10
+ "approval.moreOptions": "Weitere Genehmigungsoptionen",
8
11
  "approval.question": "Ausführung von {{tool}} genehmigen?",
9
12
  "auth.expiredDescription": "Deine Sitzung ist möglicherweise abgelaufen. Melde dich ab und wieder an, um die Verbindung wiederherzustellen.",
10
13
  "auth.expiredTitle": "Sitzung abgelaufen",
@@ -1,10 +1,13 @@
1
1
  declare const messages: {
2
2
  readonly "approval.alwaysAllow": "Always allow";
3
3
  readonly "approval.alwaysAllowHint": "Approve and always allow this exact command";
4
+ readonly "approval.alwaysAllowAction": "Always allow this action";
5
+ readonly "approval.alwaysAllowActionHint": "Approve and always allow this action";
4
6
  readonly "approval.approve": "Approve";
5
7
  readonly "approval.approved": "Approved. Re-running {{tool}}...";
6
8
  readonly "approval.denied": "Denied. {{tool}} did not run.";
7
9
  readonly "approval.deny": "Deny";
10
+ readonly "approval.moreOptions": "More approval options";
8
11
  readonly "approval.question": "Approve to run {{tool}}?";
9
12
  readonly "auth.expiredDescription": "Your session may have expired. Log out and log back in to reconnect.";
10
13
  readonly "auth.expiredTitle": "Session expired";
@@ -1,10 +1,13 @@
1
1
  const messages = {
2
2
  "approval.alwaysAllow": "Always allow",
3
3
  "approval.alwaysAllowHint": "Approve and always allow this exact command",
4
+ "approval.alwaysAllowAction": "Always allow this action",
5
+ "approval.alwaysAllowActionHint": "Approve and always allow this action",
4
6
  "approval.approve": "Approve",
5
7
  "approval.approved": "Approved. Re-running {{tool}}...",
6
8
  "approval.denied": "Denied. {{tool}} did not run.",
7
9
  "approval.deny": "Deny",
10
+ "approval.moreOptions": "More approval options",
8
11
  "approval.question": "Approve to run {{tool}}?",
9
12
  "auth.expiredDescription": "Your session may have expired. Log out and log back in to reconnect.",
10
13
  "auth.expiredTitle": "Session expired",
@@ -1,10 +1,13 @@
1
1
  const messages = {
2
2
  "approval.alwaysAllow": "Permitir siempre",
3
3
  "approval.alwaysAllowHint": "Aprobar y permitir siempre este comando exacto",
4
+ "approval.alwaysAllowAction": "Permitir siempre esta acción",
5
+ "approval.alwaysAllowActionHint": "Aprobar y permitir siempre esta acción",
4
6
  "approval.approve": "Aprobar",
5
7
  "approval.approved": "Aprobado. Ejecutando {{tool}} de nuevo...",
6
8
  "approval.denied": "Denegado. {{tool}} no se ejecutó.",
7
9
  "approval.deny": "Denegar",
10
+ "approval.moreOptions": "Más opciones de aprobación",
8
11
  "approval.question": "¿Aprobar la ejecución de {{tool}}?",
9
12
  "auth.expiredDescription": "Es posible que tu sesión haya caducado. Cierra sesión y vuelve a iniciarla para reconectarte.",
10
13
  "auth.expiredTitle": "Sesión caducada",
@@ -1,10 +1,13 @@
1
1
  const messages = {
2
2
  "approval.alwaysAllow": "Toujours autoriser",
3
3
  "approval.alwaysAllowHint": "Approuver et toujours autoriser cette commande exacte",
4
+ "approval.alwaysAllowAction": "Toujours autoriser cette action",
5
+ "approval.alwaysAllowActionHint": "Approuver et toujours autoriser cette action",
4
6
  "approval.approve": "Approuver",
5
7
  "approval.approved": "Approuvé. Nouvelle exécution de {{tool}}...",
6
8
  "approval.denied": "Refusé. {{tool}} n’a pas été exécuté.",
7
9
  "approval.deny": "Refuser",
10
+ "approval.moreOptions": "Plus d’options d’approbation",
8
11
  "approval.question": "Approuver l’exécution de {{tool}} ?",
9
12
  "auth.expiredDescription": "Votre session a peut-être expiré. Déconnectez-vous, puis reconnectez-vous pour rétablir la connexion.",
10
13
  "auth.expiredTitle": "Session expirée",
@@ -1,10 +1,13 @@
1
1
  const messages = {
2
2
  "approval.alwaysAllow": "हमेशा अनुमति दें",
3
3
  "approval.alwaysAllowHint": "इस सटीक कमांड को स्वीकृत करें और हमेशा अनुमति दें",
4
+ "approval.alwaysAllowAction": "इस कार्रवाई को हमेशा अनुमति दें",
5
+ "approval.alwaysAllowActionHint": "स्वीकृत करें और इस कार्रवाई को हमेशा अनुमति दें",
4
6
  "approval.approve": "स्वीकृत करें",
5
7
  "approval.approved": "स्वीकृत। {{tool}} को फिर से चलाया जा रहा है...",
6
8
  "approval.denied": "अस्वीकृत। {{tool}} नहीं चला।",
7
9
  "approval.deny": "अस्वीकार करें",
10
+ "approval.moreOptions": "अनुमति के और विकल्प",
8
11
  "approval.question": "क्या {{tool}} को चलाने की अनुमति दें?",
9
12
  "auth.expiredDescription": "आपका सत्र समाप्त हो गया हो सकता है। दोबारा कनेक्ट करने के लिए लॉग आउट करके फिर लॉग इन करें।",
10
13
  "auth.expiredTitle": "सत्र समाप्त हो गया",
@@ -1,10 +1,13 @@
1
1
  const messages = {
2
2
  "approval.alwaysAllow": "常に許可",
3
3
  "approval.alwaysAllowHint": "この完全に同じコマンドを承認し、今後も常に許可します",
4
+ "approval.alwaysAllowAction": "このアクションを常に許可",
5
+ "approval.alwaysAllowActionHint": "承認してこのアクションを常に許可します",
4
6
  "approval.approve": "承認",
5
7
  "approval.approved": "承認しました。{{tool}} を再実行しています...",
6
8
  "approval.denied": "拒否しました。{{tool}} は実行されませんでした。",
7
9
  "approval.deny": "拒否",
10
+ "approval.moreOptions": "その他の承認オプション",
8
11
  "approval.question": "{{tool}} の実行を承認しますか?",
9
12
  "auth.expiredDescription": "セッションの有効期限が切れた可能性があります。再接続するには、ログアウトしてからもう一度ログインしてください。",
10
13
  "auth.expiredTitle": "セッションの有効期限が切れました",
@@ -1,10 +1,13 @@
1
1
  const messages = {
2
2
  "approval.alwaysAllow": "항상 허용",
3
3
  "approval.alwaysAllowHint": "이 명령과 정확히 일치하는 명령을 승인하고 항상 허용합니다",
4
+ "approval.alwaysAllowAction": "이 작업 항상 허용",
5
+ "approval.alwaysAllowActionHint": "승인하고 이 작업을 항상 허용합니다",
4
6
  "approval.approve": "승인",
5
7
  "approval.approved": "승인했습니다. {{tool}}을(를) 다시 실행하는 중...",
6
8
  "approval.denied": "거부했습니다. {{tool}}이(가) 실행되지 않았습니다.",
7
9
  "approval.deny": "거부",
10
+ "approval.moreOptions": "추가 승인 옵션",
8
11
  "approval.question": "{{tool}} 실행을 승인하시겠습니까?",
9
12
  "auth.expiredDescription": "세션이 만료되었을 수 있습니다. 다시 연결하려면 로그아웃한 후 다시 로그인하세요.",
10
13
  "auth.expiredTitle": "세션이 만료되었습니다",
@@ -1,10 +1,13 @@
1
1
  const messages = {
2
2
  "approval.alwaysAllow": "Sempre permitir",
3
3
  "approval.alwaysAllowHint": "Aprovar e sempre permitir este comando exato",
4
+ "approval.alwaysAllowAction": "Sempre permitir esta ação",
5
+ "approval.alwaysAllowActionHint": "Aprovar e sempre permitir esta ação",
4
6
  "approval.approve": "Aprovar",
5
7
  "approval.approved": "Aprovado. Executando {{tool}} novamente...",
6
8
  "approval.denied": "Negado. {{tool}} não foi executado.",
7
9
  "approval.deny": "Negar",
10
+ "approval.moreOptions": "Mais opções de aprovação",
8
11
  "approval.question": "Aprovar a execução de {{tool}}?",
9
12
  "auth.expiredDescription": "Sua sessão pode ter expirado. Saia e entre novamente para restabelecer a conexão.",
10
13
  "auth.expiredTitle": "Sessão expirada",
@@ -1,10 +1,13 @@
1
1
  const messages = {
2
2
  "approval.alwaysAllow": "始终允许",
3
3
  "approval.alwaysAllowHint": "批准并始终允许此完全相同的命令",
4
+ "approval.alwaysAllowAction": "始终允许此操作",
5
+ "approval.alwaysAllowActionHint": "批准并始终允许此操作",
4
6
  "approval.approve": "批准",
5
7
  "approval.approved": "已批准。正在重新运行 {{tool}}...",
6
8
  "approval.denied": "已拒绝。{{tool}} 未运行。",
7
9
  "approval.deny": "拒绝",
10
+ "approval.moreOptions": "更多批准选项",
8
11
  "approval.question": "批准运行 {{tool}}?",
9
12
  "auth.expiredDescription": "您的会话可能已过期。请退出登录后重新登录以恢复连接。",
10
13
  "auth.expiredTitle": "会话已过期",
@@ -1,10 +1,13 @@
1
1
  const messages = {
2
2
  "approval.alwaysAllow": "一律允許",
3
3
  "approval.alwaysAllowHint": "核准並一律允許這個完全相同的命令",
4
+ "approval.alwaysAllowAction": "一律允許此動作",
5
+ "approval.alwaysAllowActionHint": "核准並一律允許此動作",
4
6
  "approval.approve": "核准",
5
7
  "approval.approved": "已核准。正在重新執行 {{tool}}...",
6
8
  "approval.denied": "已拒絕。{{tool}} 未執行。",
7
9
  "approval.deny": "拒絕",
10
+ "approval.moreOptions": "更多核准選項",
8
11
  "approval.question": "要核准執行 {{tool}} 嗎?",
9
12
  "auth.expiredDescription": "您的工作階段可能已過期。請登出後重新登入以恢復連線。",
10
13
  "auth.expiredTitle": "工作階段已過期",
@@ -3,10 +3,13 @@ export type CoreLocaleMessages = Record<string, unknown>;
3
3
  export declare const englishAgentChatMessages: {
4
4
  readonly "approval.alwaysAllow": "Always allow";
5
5
  readonly "approval.alwaysAllowHint": "Approve and always allow this exact command";
6
+ readonly "approval.alwaysAllowAction": "Always allow this action";
7
+ readonly "approval.alwaysAllowActionHint": "Approve and always allow this action";
6
8
  readonly "approval.approve": "Approve";
7
9
  readonly "approval.approved": "Approved. Re-running {{tool}}...";
8
10
  readonly "approval.denied": "Denied. {{tool}} did not run.";
9
11
  readonly "approval.deny": "Deny";
12
+ readonly "approval.moreOptions": "More approval options";
10
13
  readonly "approval.question": "Approve to run {{tool}}?";
11
14
  readonly "auth.expiredDescription": "Your session may have expired. Log out and log back in to reconnect.";
12
15
  readonly "auth.expiredTitle": "Session expired";
@@ -1014,6 +1014,7 @@ declare const messages: {
1014
1014
  continueToConnect: string;
1015
1015
  setupTitle: string;
1016
1016
  personal: string;
1017
+ personalConnection: string;
1017
1018
  organization: string;
1018
1019
  scopeQuestion: string;
1019
1020
  scopeChoiceTitle: string;
@@ -1015,11 +1015,12 @@ const messages = {
1015
1015
  customDescription: "Paste a Streamable HTTP or SSE endpoint and optional headers.",
1016
1016
  oauthNotice: "This provider usually requires an OAuth setup. Follow the provider docs, or add an Authorization header if your endpoint supports token-based access.",
1017
1017
  providerSetupRequired: "Provider setup required",
1018
- providerSetupDescription: "Complete the required setup in {{name}} first. Then return here to authorize your account.",
1019
- providerSetupFormDescription: "Review the provider requirements and open the official setup guide before connecting your account.",
1020
- continueToConnect: "I've completed setup",
1021
- setupTitle: "Set up {{name}}",
1018
+ providerSetupDescription: "Complete the required setup in {{name}} first. Then return here to connect your account.",
1019
+ providerSetupFormDescription: "Complete provider setup before connecting your account.",
1020
+ continueToConnect: "Connect my account",
1021
+ setupTitle: "Connect {{name}}",
1022
1022
  personal: "Personal",
1023
+ personalConnection: "Personal connection",
1023
1024
  organization: "Organization",
1024
1025
  scopeQuestion: "Who should be able to use this connection?",
1025
1026
  scopeChoiceTitle: "Who should use this?",
@@ -1044,7 +1045,7 @@ const messages = {
1044
1045
  descriptionPlaceholder: "Description (optional)",
1045
1046
  headersPlaceholder: "Authorization: Bearer <token>",
1046
1047
  openSetupDocs: "Open setup docs",
1047
- viewSetup: "View setup",
1048
+ viewSetup: "Open setup guide",
1048
1049
  test: "Test",
1049
1050
  toolsAvailable_one: "{{count}} tool available",
1050
1051
  toolsAvailable_other: "{{count}} tools available",
@@ -1122,7 +1123,7 @@ const messages = {
1122
1123
  atlassian: {
1123
1124
  description: "Read and write Jira issues and Confluence content.",
1124
1125
  useCase: "Project management, issue tracking, documentation, team collaboration",
1125
- setupNote: "Atlassian admins manage the allowed AI domains and Rovo integration permissions. Use the current Streamable HTTP endpoint, /v1/mcp, and reconnect after policy changes.",
1126
+ setupNote: "Ask your Atlassian admin to allow the Clips app domain and enable Rovo/MCP with Read, Write, and Search permissions for your Jira site.",
1126
1127
  },
1127
1128
  cloudflare: {
1128
1129
  description: "Search and operate Cloudflare services through its integration.",
@@ -15,6 +15,6 @@ export declare function createProgressHandler(): import("h3").EventHandlerWithFe
15
15
  error: string;
16
16
  ok?: undefined;
17
17
  } | {
18
- error?: undefined;
19
18
  ok: boolean;
19
+ error?: undefined;
20
20
  }>>;
@@ -76,7 +76,6 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
76
76
  }>>;
77
77
  }, z.core.$strip>>, {
78
78
  id?: undefined;
79
- provider?: undefined;
80
79
  deleted?: undefined;
81
80
  providers: {
82
81
  id: string;
@@ -88,34 +87,35 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
88
87
  updatedAt: number;
89
88
  }[];
90
89
  count: number;
90
+ provider?: undefined;
91
91
  found?: undefined;
92
92
  registered?: undefined;
93
93
  label?: undefined;
94
94
  message?: undefined;
95
95
  } | {
96
- count?: undefined;
97
96
  id?: undefined;
98
97
  deleted?: undefined;
99
98
  providers?: undefined;
99
+ count?: undefined;
100
100
  found: boolean;
101
101
  provider: import("../custom-registry.js").CustomProviderConfig;
102
102
  registered?: undefined;
103
103
  label?: undefined;
104
104
  message?: undefined;
105
105
  } | {
106
- count?: undefined;
107
- provider?: undefined;
108
106
  deleted?: undefined;
109
107
  providers?: undefined;
108
+ count?: undefined;
109
+ provider?: undefined;
110
110
  found: boolean;
111
111
  id: string;
112
112
  registered?: undefined;
113
113
  label?: undefined;
114
114
  message?: undefined;
115
115
  } | {
116
+ providers?: undefined;
116
117
  count?: undefined;
117
118
  provider?: undefined;
118
- providers?: undefined;
119
119
  found?: undefined;
120
120
  deleted: boolean;
121
121
  id: string;
@@ -123,10 +123,10 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
123
123
  label?: undefined;
124
124
  message?: undefined;
125
125
  } | {
126
- count?: undefined;
127
- provider?: undefined;
128
126
  deleted?: undefined;
129
127
  providers?: undefined;
128
+ count?: undefined;
129
+ provider?: undefined;
130
130
  found?: undefined;
131
131
  registered: boolean;
132
132
  id: string;
@@ -312,9 +312,8 @@ export declare function createProviderApiActions(runtime: Pick<ProviderApiRuntim
312
312
  scope?: "org" | "user" | undefined;
313
313
  }, {
314
314
  id?: undefined;
315
- message?: undefined;
316
- deleted?: undefined;
317
315
  provider?: undefined;
316
+ deleted?: undefined;
318
317
  providers: {
319
318
  id: string;
320
319
  label: string;
@@ -328,41 +327,42 @@ export declare function createProviderApiActions(runtime: Pick<ProviderApiRuntim
328
327
  found?: undefined;
329
328
  registered?: undefined;
330
329
  label?: undefined;
330
+ message?: undefined;
331
331
  } | {
332
332
  id?: undefined;
333
- message?: undefined;
334
333
  deleted?: undefined;
335
- count?: undefined;
336
334
  providers?: undefined;
335
+ count?: undefined;
337
336
  found: boolean;
338
337
  provider: import("../custom-registry.js").CustomProviderConfig;
339
338
  registered?: undefined;
340
339
  label?: undefined;
341
- } | {
342
340
  message?: undefined;
343
- deleted?: undefined;
344
- count?: undefined;
341
+ } | {
345
342
  provider?: undefined;
343
+ deleted?: undefined;
346
344
  providers?: undefined;
345
+ count?: undefined;
347
346
  found: boolean;
348
347
  id: string;
349
348
  registered?: undefined;
350
349
  label?: undefined;
351
- } | {
352
350
  message?: undefined;
353
- count?: undefined;
351
+ } | {
354
352
  provider?: undefined;
355
353
  providers?: undefined;
354
+ count?: undefined;
356
355
  found?: undefined;
357
356
  deleted: boolean;
358
357
  id: string;
359
358
  registered?: undefined;
360
359
  label?: undefined;
360
+ message?: undefined;
361
361
  } | {
362
- deleted?: undefined;
363
- count?: undefined;
364
362
  provider?: undefined;
363
+ deleted?: undefined;
365
364
  providers?: undefined;
365
+ count?: undefined;
366
366
  found?: undefined;
367
367
  registered: boolean;
368
368
  id: string;
@@ -48,8 +48,8 @@ export declare function handleUpdateResource(event: any): Promise<import("./stor
48
48
  }>;
49
49
  /** DELETE /_agent-native/resources/:id — delete a resource */
50
50
  export declare function handleDeleteResource(event: any): Promise<{
51
- ok?: undefined;
52
51
  error: string;
52
+ ok?: undefined;
53
53
  } | {
54
54
  error?: undefined;
55
55
  ok: boolean;