From 7ec608657ac670dc5f077974679c455da2a3668f Mon Sep 17 00:00:00 2001 From: Chris Abbey Date: Mon, 31 Aug 2026 12:13:35 -0700 Subject: [PATCH] feat(setup): validate kiro-cli supports the acp command, offer in-place update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The first-run readiness gate only checked that kiro-cli was present (--version) and signed in (whoami). A CLI too old to expose the `acp` subcommand — which KiroCrew launches every session through — passed the gate and then failed opaquely at session-create (`process exited (rc=None)`). Add an `acp --help` probe after whoami: a clean "unknown subcommand" rejection sets acp_supported=False and narrows `ready`, while an inconclusive probe (timeout/sandbox refusal) is treated as supported so a healthy install is never blocked. The remedy is an in-place update, not a reinstall — a new owner-gated POST /api/kiro-prerequisite/update-cli runs `kiro-cli update` for the user and re-probes, and the gate shows an "Update Kiro CLI" screen in place of the install offer. Strings added to all 12 locales; the offline fake ACP backend answers `acp --help`. --- src/kiro_crew/dashboard/handlers/__init__.py | 1 + .../dashboard/handlers/kiro_prerequisite.py | 30 ++ src/kiro_crew/dashboard/routes/realtime.py | 6 + src/kiro_crew/kiro_prerequisite.py | 234 +++++++++++++- src/kiro_crew/testing/fake_acp_backend.py | 8 + test/test_kiro_prerequisite.py | 302 +++++++++++++++++- website/src/api/client.ts | 25 ++ .../src/components/KiroPrerequisiteGate.tsx | 117 +++++++ website/src/i18n/locales/bn.json | 10 +- website/src/i18n/locales/de.json | 10 +- website/src/i18n/locales/en-XA.json | 10 +- website/src/i18n/locales/en.manual.json | 10 +- website/src/i18n/locales/es.json | 10 +- website/src/i18n/locales/fr.json | 10 +- website/src/i18n/locales/hi.json | 10 +- website/src/i18n/locales/it.json | 10 +- website/src/i18n/locales/ja.json | 10 +- website/src/i18n/locales/ko.json | 10 +- website/src/i18n/locales/pt.json | 10 +- website/src/i18n/locales/ru.json | 10 +- website/src/i18n/locales/zh-CN.json | 10 +- 21 files changed, 835 insertions(+), 18 deletions(-) diff --git a/src/kiro_crew/dashboard/handlers/__init__.py b/src/kiro_crew/dashboard/handlers/__init__.py index fe251fb5bbb..27c90d56121 100644 --- a/src/kiro_crew/dashboard/handlers/__init__.py +++ b/src/kiro_crew/dashboard/handlers/__init__.py @@ -188,6 +188,7 @@ def sel(): from kiro_crew.dashboard.handlers.kiro_prerequisite import ( # noqa: E402, F401 api_kiro_prerequisite_repair_specs, api_kiro_prerequisite_status, + api_kiro_prerequisite_update_cli, ) from kiro_crew.dashboard.handlers.mcp import ( # noqa: E402, F401 _bg_mcp_probe, diff --git a/src/kiro_crew/dashboard/handlers/kiro_prerequisite.py b/src/kiro_crew/dashboard/handlers/kiro_prerequisite.py index d77fe88515a..2ad2dd4c872 100644 --- a/src/kiro_crew/dashboard/handlers/kiro_prerequisite.py +++ b/src/kiro_crew/dashboard/handlers/kiro_prerequisite.py @@ -12,6 +12,7 @@ from kiro_crew.kiro_prerequisite import ( KIRO_CLI_LOGIN_COMMAND, KIRO_CLI_SSO_LOGIN_COMMAND, + KIRO_CLI_UPDATE_COMMAND, OFFICIAL_INSTALL_DOCS_URL, KiroPrerequisiteService, PrerequisiteStatus, @@ -185,6 +186,14 @@ async def api_kiro_prerequisite_status(request: web.Request) -> web.Response: # withholding them costs them nothing. "missing_agent_specs": [], "agent_spec_repair_error": "", + # Same shape-stability reason: a non-owner cannot act on an outdated + # CLI (the update is an owner-gated POST), so acp_supported is + # reported healthy, update_command carries the standard command + # string, and cli_update_error is blank. Present rather than omitted + # so a consumer reading these keys never branches on ``undefined``. + "acp_supported": True, + "update_command": KIRO_CLI_UPDATE_COMMAND, + "cli_update_error": "", # See _LEGACY_IDLE_OPERATION: a pre-upgrade tab crashes without this, # and the payload shape must not vary by caller either way. "operation": legacy_idle_operation(), @@ -211,3 +220,24 @@ async def api_kiro_prerequisite_repair_specs(request: web.Request) -> web.Respon return denied snapshot = await _service(request).repair_agent_specs(_caller(request)) return web.json_response({**snapshot, "setup_allowed": True}) + + +async def api_kiro_prerequisite_update_cli(request: web.Request) -> web.Response: + """POST /api/kiro-prerequisite/update-cli — run the CLI's in-place self-update. + + A POST for the same reason as repair-specs: the spawn must be origin-checked + and audited, and both barriers are method-scoped. Offered only to remedy a + too-old kiro-cli that lacks the ``acp`` subcommand Kiro Crew launches every + session through. Unlike the install/sign-in steps (which Kiro Crew only + names), this one runs ``kiro-cli update`` FOR the owner — the CLI's own + self-update, the same command the auto-update path already runs. + + Returns 200 with the post-update snapshot (``cli_update_error`` empty on + success): it runs to completion within the request, like repair-specs. + """ + + denied = await _dashboard_owner_only(request) + if denied is not None: + return denied + snapshot = await _service(request).update_cli(_caller(request)) + return web.json_response({**snapshot, "setup_allowed": True}) diff --git a/src/kiro_crew/dashboard/routes/realtime.py b/src/kiro_crew/dashboard/routes/realtime.py index 0c5d6a7a063..3fbfd147e86 100644 --- a/src/kiro_crew/dashboard/routes/realtime.py +++ b/src/kiro_crew/dashboard/routes/realtime.py @@ -70,6 +70,12 @@ def register(app: web.Application) -> None: "/api/kiro-prerequisite/repair-specs", handlers.api_kiro_prerequisite_repair_specs, ) + # POST for the same reason as repair-specs above: it spawns `kiro-cli update` + # on the host, so it must be origin-checked and audited. + app.router.add_post( + "/api/kiro-prerequisite/update-cli", + handlers.api_kiro_prerequisite_update_cli, + ) # KAS-mode interactive login (no kiro-cli): status is a read; the device-code # begin/poll/logout mutations are POSTs so they stay origin-checked and audited. diff --git a/src/kiro_crew/kiro_prerequisite.py b/src/kiro_crew/kiro_prerequisite.py index 7524ae20725..c7ce3ddb5e2 100644 --- a/src/kiro_crew/kiro_prerequisite.py +++ b/src/kiro_crew/kiro_prerequisite.py @@ -88,6 +88,25 @@ # visual peer of organization SSO, so a user on an SSO plan can sign in to the # wrong tier and only discover it when models are missing. KIRO_CLI_SSO_LOGIN_COMMAND = "kiro-cli login --use-device-flow --license pro" +# The command that updates the CLI in place. Unlike the install/sign-in steps +# above, which Kiro Crew only ever NAMES for the user to run, this one IS run on +# the user's behalf (see :meth:`KiroPrerequisiteService.update_cli`): it is the +# CLI's own self-update subcommand, the same one the auto-update path already +# invokes, so executing it introduces no new privileged surface — it is not a +# remote installer script, just the installed binary updating itself. Offered +# when the installed CLI is too old to expose the ``acp`` subcommand Kiro Crew +# drives every session through. A CODE CONSTANT, never a catalog value: a +# translated command cannot be typed or executed. +KIRO_CLI_UPDATE_COMMAND = "kiro-cli update" +# The subcommand Kiro Crew launches every ACP session through (see +# ``acp.client.KIRO_CLI_SUBCMD`` / ``acp.runtime.KIRO_CLI_SUBCMD``). Probed by +# name so the readiness check learns of a rename the same way a spawn would fail. +_ACP_SUBCOMMAND = "acp" +# How long the self-update is allowed to run before the probe gives up on it. +# ``kiro-cli update`` downloads and swaps a binary, so it is far slower than the +# read-only probes; sized to match the auto-update path's own 120s budget in +# ``slack/gateway.py`` rather than the 10s probe ceiling. +_UPDATE_TIMEOUT_SECS = 120 # Compatibility shim, not live state. Nothing performs an operation any more, but a # dashboard loaded BEFORE this change reads ``status.operation.status`` # unconditionally in its refetch-interval callback — the optional chain there @@ -132,6 +151,27 @@ def legacy_idle_operation() -> dict[str, str]: #: treated as acceptance: this module's rule is to report nothing rather than #: block a working install behind a repair card it cannot clear. _SPEC_REJECTION_MARKER = "is invalid" +# Substrings that identify an "unknown subcommand" rejection in the captured +# output of an ``acp --help`` probe. A kiro-cli that HAS the ``acp`` subcommand +# exits 0 and prints its help; one too old to have it exits nonzero and (being a +# clap CLI) prints one of these. Matched case-insensitively. +# +# This is deliberately a POSITIVE match on the rejection wording rather than +# "the probe printed something" or "exit was nonzero", for the same reason the +# spec probe matches its rejection marker: a probe that failed for an unrelated +# reason (a sandbox denial, a hung binary) also produces a nonzero exit and +# captured text, and reporting THAT as "your CLI is too old" would push the user +# to run an update that cannot fix it. Anything unrecognized is therefore treated +# as supported — the module's rule is to report nothing rather than block a +# working install behind a card it cannot clear (see :meth:`_probe_acp_support`). +_ACP_UNSUPPORTED_MARKERS = ( + "unrecognized subcommand", + "unknown subcommand", + "unrecognized command", + "unknown command", + "invalid subcommand", + "no such subcommand", +) # The identity probe's own budget, deliberately separate from # _PROBE_TIMEOUT_SECS. ``whoami`` is not a local read: when the cached token has # expired, Kiro CLI refreshes an OIDC token against the organization's IdP — @@ -384,6 +424,26 @@ class PrerequisiteStatus: # tier is an explicit choice rather than whichever option the sign-in page # happens to make prominent. sso_login_command: str = KIRO_CLI_SSO_LOGIN_COMMAND + # Whether the installed CLI exposes the ``acp`` subcommand every Kiro Crew + # session is launched through. Defaults True so nothing regresses when the + # probe cannot answer (a sandbox refusal, a timeout): those are reported by + # their own fields, and asserting "too old" off a probe that never ran would + # push the user to update a CLI that is fine. Only a CLEAN "unknown + # subcommand" verdict from ``acp --help`` sets it False — at which point the + # CLI runs and is signed in, but cannot start a single session, so it narrows + # ``ready`` exactly like a rejected spec. The remedy is an UPDATE, not a + # reinstall: the binary is present and only out of date. + acp_supported: bool = True + # What the user's CLI is updated with when ``acp_supported`` is False. Unlike + # ``login_command`` (which Kiro Crew only names), this one is also run FOR the + # user by ``update_cli`` — it is the CLI's own in-place self-update. Served in + # the payload so the UI has one source of truth for the string. + update_command: str = KIRO_CLI_UPDATE_COMMAND + # Exception / failure text from an ``update_cli`` attempt. Empty when no + # update was attempted or it succeeded. Shown verbatim, untranslated: it + # names why the self-update did not complete, which is what a support + # conversation needs. + cli_update_error: str = "" # A Kiro CLI binary that is present and executable but could not be VERIFIED # (verification runs the binary inside the sandbox) is a categorically # different condition from a missing binary, and a failed sandbox build @@ -2700,21 +2760,27 @@ async def _probe(self, *, force: bool = False) -> PrerequisiteStatus: # answer would not be actionable until sign-in is fixed anyway. rejected: list[str] = [] rejection_detail = "" + acp_supported = True if whoami.ok: rejected, rejection_detail = await self._probe_spec_acceptance( self._viable_binary ) + acp_supported = await self._probe_acp_support(self._viable_binary) self._status = PrerequisiteStatus( platform=_platform_label(self._platform), installed=True, authenticated=whoami.ok, # A required spec the CLI refuses fails every turn, exactly like - # one that is absent, so it narrows readiness the same way. - ready=whoami.ok and not rejected, + # one that is absent, so it narrows readiness the same way. A CLI + # without the ``acp`` subcommand cannot start ANY session, so it + # narrows readiness too — but its remedy is an update, not a spec + # rewrite, so it is tracked separately from ``repair_required``. + ready=whoami.ok and not rejected and acp_supported, repair_required=bool(rejected), initial_setup_complete=self._initial_setup_complete, rejected_agent_specs=rejected, agent_spec_rejection_detail=rejection_detail, + acp_supported=acp_supported, ) self._stamp_probe(probe_identity) return self._status @@ -2781,6 +2847,170 @@ def _present() -> list[tuple[str, Path]]: detail = _sanitize_detail((result.output or "").strip()) return rejected, detail + async def _probe_acp_support(self, executable: str) -> bool: + """Ask kiro-cli whether it exposes the ``acp`` subcommand Kiro Crew uses. + + Returns ``True`` when the subcommand is present OR when the probe could + not establish otherwise; ``False`` only on a CLEAN "unknown subcommand" + rejection. + + Kiro Crew launches every session as ``kiro-cli acp ...`` (see + ``acp.client`` / ``acp.runtime``). A CLI too old to have that subcommand + runs fine and signs in fine, then fails at session-create with an opaque + ``process exited (rc=None)`` — the same class of silent, hard-to-place + failure the rest of this module exists to turn into an actionable card. + ``acp --help`` is the read-only way to ask: a CLI that HAS the subcommand + exits 0 and prints its help, one that lacks it exits nonzero with an + "unknown subcommand" line (kiro-cli is a clap CLI). + + The verdict is deliberately conservative in ONE direction. A timeout, a + sandbox refusal, or any nonzero exit whose text is not a recognized + rejection is treated as SUPPORTED, so a probe that merely failed to run + never blocks a working, up-to-date install behind an update card it does + not need. The cost is that a genuinely-too-old CLI whose rejection wording + is unrecognized would slip through here — but that install then fails at + session-create with the pre-existing error, i.e. no worse than before this + check existed, whereas a false positive would strand a healthy install. + + A spawn, so it belongs to the probe's boot-and-explicit-action budget and + is gated on a successful ``whoami`` by the caller, matching the spec + acceptance probe. + """ + + result = await self._audited_probe( + "probe_acp_support", + executable, + [_ACP_SUBCOMMAND, "--help"], + ) + if result.ok: + return True + # A probe that could not even run (sandbox refusal, timeout, spawn error) + # is not evidence the subcommand is missing. Only a clean rejection counts. + if result.timed_out or result.sandbox_failure is not None: + return True + haystack = (result.output or "").lower() + return not any(marker in haystack for marker in _ACP_UNSUPPORTED_MARKERS) + + async def update_cli(self, caller: str = "") -> dict[str, Any]: + """Run the CLI's own in-place self-update, then return a fresh snapshot. + + The Update button's action, behind an owner-gated POST so the spawn is + origin-checked and audited. This is the ONE place this module runs a Kiro + CLI subcommand that is not a read-only probe — justified because + ``kiro-cli update`` is the CLI updating ITSELF in place (the same command + the auto-update path in ``slack/gateway.py`` already runs unattended), not + a remote installer script or a credential-writing flow, so it adds no new + privileged surface. It is offered only to remedy a too-old CLI that lacks + the ``acp`` subcommand. + + Returns a snapshot with ``cli_update_error`` set — empty on success. The + error is returned rather than raised so the gate can render it in place, + the same contract as ``repair_agent_specs``. Runs to completion within the + request (bounded by :data:`_UPDATE_TIMEOUT_SECS`); a re-probe follows so a + successful update clears the card instead of leaving stale state up. + """ + + del caller # the SEL record is written by the route's audit middleware + if self._assume_ready: + # A test / offline gateway asserts its own readiness and has no real + # CLI to update; running an update there is meaningless. + result = await self._agent_spec_overlay(self._snapshot_dict()) + result["cli_update_error"] = "" + return result + # Resolve the binary the way the probe does, off-loop. + probe_environment, candidates = await asyncio.to_thread( + _probe_filesystem_state, + self._platform, + self._home, + self._environ, + ) + executable = candidates[0] if candidates else "" + error = "" + if not executable: + error = "Kiro CLI could not be found to update." + else: + # The resolved binary is UNVERIFIED (candidates[0] is whatever sits + # first on PATH; an agent that can plant ~/.local/bin/kiro-cli would + # otherwise have it run against the real home). Run it under the + # strict sandbox — the same posture verification uses for an + # unverified candidate — so ~/.aws / ~/.ssh stay hidden even though + # the owner clicked Update. Network reach for the self-update comes + # from the proxy keys (which govern egress), NOT from the standard + # sandbox's real-home exposure; the identity credential is + # deliberately omitted because `update` fetches a binary, it does + # not authenticate. + update_environment = dict(probe_environment) + update_environment.update( + _allowlisted_env(self._environ, _IDENTITY_PROXY_ENV_KEYS) + ) + await self._audit( + action="update_cli", + outcome="invoked", + caller="gateway-setup", + critical=True, + ) + try: + update = await self._run( + executable, + ["update"], + env=update_environment, + timeout_secs=_UPDATE_TIMEOUT_SECS, + sandbox_mode=_UNVERIFIED_SANDBOX_MODE, + # _hidden_probe_dirs (not _crew_hidden_dirs) so the unverified + # binary cannot read the Kiro identity token store either — the + # same isolation the read-only probe applies. `update` fetches a + # binary; it has no need for the on-disk identity credential. + extra_hidden_dirs=self._hidden_probe_dirs, + ) + except asyncio.CancelledError: + await self._set_terminal_audit( + "update_cli", "failed", "gateway-setup", "cancelled" + ) + raise + except Exception as exc: + logger.warning("kiro-cli update failed to run", exc_info=True) + await self._set_terminal_audit( + "update_cli", "failed", "gateway-setup", "update execution failed" + ) + error = _sanitize_detail(f"{type(exc).__name__}: {exc}") + else: + if update.timed_out: + error = ( + "kiro-cli update did not finish in time. Run " + f"`{KIRO_CLI_UPDATE_COMMAND}` on the gateway host directly." + ) + elif not update.ok: + error = _sanitize_detail( + (update.output or "").strip() + or f"kiro-cli update exited with code {update.returncode}" + ) + await self._set_terminal_audit( + "update_cli", + "completed" if update.ok and not error else "failed", + "gateway-setup", + ( + "" + if update.ok and not error + else "timeout" if update.timed_out else "nonzero exit" + ), + ) + if not error: + # Re-probe so a successful update flips ``acp_supported`` / ``ready`` + # and the card clears. Explicit-action half of the probe budget. + try: + await self._probe(force=True) + except Exception: # noqa: BLE001 — stale state beats a 500 + logger.warning("Re-probe after kiro-cli update failed", exc_info=True) + result = await self._agent_spec_overlay(self._snapshot_dict()) + if not error and not result.get("acp_supported", True): + error = ( + "The update ran but this kiro-cli still has no `acp` command. " + f"Update it manually with `{KIRO_CLI_UPDATE_COMMAND}` on the " + "gateway host, or reinstall from the setup page." + ) + result["cli_update_error"] = error + return result + async def _audited_probe( self, action: str, diff --git a/src/kiro_crew/testing/fake_acp_backend.py b/src/kiro_crew/testing/fake_acp_backend.py index 94c114f3958..84aa9f41d98 100755 --- a/src/kiro_crew/testing/fake_acp_backend.py +++ b/src/kiro_crew/testing/fake_acp_backend.py @@ -453,6 +453,14 @@ def main() -> None: if args == ["whoami"]: print(FAKE_IDENTITY) return + if args == ["acp", "--help"]: + # The readiness probe runs this to confirm the `acp` subcommand exists + # (kiro_prerequisite._probe_acp_support). Answer success so the offline + # gateway clears the acp-support gate exactly as a real, current kiro-cli + # would; the real ACP session still drives the protocol over stdio when + # invoked as `acp` with no `--help`. + print("Usage: kiro-cli acp [OPTIONS]") + return # Read on a daemon thread so _handle can poll _INBOX for a session/cancel # that arrives WHILE a prompt is streaming. select() on stdin is not an # option: the backend suite also runs on Windows. diff --git a/test/test_kiro_prerequisite.py b/test/test_kiro_prerequisite.py index 6c396e9acec..351882cff7a 100644 --- a/test/test_kiro_prerequisite.py +++ b/test/test_kiro_prerequisite.py @@ -37,12 +37,14 @@ from kiro_crew.dashboard.handlers.kiro_prerequisite import ( api_kiro_prerequisite_repair_specs, api_kiro_prerequisite_status, + api_kiro_prerequisite_update_cli, ) from kiro_crew.dashboard.kiro_readiness import kiro_session_ready from kiro_crew.kiro_cli import resolve_kiro_cli from kiro_crew.kiro_prerequisite import ( KIRO_CLI_LOGIN_COMMAND, KIRO_CLI_SSO_LOGIN_COMMAND, + KIRO_CLI_UPDATE_COMMAND, OFFICIAL_INSTALL_DOCS_URL, KiroPrerequisiteService, PrerequisiteStatus, @@ -86,6 +88,11 @@ def __init__(self, executable: Path) -> None: self.executable = executable self.installed = executable.exists() self.authenticated = False + # Whether this fake CLI exposes the `acp` subcommand the readiness probe + # now checks with `acp --help`. Defaults True so an authenticated fake is + # `ready` exactly as before this probe existed; a test that exercises the + # too-old path flips it to False. + self.acp_supported = True self.calls: list[tuple[str, list[str]]] = [] self.kwargs: list[dict[str, Any]] = [] @@ -101,6 +108,14 @@ async def run( return ProcessResult(ok=self.installed) if args == ["whoami"]: return ProcessResult(ok=self.authenticated) + if args == ["acp", "--help"]: + if self.acp_supported: + return ProcessResult(ok=True, output="Usage: kiro-cli acp [OPTIONS]") + return ProcessResult( + ok=False, + returncode=2, + output="error: unrecognized subcommand 'acp'", + ) return ProcessResult(ok=False) @@ -609,6 +624,7 @@ async def run(command: str, args: list[str], **_kwargs: Any) -> ProcessResult: assert calls == [ (str(executable), ["--version"]), (str(executable), ["whoami"]), + (str(executable), ["acp", "--help"]), ] def test_windows_candidates_include_inherited_path( @@ -984,6 +1000,8 @@ async def run( ) -> ProcessResult: if args == ["--version"]: return ProcessResult(ok=True) + if args == ["acp", "--help"]: + return ProcessResult(ok=True, output="Usage: kiro-cli acp") home = kwargs["env"]["HOME"] whoami_calls.append(home) # Signed-out under a rewritten HOME, signed-in against the real home. @@ -2265,6 +2283,7 @@ async def run(command: str, args: list[str], **_kwargs: Any) -> ProcessResult: assert calls == [ (str(planted), ["--version"]), (str(planted), ["whoami"]), + (str(planted), ["acp", "--help"]), ] @pytest.mark.asyncio @@ -2304,6 +2323,7 @@ async def run(command: str, args: list[str], **_kwargs: Any) -> ProcessResult: assert calls == [ (str(planted), ["--version"]), (str(planted), ["whoami"]), + (str(planted), ["acp", "--help"]), ] @pytest.mark.asyncio @@ -2339,6 +2359,7 @@ async def run(command: str, args: list[str], **_kwargs: Any) -> ProcessResult: assert calls == [ (str(official), ["--version"]), (str(official), ["whoami"]), + (str(official), ["acp", "--help"]), ] @pytest.mark.asyncio @@ -3441,6 +3462,10 @@ async def identity( "/api/kiro-prerequisite/repair-specs", api_kiro_prerequisite_repair_specs, ) + app.router.add_post( + "/api/kiro-prerequisite/update-cli", + api_kiro_prerequisite_update_cli, + ) return app @pytest.mark.asyncio @@ -3489,6 +3514,51 @@ async def fake_snapshot( assert (await client.post("/api/kiro-prerequisite/login")).status == 404 assert (await client.post("/api/kiro-prerequisite/install")).status == 404 + @pytest.mark.asyncio + async def test_owner_update_cli_runs_self_update_and_returns_snapshot( + self, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + ) -> None: + # The owner may POST update-cli to run the CLI's in-place self-update. + # The handler awaits the service, then returns the post-update snapshot + # (cli_update_error empty on success) with setup_allowed for the owner. + service = KiroPrerequisiteService( + platform_name="linux", + environ={"HOME": str(tmp_path), "PATH": ""}, + home=tmp_path, + audit_writer=_no_audit, + ) + + called_with: list[str] = [] + + async def fake_update_cli(caller: str) -> dict[str, Any]: + called_with.append(caller) + return { + "platform": "Linux", + "installed": True, + "authenticated": True, + "ready": True, + "acp_supported": True, + "update_command": KIRO_CLI_UPDATE_COMMAND, + "cli_update_error": "", + } + + monkeypatch.setattr(service, "update_cli", fake_update_cli) + + async with TestClient(TestServer(self._app(service, app_claim=""))) as client: + resp = await client.post("/api/kiro-prerequisite/update-cli") + assert resp.status == 200 + body = await resp.json() + + # The success path re-probes and reports acp support restored with no + # update error, and the owner branch stamps setup_allowed. + assert body["acp_supported"] is True + assert body["cli_update_error"] == "" + assert body["setup_allowed"] is True + # The handler forwards the resolved caller identity to the service. + assert called_with == ["test-user"] + @pytest.mark.asyncio async def test_status_endpoint_returns_not_ready_instead_of_500_on_probe_error( self, @@ -3910,6 +3980,7 @@ async def test_app_token_is_denied_even_with_route_access( for method, path in ( ("get", "/api/kiro-prerequisite"), ("post", "/api/kiro-prerequisite/repair-specs"), + ("post", "/api/kiro-prerequisite/update-cli"), ): response = await getattr(client, method)(path) assert response.status == 403 @@ -3984,9 +4055,11 @@ async def ready_snapshot( assert body["operation"]["status"] == "idle" # The repair route is a mutation on the agent home, so it is - # owner-gated. It is also the ONLY mutation left on this surface. + # owner-gated. The update-cli route spawns the CLI's self-update, an + # equally owner-only host mutation. for method, path in ( ("post", "/api/kiro-prerequisite/repair-specs"), + ("post", "/api/kiro-prerequisite/update-cli"), ): response = await getattr(client, method)(path) assert response.status == 403 @@ -4665,8 +4738,13 @@ async def test_simultaneous_auto_polls_collapse_to_one_probe( *(service.snapshot(force=True, coalesce=True) for _ in range(6)) ) - # Exactly one probe's worth of spawns: --version then whoami. - assert [args for _, args in runtime.calls] == [["--version"], ["whoami"]] + # Exactly one probe's worth of spawns: --version, whoami, then the + # acp-subcommand support check. + assert [args for _, args in runtime.calls] == [ + ["--version"], + ["whoami"], + ["acp", "--help"], + ] def test_status_names_the_command_the_user_runs(self) -> None: # The UI needs the command to show, and the user runs it themselves. @@ -5862,3 +5940,221 @@ async def run( assert status["installed"] is True assert status["authenticated"] is False assert status["ready"] is False + + +class TestAcpSubcommandSupportNarrowsReadiness: + """A signed-in CLI too old for the `acp` subcommand cannot start a session. + + It runs and authenticates, so the pre-existing probes both pass — but every + session launches as `kiro-cli acp ...`, so a CLI without that subcommand + fails at session-create with an opaque error. The readiness probe therefore + asks `acp --help` and narrows `ready` when the subcommand is unknown, with + an UPDATE (not a reinstall) as the remedy. + """ + + def _service( + self, + tmp_path: Path, + runner: Any, + ) -> KiroPrerequisiteService: + executable = tmp_path / ".local" / "bin" / "kiro-cli" + _make_executable(executable) + return KiroPrerequisiteService( + platform_name="linux", + environ={"HOME": str(tmp_path), "PATH": str(executable.parent)}, + home=tmp_path, + data_home=tmp_path / "data-home", + process_runner=runner, + audit_writer=_no_audit, + ) + + @pytest.mark.asyncio + async def test_unknown_acp_subcommand_narrows_ready(self, tmp_path: Path) -> None: + async def run(_command: str, args: list[str], **_kwargs: Any) -> ProcessResult: + if args == ["--version"]: + return ProcessResult(ok=True) + if args == ["whoami"]: + return ProcessResult(ok=True) + if args == ["acp", "--help"]: + # A clap CLI too old to have the subcommand exits nonzero here. + return ProcessResult( + ok=False, + returncode=2, + output="error: unrecognized subcommand 'acp'", + ) + return ProcessResult(ok=False) + + status = await self._service(tmp_path, run).snapshot(force=True) + + # Installed and authenticated, but not ready: the acp subcommand is the + # missing piece, and its remedy is an update. + assert status["installed"] is True + assert status["authenticated"] is True + assert status["acp_supported"] is False + assert status["ready"] is False + assert status["update_command"] == KIRO_CLI_UPDATE_COMMAND + + @pytest.mark.asyncio + async def test_present_acp_subcommand_is_ready(self, tmp_path: Path) -> None: + async def run(_command: str, args: list[str], **_kwargs: Any) -> ProcessResult: + if args == ["acp", "--help"]: + return ProcessResult(ok=True, output="Usage: kiro-cli acp [OPTIONS]") + return ProcessResult(ok=True) + + status = await self._service(tmp_path, run).snapshot(force=True) + + assert status["acp_supported"] is True + assert status["ready"] is True + + @pytest.mark.asyncio + async def test_probe_that_cannot_run_is_treated_as_supported( + self, tmp_path: Path + ) -> None: + """A timeout or unrecognized failure must NOT be reported as too-old. + + Only a clean "unknown subcommand" rejection sets acp_supported False; a + probe that merely failed to run leaves a healthy install ready rather + than blocking it behind an update card it does not need. + """ + + async def run(_command: str, args: list[str], **_kwargs: Any) -> ProcessResult: + if args == ["acp", "--help"]: + # Failed, but with no recognizable rejection wording (e.g. a + # transient spawn error captured as generic text). + return ProcessResult(ok=False, returncode=1, output="some unrelated error") + return ProcessResult(ok=True) + + status = await self._service(tmp_path, run).snapshot(force=True) + + assert status["acp_supported"] is True + assert status["ready"] is True + + @pytest.mark.asyncio + async def test_acp_probe_is_gated_on_a_successful_whoami(self, tmp_path: Path) -> None: + """A signed-out CLI is not asked about acp — one fault, one card.""" + acp_probed = False + + async def run(_command: str, args: list[str], **_kwargs: Any) -> ProcessResult: + nonlocal acp_probed + if args == ["--version"]: + return ProcessResult(ok=True) + if args == ["whoami"]: + return ProcessResult(ok=False) + if args == ["acp", "--help"]: + acp_probed = True + return ProcessResult(ok=False) + + status = await self._service(tmp_path, run).snapshot(force=True) + + assert status["authenticated"] is False + assert acp_probed is False + # acp_supported stays at its safe default when the probe never ran. + assert status["acp_supported"] is True + + @pytest.mark.asyncio + async def test_update_cli_runs_the_self_update_and_reprobes( + self, tmp_path: Path + ) -> None: + """A successful `kiro-cli update` flips acp_supported and clears ready.""" + acp_ok = {"value": False} + + async def run(_command: str, args: list[str], **_kwargs: Any) -> ProcessResult: + if args == ["--version"] or args == ["whoami"]: + return ProcessResult(ok=True) + if args == ["acp", "--help"]: + if acp_ok["value"]: + return ProcessResult(ok=True, output="Usage: kiro-cli acp") + return ProcessResult(ok=False, returncode=2, output="unrecognized subcommand 'acp'") + if args == ["update"]: + # The update makes the next acp probe succeed. + acp_ok["value"] = True + return ProcessResult(ok=True, output="updated") + return ProcessResult(ok=False) + + service = self._service(tmp_path, run) + before = await service.snapshot(force=True) + assert before["acp_supported"] is False and before["ready"] is False + + after = await service.update_cli("owner") + + assert after["cli_update_error"] == "" + assert after["acp_supported"] is True + assert after["ready"] is True + + @pytest.mark.asyncio + async def test_update_cli_reports_a_nonzero_update_failure( + self, tmp_path: Path + ) -> None: + """A failed update surfaces its output as cli_update_error, not a crash.""" + + async def run(_command: str, args: list[str], **_kwargs: Any) -> ProcessResult: + if args == ["--version"] or args == ["whoami"]: + return ProcessResult(ok=True) + if args == ["acp", "--help"]: + return ProcessResult(ok=False, returncode=2, output="unrecognized subcommand 'acp'") + if args == ["update"]: + return ProcessResult( + ok=False, returncode=1, output="update failed: network unreachable" + ) + return ProcessResult(ok=False) + + service = self._service(tmp_path, run) + # The gate probes and finds acp unsupported before offering the update. + before = await service.snapshot(force=True) + assert before["acp_supported"] is False + result = await service.update_cli("owner") + + assert "network unreachable" in result["cli_update_error"] + # Still not ready — the update did not fix anything. + assert result["acp_supported"] is False + + @pytest.mark.asyncio + async def test_update_cli_runs_unverified_binary_under_strict_sandbox( + self, tmp_path: Path + ) -> None: + """The self-update spawn hardens against a planted binary. + + ``candidates[0]`` is whatever sits first on PATH, so the update must run + under the strict sandbox (``~/.aws`` / ``~/.ssh`` hidden) — not the + standard, real-home posture — and must forward proxy config for network + reach WITHOUT handing the unverified binary the Kiro identity credential. + """ + seen: dict[str, Any] = {} + + async def run(_command: str, args: list[str], **kwargs: Any) -> ProcessResult: + if args == ["--version"] or args == ["whoami"]: + return ProcessResult(ok=True) + if args == ["acp", "--help"]: + return ProcessResult( + ok=False, returncode=2, output="unrecognized subcommand 'acp'" + ) + if args == ["update"]: + seen.update(kwargs) + return ProcessResult(ok=True, output="updated") + return ProcessResult(ok=False) + + executable = tmp_path / ".local" / "bin" / "kiro-cli" + _make_executable(executable) + service = KiroPrerequisiteService( + platform_name="linux", + environ={ + "HOME": str(tmp_path), + "PATH": str(executable.parent), + "HTTPS_PROXY": "http://proxy.example:8080", + prerequisite_module.CRED_KIRO_API_KEY: "secret-token", + }, + home=tmp_path, + data_home=tmp_path / "data-home", + process_runner=run, + audit_writer=_no_audit, + ) + await service.snapshot(force=True) + await service.update_cli("owner") + + assert seen.get("sandbox_mode") == prerequisite_module._UNVERIFIED_SANDBOX_MODE + # The identity token store must be hidden from the unverified binary too — + # same isolation the read-only probe applies, not the weaker crew-only set. + assert seen.get("extra_hidden_dirs") == service._hidden_probe_dirs + env = seen.get("env") or {} + assert env.get("HTTPS_PROXY") == "http://proxy.example:8080" + assert prerequisite_module.CRED_KIRO_API_KEY not in env diff --git a/website/src/api/client.ts b/website/src/api/client.ts index 39f1627cf5a..b586eca9eca 100644 --- a/website/src/api/client.ts +++ b/website/src/api/client.ts @@ -1793,6 +1793,26 @@ export interface KiroPrerequisiteStatus { * verbatim and untranslated: it names the file and the construct refused. */ agent_spec_rejection_detail?: string + /** + * Whether the installed kiro-cli exposes the `acp` subcommand every Kiro Crew + * session is launched through. False means the CLI runs and is signed in but + * is too OLD to start a session, so `ready` is forced false. The remedy is an + * update, not a reinstall. Optional because a gateway older than this field + * does not send it — treat a missing value as `true` (supported). + */ + acp_supported?: boolean + /** + * The command that updates the CLI in place (`kiro-cli update`). Unlike + * `login_command`, Kiro Crew also runs this FOR the owner via the update-cli + * POST — it is the CLI's own self-update. Rendered verbatim in a ``. + */ + update_command?: string + /** + * Failure text from an update-cli attempt. Empty when none was attempted or it + * succeeded. Shown verbatim and untranslated: it names why the self-update did + * not complete. + */ + cli_update_error?: string } export interface KiroBonusCreditGrantPayload { @@ -2158,6 +2178,11 @@ export const api = { // cross-site triggerable and would leave no audit record. repairKiroPrerequisiteSpecs: () => post('/api/kiro-prerequisite/repair-specs').then(j) as Promise, + // A POST for the same CSRF/audit reasons as the spec repair above. Runs the + // CLI's own in-place self-update on the gateway host and returns the + // post-update snapshot; `cli_update_error` is empty on success. + updateKiroPrerequisiteCli: () => + post('/api/kiro-prerequisite/update-cli').then(j) as Promise, // KAS-mode in-product sign-in (no kiro-cli, no terminal). Status is a cheap // read; every step that changes sign-in state is a POST for the same // CSRF/audit reasons as the spec repair above. Error responses carry a diff --git a/website/src/components/KiroPrerequisiteGate.tsx b/website/src/components/KiroPrerequisiteGate.tsx index e2374fc523a..ac3b04eb63e 100644 --- a/website/src/components/KiroPrerequisiteGate.tsx +++ b/website/src/components/KiroPrerequisiteGate.tsx @@ -6,6 +6,7 @@ import { Check, CheckCircle2, Copy, + Download, ExternalLink, LogIn, Package, @@ -513,6 +514,90 @@ function SandboxUnavailable({ ) } +function CliOutdated({ + updateCommand, + updateError, + updating, + retrying, + onUpdate, + onRetry, +}: { + updateCommand: string + updateError: string + updating: boolean + retrying: boolean + onUpdate: () => void + onRetry: () => void +}) { + // The CLI is installed and signed in, but too old to expose the `acp` + // subcommand Kiro Crew launches every session through — so it would fail at + // session-create rather than here. The remedy is an UPDATE in place, not a + // reinstall, and unlike the install/sign-in steps Kiro Crew CAN run this one + // for the user (it is the CLI's own self-update). We therefore offer a button + // that runs it AND show the command for anyone who would rather run it on the + // host themselves. + return ( + + + + {updating + ? i18nT('components.kiroPrerequisiteGate.updating_kiro_cli') + : i18nT('components.kiroPrerequisiteGate.update_kiro_cli')} + + + + {i18nT('components.kiroPrerequisiteGate.check_again')} + + + } + > + <> +
+ +
+

+ {i18nT('components.kiroPrerequisiteGate.kiro_cli_update_needed')} +

+

+ {i18nT('components.kiroPrerequisiteGate.your_kiro_cli_is_out_of_date')} +

+

+ {i18nT('components.kiroPrerequisiteGate.kiro_cli_is_installed_and_signed_in_but_too_old')} +

+ {/* Kiro Crew runs the update for the user via the button below, but the + command is shown too — some hosts prefer to run it themselves, and it + is the one thing a support conversation needs. Verbatim in a , + never a catalog value: a translated command cannot be run. */} +
+

+ {i18nT('components.kiroPrerequisiteGate.update_command_label')} +

+ + {updateCommand} + +
+ {/* Verbatim and untranslated: it names why the self-update did not + complete. role="alert" because it appears in place after the button + press with no route change. */} + {updateError ? ( +
+

+ {i18nT('components.kiroPrerequisiteGate.the_update_attempt_failed')} +

+
+              {updateError}
+            
+
+ ) : null} + +
+ ) +} + function AgentSpecsMissing({ specs, repairError, @@ -717,6 +802,13 @@ export default function KiroPrerequisiteGate({ children }: { children: ReactNode mutationFn: api.repairKiroPrerequisiteSpecs, onSuccess: updateStatus, }) + // Same POST rationale as the repair above. This one runs `kiro-cli update` on + // the host to remedy a CLI too old for the `acp` subcommand; its response is + // the post-update snapshot, so it seeds the cache directly. + const updateCliMutation = useMutation({ + mutationFn: api.updateKiroPrerequisiteCli, + onSuccess: updateStatus, + }) // Remember that this gateway has completed first-run setup, so a later COLD // load can classify the user before (or without) a successful status @@ -827,6 +919,31 @@ export default function KiroPrerequisiteGate({ children }: { children: ReactNode /> ) } + // Present, signed in, but too OLD to expose the `acp` subcommand every session + // launches through — so it runs and authenticates yet cannot start a single + // turn (it would fail at session-create). `acp_supported === false` is a FRESH + // probe result, not a latch (a `false` default would hide the state on an older + // gateway that omits the field, so the strict `=== false` is deliberate), so it + // is safe to surface even on an established install — and its remedy is unique: + // update the CLI in place, which Kiro Crew runs for the user here. Ordered + // BEFORE the established-install bail-out for the same reason as the spec + // branches: this is a total failure the chat error card cannot pre-empt, and + // this screen is the only place that offers the update. + const updateError = updateCliMutation.data?.cli_update_error + || (updateCliMutation.error ? asSentence(updateCliMutation.error.message) : '') + || (status.cli_update_error ?? '') + if (status.acp_supported === false) { + return ( + updateCliMutation.mutate()} + onRetry={retryStatus} + /> + ) + } // Established install, signed out: render NOTHING and pause nothing. The user // is not guided to sign in — the chat error card carries that, in context, // only when they actually try to use the agent. A persistent banner nagged diff --git a/website/src/i18n/locales/bn.json b/website/src/i18n/locales/bn.json index 2e44cd7e37a..c621b0001a1 100644 --- a/website/src/i18n/locales/bn.json +++ b/website/src/i18n/locales/bn.json @@ -6102,10 +6102,12 @@ "if_you_are_diagnosing_this_from_a_terminal_kiro": "আপনি যদি টার্মিনাল থেকে এটি নির্ণয় করছেন, তবে মনে রাখবেন যে Kiro CLI অ্যাপটি নিজে চালু না থাকা পর্যন্ত kiro-cli diagnostic কিছুই জানায় না — প্রথমে kiro-cli launch দিয়ে এটি চালু করুন। ওই প্রত্যাখ্যান এটির কারণ নয়।", "install_kiro_cli_from_kiros_official_setup_page": "Kiro-এর অফিশিয়াল সেটআপ পেজ থেকে Kiro CLI ইনস্টল করুন। সেখানে আপনার প্ল্যাটফর্মের ধাপগুলো আছে এবং তা সর্বদা হালনাগাদ থাকে।", "install_kiro_cli_sign_in_once_and_kiro_crew_will": "Kiro CLI ইনস্টল করুন, একবার সাইন ইন করুন, বাকিটা {{productName}} সামলে নেবে।", + "kiro_cli_is_installed_and_signed_in_but_too_old": "Kiro CLI ইনস্টল করা এবং সাইন ইন করা আছে, তবে এই সংস্করণটি সেই acp কমান্ডের চেয়ে পুরনো যা দিয়ে {{productName}} প্রতিটি সেশন চালায়। এটি আপডেট করুন এবং এই পৃষ্ঠাটি নিজে থেকেই এগিয়ে যাবে।", "kiro_cli_is_installed_but_could_not_be_verified": "Kiro CLI ইনস্টল করা আছে, কিন্তু এটি যাচাই করা যায়নি", "kiro_cli_is_installed_finish_signing_in_to_conti": "Kiro CLI ইনস্টল করা আছে। চালিয়ে যেতে সাইন-ইন শেষ করো।", "kiro_cli_is_required_on_the_gateway_host": "{{platform}} গেটওয়ে হোস্টে Kiro CLI প্রয়োজন।", "kiro_cli_s_reason": "কেন প্রত্যাখ্যান হয়েছে", + "kiro_cli_update_needed": "Kiro CLI আপডেট প্রয়োজন", "kiro_cli_was_found_on_this_host": "এই হোস্টে Kiro CLI পাওয়া গেছে।", "kiro_cli_will_not_load_kiro_crew_s_agent_specs": "Kiro CLI, {{productName}}-এর এজেন্ট স্পেসিফিকেশন লোড করবে না", "kiro_crew_installs_the_agent_specs_kiro_cli_load": "{{productName}} এজেন্ট স্পেকগুলো ইনস্টল করে, যেগুলো Kiro CLI কোনো উত্তর দেওয়ার আগে লোড করে।", @@ -6150,15 +6152,21 @@ "the_gateway_returned_an_unexpected_error": "গেটওয়ে একটি অপ্রত্যাশিত ত্রুটি ফেরত দিয়েছে।", "the_gateway_returned_no_prerequisite_status": "গেটওয়ে কোনো প্রি-রিকুইজিট অবস্থা ফেরত দেয়নি।", "the_repair_attempt_failed": "মেরামতের চেষ্টা ব্যর্থ হয়েছে", + "the_update_attempt_failed": "আপডেটের চেষ্টা ব্যর্থ হয়েছে", "then_the_dashboard_will_open_automatically": ", তারপর\n ড্যাশবোর্ড স্বয়ংক্রিয়ভাবে খুলে যাবে।", "this_host_allows_user_namespaces_but_the_kernel_d": "এই হোস্ট ইউজার নেমস্পেস অনুমোদন করে, কিন্তু কার্নেল এরপর মাউন্ট নেমস্পেস প্রত্যাখ্যান করেছে — এটি Ubuntu 23.10 ও তার পরের সংস্করণের বৈশিষ্ট্য, যা ইউজার নেমস্পেস তৈরি করা যেকোনো প্রসেসকে একটি সীমাবদ্ধ AppArmor প্রোফাইলে সরিয়ে দেয়। {{productName}} আপনার ক্রেডেনশিয়াল প্রকাশ করার বদলে এজেন্টকে বিচ্ছিন্নতা ছাড়া চালাতে অস্বীকার করে, তাই প্রোফাইলটি বসানো পর্যন্ত এটি আটকে থাকবে।", "this_host_provides_no_os_level_sandbox_so_kiro_c": "এই হোস্ট অপারেটিং সিস্টেম স্তরের কোনও স্যান্ডবক্স দেয় না, তাই {{productName}} এজেন্টকে বিচ্ছিন্ন রাখতে পারে না। আপনার ক্রেডেনশিয়াল প্রকাশ করার বদলে এটি স্যান্ডবক্স ছাড়া এজেন্ট চালাতে অস্বীকার করে।", "this_kiro_cli_is_signed_in": "এই Kiro CLI সাইন ইন করা আছে।", + "this_kiro_cli_is_too_old_for_the_acp_command": "এই Kiro CLI {{productName}}-এর প্রয়োজনীয় acp কমান্ডের জন্য অত্যন্ত পুরনো। এখানে এটি আপডেট করুন।", "this_page_detects_kiro_cli_automatically": "এই পেজটি খোলা রাখুন। এটি গেটওয়ে হোস্ট পরীক্ষা করে এবং Kiro CLI ইনস্টল হয়ে গেলে নিজেই এগিয়ে যায়।", "try_again": "আবার চেষ্টা করুন", + "update_command_label": "আপডেট কমান্ড", + "update_kiro_cli": "Kiro CLI আপডেট করুন", + "updating_kiro_cli": "Kiro CLI আপডেট করা হচ্ছে…", "waiting": "অপেক্ষমাণ", "we_could_not_check_kiro_cli": "আমরা Kiro CLI পরীক্ষা করতে পারিনি।", - "your_crew_is_almost_ready": "আপনার ক্রু প্রায় প্রস্তুত।" + "your_crew_is_almost_ready": "আপনার ক্রু প্রায় প্রস্তুত।", + "your_kiro_cli_is_out_of_date": "আপনার Kiro CLI পুরনো হয়ে গেছে" }, "linkPreview": { "copied": "কপি করা হয়েছে", diff --git a/website/src/i18n/locales/de.json b/website/src/i18n/locales/de.json index b7cc76cbfb7..620e70807d5 100644 --- a/website/src/i18n/locales/de.json +++ b/website/src/i18n/locales/de.json @@ -6102,10 +6102,12 @@ "if_you_are_diagnosing_this_from_a_terminal_kiro": "Falls Sie dies über ein Terminal untersuchen: kiro-cli diagnostic meldet nichts, solange die Kiro CLI App selbst nicht läuft — starten Sie sie zuerst mit kiro-cli launch. Diese Verweigerung ist nicht die Ursache hierfür.", "install_kiro_cli_from_kiros_official_setup_page": "Installieren Sie Kiro CLI über die offizielle Einrichtungsseite von Kiro. Sie enthält die Schritte für Ihre Plattform und bleibt aktuell.", "install_kiro_cli_sign_in_once_and_kiro_crew_will": "Installieren Sie Kiro CLI, melden Sie sich einmal an, und {{productName}} übernimmt den Rest.", + "kiro_cli_is_installed_and_signed_in_but_too_old": "Kiro CLI ist installiert und angemeldet, aber diese Version ist älter als der acp-Befehl, über den {{productName}} jede Sitzung startet. Aktualisieren Sie es, und diese Seite fährt von selbst fort.", "kiro_cli_is_installed_but_could_not_be_verified": "Kiro CLI ist installiert, konnte aber nicht verifiziert werden", "kiro_cli_is_installed_finish_signing_in_to_conti": "Kiro CLI ist installiert. Schließe die Anmeldung ab, um fortzufahren.", "kiro_cli_is_required_on_the_gateway_host": "Kiro CLI ist auf dem {{platform}}-Gateway-Host erforderlich.", "kiro_cli_s_reason": "Grund der Ablehnung", + "kiro_cli_update_needed": "Kiro-CLI-Update erforderlich", "kiro_cli_was_found_on_this_host": "Kiro CLI wurde auf diesem Host gefunden.", "kiro_cli_will_not_load_kiro_crew_s_agent_specs": "Kiro CLI lädt die Agent-Spezifikationen von {{productName}} nicht", "kiro_crew_installs_the_agent_specs_kiro_cli_load": "{{productName}} installiert die Agent-Spezifikationen, die Kiro CLI lädt, bevor es überhaupt antworten kann.", @@ -6150,15 +6152,21 @@ "the_gateway_returned_an_unexpected_error": "Das Gateway hat einen unerwarteten Fehler zurückgegeben.", "the_gateway_returned_no_prerequisite_status": "Das Gateway hat keinen Status der Voraussetzungen zurückgegeben.", "the_repair_attempt_failed": "Der Reparaturversuch ist fehlgeschlagen", + "the_update_attempt_failed": "Der Update-Versuch ist fehlgeschlagen", "then_the_dashboard_will_open_automatically": ", dann\n öffnet sich das Dashboard automatisch.", "this_host_allows_user_namespaces_but_the_kernel_d": "Dieser Host erlaubt User-Namespaces, aber der Kernel hat anschließend den Mount-Namespace verweigert — das typische Verhalten von Ubuntu 23.10 und neuer, das jeden Prozess, der einen User-Namespace erstellt, in ein eingeschränktes AppArmor-Profil verschiebt. {{productName}} führt den Agenten lieber nicht ohne Isolation aus, als Ihre Anmeldedaten offenzulegen, und bleibt daher blockiert, bis das Profil vorhanden ist.", "this_host_provides_no_os_level_sandbox_so_kiro_c": "Dieser Host bietet keine Sandbox auf Betriebssystemebene, daher kann {{productName}} den Agenten nicht isolieren. Es führt den Agenten lieber nicht ohne Sandbox aus, als Ihre Anmeldedaten offenzulegen.", "this_kiro_cli_is_signed_in": "Diese Kiro CLI ist angemeldet.", + "this_kiro_cli_is_too_old_for_the_acp_command": "Dieses Kiro CLI ist zu alt für den acp-Befehl, den {{productName}} benötigt. Aktualisieren Sie es hier.", "this_page_detects_kiro_cli_automatically": "Lassen Sie diese Seite geöffnet. Sie prüft den Gateway-Host und fährt selbstständig fort, sobald Kiro CLI installiert ist.", "try_again": "Erneut versuchen", + "update_command_label": "Update-Befehl", + "update_kiro_cli": "Kiro CLI aktualisieren", + "updating_kiro_cli": "Kiro CLI wird aktualisiert…", "waiting": "Wartet", "we_could_not_check_kiro_cli": "Wir konnten Kiro CLI nicht prüfen.", - "your_crew_is_almost_ready": "Ihre Crew ist fast bereit." + "your_crew_is_almost_ready": "Ihre Crew ist fast bereit.", + "your_kiro_cli_is_out_of_date": "Ihr Kiro CLI ist veraltet" }, "linkPreview": { "copied": "Kopiert", diff --git a/website/src/i18n/locales/en-XA.json b/website/src/i18n/locales/en-XA.json index 381edfe9afe..6b7b3ed8d0a 100644 --- a/website/src/i18n/locales/en-XA.json +++ b/website/src/i18n/locales/en-XA.json @@ -5812,9 +5812,11 @@ "if_you_are_diagnosing_this_from_a_terminal_kiro": "[̃ ýøù àŕè ðìàğñøşìñğ ţĥìş ƒŕøɱ à ţèŕɱìñàĺ, ñøţè ţĥàţ ķìŕø-çĺì ðìàğñøşţìç ŕèþøŕţş ñøţĥìñğ ùñţìĺ ţĥè Ķìŕø ÇĹÌ àþþ ìţşèĺƒ ìş ŕùññìñğ — ĺàùñçĥ ìţ ẁìţĥ ķìŕø-çĺì ĺàùñçĥ ƒìŕşţ. Ţĥàţ ŕèƒùşàĺ ìş ñøţ ţĥè çàùşè øƒ ţĥìş. ·······························································]", "install_kiro_cli_from_kiros_official_setup_page": "[Ìñşţàĺĺ Ķìŕø ÇĹÌ ƒŕøɱ Ķìŕø'ş øƒƒìçìàĺ şèţùþ þàğè. Ìţ çàŕŕìèş ţĥè şţèþş ƒøŕ ýøùŕ þĺàţƒøŕɱ àñð şţàýş çùŕŕèñţ. ································]", "kiro_cli_is_installed_but_could_not_be_verified": "[Ķìŕø ÇĹÌ ìş ìñşţàĺĺèð ƀùţ çøùĺð ñøţ ƀè ṽèŕìƒìèð ························]", + "kiro_cli_is_installed_and_signed_in_but_too_old": "[Ķìŕø ÇĹÌ ìş ìñşţàĺĺèð àñð şìğñèð ìñ, ƀùţ ţĥìş ṽèŕşìøñ þŕèðàţèş ţĥè àçþ çøɱɱàñð {{productName}} ĺàùñçĥèş èṽèŕý şèşşìøñ ţĥŕøùğĥ. Ùþðàţè ìţ àñð ţĥìş þàğè çøñţìñùèş øñ ìţş øẁñ. ···············································]", "kiro_cli_is_installed_finish_signing_in_to_conti": "[Ķìŕø ÇĹÌ ìş ìñşţàĺĺèð. Ƒìñìşĥ şìğñìñğ ìñ ţø çøñţìñùè. ···················]", "kiro_cli_is_required_on_the_gateway_host": "[Ķìŕø ÇĹÌ ìş ŕèǫùìŕèð øñ ţĥè {{platform}} ğàţèẁàý ĥøşţ. ·····················]", "kiro_cli_s_reason": "[Ẁĥý ìţ ẁàş ŕèƒùşèð ················]", + "kiro_cli_update_needed": "[Ķìŕø ÇĹÌ ùþðàţè ñèèðèð ···············]", "kiro_cli_was_found_on_this_host": "[Ķìŕø ÇĹÌ ẁàş ƒøùñð øñ ţĥìş ĥøşţ. ················]", "kiro_cli_will_not_load_kiro_crew_s_agent_specs": "[Ķìŕø ÇĹÌ ẁìĺĺ ñøţ ĺøàð {{productName}}'ş àğèñţ şþèçş ···················]", "kiro_crew_installs_the_agent_specs_kiro_cli_load": "[{{productName}} ìñşţàĺĺş ţĥè àğèñţ şþèçş Ķìŕø ÇĹÌ ĺøàðş ƀèƒøŕè ìţ çàñ àñşẁèŕ àñýţĥìñğ. ·····················]", @@ -5848,11 +5850,17 @@ "the_gateway_returned_an_unexpected_error": "[Ţĥè ğàţèẁàý ŕèţùŕñèð àñ ùñèẋþèçţèð èŕŕøŕ. ·····················]", "the_gateway_returned_no_prerequisite_status": "[Ţĥè ğàţèẁàý ŕèţùŕñèð ñø þŕèŕèǫùìşìţè şţàţùş. ······················]", "the_repair_attempt_failed": "[Ţĥè ŕèþàìŕ àţţèɱþţ ƒàìĺèð ··················]", + "the_update_attempt_failed": "[Ţĥè ùþðàţè àţţèɱþţ ƒàìĺèð ··················]", "this_host_allows_user_namespaces_but_the_kernel_d": "[Ţĥìş ĥøşţ àĺĺøẁş ùşèŕ ñàɱèşþàçèş, ƀùţ ţĥè ķèŕñèĺ ţĥèñ ðèñìèð ţĥè ɱøùñţ ñàɱèşþàçè — ţĥè şìğñàţùŕè øƒ Ùƀùñţù 23.10 àñð ñèẁèŕ, ẁĥìçĥ ɱøṽèş àñý þŕøçèşş ţĥàţ çŕèàţèş à ùşèŕ ñàɱèşþàçè ìñţø à ŕèşţŕìçţèð ÀþþÀŕɱøŕ þŕøƒìĺè. {{productName}} ŕèƒùşèş ţø ŕùñ ţĥè àğèñţ ùñìşøĺàţèð ŕàţĥèŕ ţĥàñ èẋþøşè ýøùŕ çŕèðèñţìàĺş, şø ìţ şţàýş ƀĺøçķèð ùñţìĺ ţĥè þŕøƒìĺè ìş ìñ þĺàçè. ·····································································································]", "this_host_provides_no_os_level_sandbox_so_kiro_c": "[Ţĥìş ĥøşţ þŕøṽìðèş ñø ØŞ-ĺèṽèĺ şàñðƀøẋ, şø {{productName}} çàññøţ ìşøĺàţè ţĥè àğèñţ. Ìţ ŕèƒùşèş ţø ŕùñ ţĥè àğèñţ ùñşàñðƀøẋèð ŕàţĥèŕ ţĥàñ èẋþøşè ýøùŕ çŕèðèñţìàĺş. ············································]", "this_kiro_cli_is_signed_in": "[Ţĥìş Ķìŕø ÇĹÌ ìş şìğñèð ìñ. ···················]", + "this_kiro_cli_is_too_old_for_the_acp_command": "[Ţĥìş Ķìŕø ÇĹÌ ìş ţøø øĺð ƒøŕ ţĥè àçþ çøɱɱàñð {{productName}} ñèèðş. Ùþðàţè ìţ ĥèŕè. ························]", "this_page_detects_kiro_cli_automatically": "[Ĺèàṽè ţĥìş þàğè øþèñ. Ìţ çĥèçķş ţĥè ğàţèẁàý ĥøşţ àñð çøñţìñùèş øñ ìţş øẁñ øñçè Ķìŕø ÇĹÌ ìş ìñşţàĺĺèð. ······························]", - "waiting": "[Ẁàìţìñğ ···········]" + "update_command_label": "[Ùþðàţè çøɱɱàñð ·············]", + "update_kiro_cli": "[Ùþðàţè Ķìŕø ÇĹÌ ··············]", + "updating_kiro_cli": "[Ùþðàţìñğ Ķìŕø ÇĹÌ… ················]", + "waiting": "[Ẁàìţìñğ ···········]", + "your_kiro_cli_is_out_of_date": "[Ýøùŕ Ķìŕø ÇĹÌ ìş øùţ øƒ ðàţè ····················]" }, "logEntry": { "cancelled": "[Çàñçèĺĺèð ··············]", diff --git a/website/src/i18n/locales/en.manual.json b/website/src/i18n/locales/en.manual.json index 60859907e1b..376a9a1edfd 100644 --- a/website/src/i18n/locales/en.manual.json +++ b/website/src/i18n/locales/en.manual.json @@ -1841,9 +1841,11 @@ "if_you_are_diagnosing_this_from_a_terminal_kiro": "If you are diagnosing this from a terminal, note that kiro-cli diagnostic reports nothing until the Kiro CLI app itself is running — launch it with kiro-cli launch first. That refusal is not the cause of this.", "install_kiro_cli_from_kiros_official_setup_page": "Install Kiro CLI from Kiro's official setup page. It carries the steps for your platform and stays current.", "kiro_cli_is_installed_but_could_not_be_verified": "Kiro CLI is installed but could not be verified", + "kiro_cli_is_installed_and_signed_in_but_too_old": "Kiro CLI is installed and signed in, but this version predates the acp command {{productName}} launches every session through. Update it and this page continues on its own.", "kiro_cli_is_installed_finish_signing_in_to_conti": "Kiro CLI is installed. Finish signing in to continue.", "kiro_cli_is_required_on_the_gateway_host": "Kiro CLI is required on the {{platform}} gateway host.", "kiro_cli_s_reason": "Why it was refused", + "kiro_cli_update_needed": "Kiro CLI update needed", "kiro_cli_was_found_on_this_host": "Kiro CLI was found on this host.", "kiro_cli_will_not_load_kiro_crew_s_agent_specs": "Kiro CLI will not load {{productName}}'s agent specs", "kiro_crew_installs_the_agent_specs_kiro_cli_load": "{{productName}} installs the agent specs Kiro CLI loads before it can answer anything.", @@ -1877,11 +1879,17 @@ "the_gateway_returned_an_unexpected_error": "The gateway returned an unexpected error.", "the_gateway_returned_no_prerequisite_status": "The gateway returned no prerequisite status.", "the_repair_attempt_failed": "The repair attempt failed", + "the_update_attempt_failed": "The update attempt failed", "this_host_allows_user_namespaces_but_the_kernel_d": "This host allows user namespaces, but the kernel then denied the mount namespace — the signature of Ubuntu 23.10 and newer, which moves any process that creates a user namespace into a restricted AppArmor profile. {{productName}} refuses to run the agent unisolated rather than expose your credentials, so it stays blocked until the profile is in place.", "this_host_provides_no_os_level_sandbox_so_kiro_c": "This host provides no OS-level sandbox, so {{productName}} cannot isolate the agent. It refuses to run the agent unsandboxed rather than expose your credentials.", "this_kiro_cli_is_signed_in": "This Kiro CLI is signed in.", + "this_kiro_cli_is_too_old_for_the_acp_command": "This Kiro CLI is too old for the acp command {{productName}} needs. Update it here.", "this_page_detects_kiro_cli_automatically": "Leave this page open. It checks the gateway host and continues on its own once Kiro CLI is installed.", - "waiting": "Waiting" + "update_command_label": "Update command", + "update_kiro_cli": "Update Kiro CLI", + "updating_kiro_cli": "Updating Kiro CLI…", + "waiting": "Waiting", + "your_kiro_cli_is_out_of_date": "Your Kiro CLI is out of date" }, "linkedSurfacesSection": { "connect_failed": "Could not connect to {{label}}: {{reason}}", diff --git a/website/src/i18n/locales/es.json b/website/src/i18n/locales/es.json index 2169e47b5e6..72777b60966 100644 --- a/website/src/i18n/locales/es.json +++ b/website/src/i18n/locales/es.json @@ -6200,10 +6200,12 @@ "if_you_are_diagnosing_this_from_a_terminal_kiro": "Si estás diagnosticando esto desde un terminal, ten en cuenta que kiro-cli diagnostic no informa nada hasta que la propia aplicación Kiro CLI esté en ejecución — iníciala primero con kiro-cli launch. Ese rechazo no es la causa de esto.", "install_kiro_cli_from_kiros_official_setup_page": "Instala Kiro CLI desde la página de configuración oficial de Kiro. Incluye los pasos para tu plataforma y se mantiene actualizada.", "install_kiro_cli_sign_in_once_and_kiro_crew_will": "Instala Kiro CLI, inicia sesión una vez y {{productName}} se encarga del resto.", + "kiro_cli_is_installed_and_signed_in_but_too_old": "Kiro CLI está instalado y con sesión iniciada, pero esta versión es anterior al comando acp que {{productName}} usa en cada sesión. Actualízalo y esta página continuará por sí sola.", "kiro_cli_is_installed_but_could_not_be_verified": "Kiro CLI está instalado, pero no se pudo verificar", "kiro_cli_is_installed_finish_signing_in_to_conti": "Kiro CLI está instalado. Completa el inicio de sesión para continuar.", "kiro_cli_is_required_on_the_gateway_host": "Se requiere Kiro CLI en el host del gateway {{platform}}.", "kiro_cli_s_reason": "Motivo del rechazo", + "kiro_cli_update_needed": "Se necesita actualizar Kiro CLI", "kiro_cli_was_found_on_this_host": "Se encontró Kiro CLI en este host.", "kiro_cli_will_not_load_kiro_crew_s_agent_specs": "Kiro CLI no carga las especificaciones de agente de {{productName}}", "kiro_crew_installs_the_agent_specs_kiro_cli_load": "{{productName}} instala las especificaciones del agente que Kiro CLI carga antes de poder responder nada.", @@ -6248,15 +6250,21 @@ "the_gateway_returned_an_unexpected_error": "El gateway devolvió un error inesperado.", "the_gateway_returned_no_prerequisite_status": "El gateway no devolvió el estado de los requisitos previos.", "the_repair_attempt_failed": "El intento de reparación falló", + "the_update_attempt_failed": "El intento de actualización falló", "then_the_dashboard_will_open_automatically": ", y luego\n el panel se abrirá automáticamente.", "this_host_allows_user_namespaces_but_the_kernel_d": "Este host permite espacios de nombres de usuario, pero el kernel denegó después el espacio de nombres de montaje — la firma de Ubuntu 23.10 y posteriores, que mueve a un perfil de AppArmor restringido cualquier proceso que cree un espacio de nombres de usuario. {{productName}} prefiere no ejecutar el agente sin sandbox antes que exponer tus credenciales, por lo que seguirá bloqueado hasta que el perfil esté en su sitio.", "this_host_provides_no_os_level_sandbox_so_kiro_c": "Este host no ofrece un sandbox a nivel del sistema operativo, por lo que {{productName}} no puede aislar al agente. Prefiere no ejecutar el agente sin sandbox antes que exponer tus credenciales.", "this_kiro_cli_is_signed_in": "Este Kiro CLI tiene la sesión iniciada.", + "this_kiro_cli_is_too_old_for_the_acp_command": "Este Kiro CLI es demasiado antiguo para el comando acp que necesita {{productName}}. Actualízalo aquí.", "this_page_detects_kiro_cli_automatically": "Deja esta página abierta. Comprueba el host del gateway y continúa por su cuenta cuando Kiro CLI esté instalado.", "try_again": "Reintentar", + "update_command_label": "Comando de actualización", + "update_kiro_cli": "Actualizar Kiro CLI", + "updating_kiro_cli": "Actualizando Kiro CLI…", "waiting": "Esperando", "we_could_not_check_kiro_cli": "No pudimos comprobar Kiro CLI.", - "your_crew_is_almost_ready": "Tu crew está casi listo." + "your_crew_is_almost_ready": "Tu crew está casi listo.", + "your_kiro_cli_is_out_of_date": "Tu Kiro CLI está desactualizado" }, "linkPreview": { "copied": "Copiado", diff --git a/website/src/i18n/locales/fr.json b/website/src/i18n/locales/fr.json index 8f426cea483..24be2f72c9c 100644 --- a/website/src/i18n/locales/fr.json +++ b/website/src/i18n/locales/fr.json @@ -6200,10 +6200,12 @@ "if_you_are_diagnosing_this_from_a_terminal_kiro": "Si vous diagnostiquez ce problème depuis un terminal, notez que kiro-cli diagnostic ne signale rien tant que l'application Kiro CLI elle-même n'est pas en cours d'exécution — lancez-la d'abord avec kiro-cli launch. Ce refus n'en est pas la cause.", "install_kiro_cli_from_kiros_official_setup_page": "Installez Kiro CLI depuis la page de configuration officielle de Kiro. Elle contient les étapes adaptées à votre plateforme et reste à jour.", "install_kiro_cli_sign_in_once_and_kiro_crew_will": "Installez Kiro CLI, connectez-vous une fois, et {{productName}} prend le relais.", + "kiro_cli_is_installed_and_signed_in_but_too_old": "Kiro CLI est installé et connecté, mais cette version est antérieure à la commande acp que {{productName}} utilise pour chaque session. Mettez-le à jour et cette page continuera d'elle-même.", "kiro_cli_is_installed_but_could_not_be_verified": "Kiro CLI est installé, mais n'a pas pu être vérifié", "kiro_cli_is_installed_finish_signing_in_to_conti": "Kiro CLI est installé. Termine la connexion pour continuer.", "kiro_cli_is_required_on_the_gateway_host": "Kiro CLI est requis sur l'hôte de la passerelle {{platform}}.", "kiro_cli_s_reason": "Motif du refus", + "kiro_cli_update_needed": "Mise à jour de Kiro CLI requise", "kiro_cli_was_found_on_this_host": "Kiro CLI a été trouvé sur cet hôte.", "kiro_cli_will_not_load_kiro_crew_s_agent_specs": "Kiro CLI ne charge pas les spécifications d'agent de {{productName}}", "kiro_crew_installs_the_agent_specs_kiro_cli_load": "{{productName}} installe les spécifications d'agent que Kiro CLI charge avant de pouvoir répondre à quoi que ce soit.", @@ -6248,15 +6250,21 @@ "the_gateway_returned_an_unexpected_error": "La passerelle a renvoyé une erreur inattendue.", "the_gateway_returned_no_prerequisite_status": "La passerelle n’a renvoyé aucun état de prérequis.", "the_repair_attempt_failed": "La tentative de réparation a échoué", + "the_update_attempt_failed": "La tentative de mise à jour a échoué", "then_the_dashboard_will_open_automatically": ", puis\n le tableau de bord s'ouvrira automatiquement.", "this_host_allows_user_namespaces_but_the_kernel_d": "Cet hôte autorise les espaces de noms utilisateur, mais le noyau a ensuite refusé l'espace de noms de montage — la signature d'Ubuntu 23.10 et des versions ultérieures, qui place tout processus créant un espace de noms utilisateur dans un profil AppArmor restreint. {{productName}} refuse d'exécuter l'agent sans isolation plutôt que d'exposer vos identifiants ; il reste donc bloqué jusqu'à ce que le profil soit en place.", "this_host_provides_no_os_level_sandbox_so_kiro_c": "Cet hôte ne fournit aucun bac à sable au niveau du système d'exploitation, donc {{productName}} ne peut pas isoler l'agent. Il refuse d'exécuter l'agent sans bac à sable plutôt que d'exposer vos identifiants.", "this_kiro_cli_is_signed_in": "Ce Kiro CLI est connecté.", + "this_kiro_cli_is_too_old_for_the_acp_command": "Ce Kiro CLI est trop ancien pour la commande acp dont {{productName}} a besoin. Mettez-le à jour ici.", "this_page_detects_kiro_cli_automatically": "Laissez cette page ouverte. Elle vérifie l'hôte de la passerelle et continue d'elle-même dès que Kiro CLI est installé.", "try_again": "Réessayer", + "update_command_label": "Commande de mise à jour", + "update_kiro_cli": "Mettre à jour Kiro CLI", + "updating_kiro_cli": "Mise à jour de Kiro CLI…", "waiting": "En attente", "we_could_not_check_kiro_cli": "Nous n'avons pas pu vérifier Kiro CLI.", - "your_crew_is_almost_ready": "Votre équipe est presque prête." + "your_crew_is_almost_ready": "Votre équipe est presque prête.", + "your_kiro_cli_is_out_of_date": "Votre Kiro CLI est obsolète" }, "linkPreview": { "copied": "Copié", diff --git a/website/src/i18n/locales/hi.json b/website/src/i18n/locales/hi.json index 01fd18da68b..e3bf5263914 100644 --- a/website/src/i18n/locales/hi.json +++ b/website/src/i18n/locales/hi.json @@ -6102,10 +6102,12 @@ "if_you_are_diagnosing_this_from_a_terminal_kiro": "यदि इसका निदान टर्मिनल से किया जा रहा है, तो ध्यान दें कि kiro-cli diagnostic तब तक कुछ नहीं बताता जब तक Kiro CLI ऐप स्वयं चल न रहा हो — पहले उसे kiro-cli launch से शुरू करें। वह इनकार इसका कारण नहीं है।", "install_kiro_cli_from_kiros_official_setup_page": "Kiro के आधिकारिक सेटअप पेज से Kiro CLI इंस्टॉल करें। उसमें आपके प्लैटफ़ॉर्म के चरण दिए हैं और वह हमेशा अद्यतित रहता है।", "install_kiro_cli_sign_in_once_and_kiro_crew_will": "Kiro CLI इंस्टॉल करें, एक बार साइन इन करें, और आगे का काम {{productName}} संभाल लेगा।", + "kiro_cli_is_installed_and_signed_in_but_too_old": "Kiro CLI इंस्टॉल है और साइन इन है, लेकिन यह संस्करण उस acp कमांड से पुराना है जिसके ज़रिए {{productName}} हर सत्र चलाता है। इसे अपडेट करें और यह पेज स्वयं आगे बढ़ जाएगा।", "kiro_cli_is_installed_but_could_not_be_verified": "Kiro CLI इंस्टॉल है, लेकिन उसे सत्यापित नहीं किया जा सका", "kiro_cli_is_installed_finish_signing_in_to_conti": "Kiro CLI इंस्टॉल है। जारी रखने के लिए साइन-इन पूरा करें।", "kiro_cli_is_required_on_the_gateway_host": "{{platform}} गेटवे होस्ट पर Kiro CLI आवश्यक है।", "kiro_cli_s_reason": "अस्वीकार होने का कारण", + "kiro_cli_update_needed": "Kiro CLI अपडेट आवश्यक", "kiro_cli_was_found_on_this_host": "इस होस्ट पर Kiro CLI मिल गया।", "kiro_cli_will_not_load_kiro_crew_s_agent_specs": "Kiro CLI, {{productName}} के एजेंट स्पेसिफिकेशन लोड नहीं करेगा", "kiro_crew_installs_the_agent_specs_kiro_cli_load": "{{productName}} वे एजेंट स्पेक इंस्टॉल करता है जिन्हें Kiro CLI कुछ भी उत्तर देने से पहले लोड करता है।", @@ -6150,15 +6152,21 @@ "the_gateway_returned_an_unexpected_error": "गेटवे ने एक अनपेक्षित त्रुटि लौटाई।", "the_gateway_returned_no_prerequisite_status": "गेटवे ने कोई पूर्वापेक्षा स्थिति नहीं लौटाई।", "the_repair_attempt_failed": "मरम्मत का प्रयास विफल रहा।", + "the_update_attempt_failed": "अपडेट का प्रयास विफल रहा", "then_the_dashboard_will_open_automatically": ", फिर\n डैशबोर्ड अपने आप खुल जाएगा।", "this_host_allows_user_namespaces_but_the_kernel_d": "यह होस्ट यूज़र नेमस्पेस की अनुमति देता है, लेकिन फिर कर्नेल ने माउंट नेमस्पेस से इनकार कर दिया — यह Ubuntu 23.10 और उसके बाद के संस्करणों की पहचान है, जो यूज़र नेमस्पेस बनाने वाली हर प्रक्रिया को एक सीमित AppArmor प्रोफ़ाइल में डाल देते हैं। {{productName}} तुम्हारी क्रेडेंशियल उजागर करने के बजाय एजेंट को बिना अलगाव चलाने से इनकार करता है, इसलिए प्रोफ़ाइल लागू होने तक यह अवरुद्ध रहता है।", "this_host_provides_no_os_level_sandbox_so_kiro_c": "यह होस्ट ऑपरेटिंग सिस्टम स्तर का सैंडबॉक्स नहीं देता, इसलिए {{productName}} एजेंट को अलग नहीं रख सकता। यह तुम्हारी क्रेडेंशियल उजागर करने के बजाय एजेंट को बिना सैंडबॉक्स चलाने से इनकार करता है।", "this_kiro_cli_is_signed_in": "यह Kiro CLI साइन इन है।", + "this_kiro_cli_is_too_old_for_the_acp_command": "यह Kiro CLI {{productName}} के लिए आवश्यक acp कमांड हेतु बहुत पुराना है। इसे यहाँ अपडेट करें।", "this_page_detects_kiro_cli_automatically": "इस पेज को खुला रहने दें। यह गेटवे होस्ट की जाँच करता है और Kiro CLI इंस्टॉल हो जाने पर स्वयं आगे बढ़ जाता है।", "try_again": "फिर कोशिश करें", + "update_command_label": "अपडेट कमांड", + "update_kiro_cli": "Kiro CLI अपडेट करें", + "updating_kiro_cli": "Kiro CLI अपडेट हो रहा है…", "waiting": "प्रतीक्षा में", "we_could_not_check_kiro_cli": "हम Kiro CLI की जाँच नहीं कर सके।", - "your_crew_is_almost_ready": "आपका क्रू लगभग तैयार है।" + "your_crew_is_almost_ready": "आपका क्रू लगभग तैयार है।", + "your_kiro_cli_is_out_of_date": "तुम्हारा Kiro CLI पुराना हो चुका है" }, "linkPreview": { "copied": "कॉपी हो गया", diff --git a/website/src/i18n/locales/it.json b/website/src/i18n/locales/it.json index e35be9a1cb7..b8973b03e8f 100644 --- a/website/src/i18n/locales/it.json +++ b/website/src/i18n/locales/it.json @@ -6200,10 +6200,12 @@ "if_you_are_diagnosing_this_from_a_terminal_kiro": "Se stai diagnosticando il problema da un terminale, tieni presente che kiro-cli diagnostic non segnala nulla finché l'app Kiro CLI non è in esecuzione — avviala prima con kiro-cli launch. Quel rifiuto non è la causa di questo problema.", "install_kiro_cli_from_kiros_official_setup_page": "Installa Kiro CLI dalla pagina di configurazione ufficiale di Kiro. Contiene i passaggi per la tua piattaforma e resta aggiornata.", "install_kiro_cli_sign_in_once_and_kiro_crew_will": "Installa Kiro CLI, accedi una volta e {{productName}} farà il resto.", + "kiro_cli_is_installed_and_signed_in_but_too_old": "Kiro CLI è installato e l'accesso è stato effettuato, ma questa versione è precedente al comando acp che {{productName}} utilizza in ogni sessione. Aggiornalo e questa pagina continuerà da sola.", "kiro_cli_is_installed_but_could_not_be_verified": "Kiro CLI è installato, ma non è stato possibile verificarlo", "kiro_cli_is_installed_finish_signing_in_to_conti": "Kiro CLI è installato. Completa l'accesso per continuare.", "kiro_cli_is_required_on_the_gateway_host": "Kiro CLI è necessario sull'host del gateway {{platform}}.", "kiro_cli_s_reason": "Motivo del rifiuto", + "kiro_cli_update_needed": "Aggiornamento di Kiro CLI necessario", "kiro_cli_was_found_on_this_host": "Kiro CLI è stato trovato su questo host.", "kiro_cli_will_not_load_kiro_crew_s_agent_specs": "Kiro CLI non carica le specifiche agente di {{productName}}", "kiro_crew_installs_the_agent_specs_kiro_cli_load": "{{productName}} installa le specifiche degli agenti che Kiro CLI carica prima di poter rispondere a qualsiasi cosa.", @@ -6248,15 +6250,21 @@ "the_gateway_returned_an_unexpected_error": "Il gateway ha restituito un errore inaspettato.", "the_gateway_returned_no_prerequisite_status": "Il gateway non ha restituito lo stato dei prerequisiti.", "the_repair_attempt_failed": "Il tentativo di riparazione non è riuscito", + "the_update_attempt_failed": "Il tentativo di aggiornamento non è riuscito", "then_the_dashboard_will_open_automatically": ", poi\n la dashboard si aprirà automaticamente.", "this_host_allows_user_namespaces_but_the_kernel_d": "Questo host consente i namespace utente, ma il kernel ha poi negato il namespace mount — la firma di Ubuntu 23.10 e versioni successive, che spostano ogni processo che crea un namespace utente in un profilo AppArmor ristretto. {{productName}} preferisce non eseguire l'agente senza isolamento anziché esporre le tue credenziali, quindi resta bloccato finché il profilo non è attivo.", "this_host_provides_no_os_level_sandbox_so_kiro_c": "Questo host non fornisce alcuna sandbox a livello di sistema operativo, quindi {{productName}} non può isolare l'agente. Preferisce non eseguire l'agente senza sandbox anziché esporre le tue credenziali.", "this_kiro_cli_is_signed_in": "Questa Kiro CLI ha l'accesso effettuato.", + "this_kiro_cli_is_too_old_for_the_acp_command": "Questo Kiro CLI è troppo vecchio per il comando acp richiesto da {{productName}}. Aggiornalo qui.", "this_page_detects_kiro_cli_automatically": "Lascia questa pagina aperta. Controlla l'host del gateway e prosegue da sola una volta installato Kiro CLI.", "try_again": "Riprova", + "update_command_label": "Comando di aggiornamento", + "update_kiro_cli": "Aggiorna Kiro CLI", + "updating_kiro_cli": "Aggiornamento di Kiro CLI…", "waiting": "In attesa", "we_could_not_check_kiro_cli": "Non è stato possibile controllare Kiro CLI.", - "your_crew_is_almost_ready": "La tua crew è quasi pronta." + "your_crew_is_almost_ready": "La tua crew è quasi pronta.", + "your_kiro_cli_is_out_of_date": "Il tuo Kiro CLI è obsoleto" }, "linkPreview": { "copied": "Copiato", diff --git a/website/src/i18n/locales/ja.json b/website/src/i18n/locales/ja.json index 468feb53ca5..6bd1e66ac01 100644 --- a/website/src/i18n/locales/ja.json +++ b/website/src/i18n/locales/ja.json @@ -6004,10 +6004,12 @@ "if_you_are_diagnosing_this_from_a_terminal_kiro": "ターミナルからこれを診断している場合、Kiro CLIアプリ自体が実行されるまでkiro-cli診断レポートは何も返さないことに注意してください。まずkiro-cli launchで起動してください。その拒否はこれの原因ではありません。", "install_kiro_cli_from_kiros_official_setup_page": "Kiro 公式のセットアップページから Kiro CLI をインストールします。お使いのプラットフォーム向けの手順が掲載されており、常に最新の内容です。", "install_kiro_cli_sign_in_once_and_kiro_crew_will": "Kiro CLIをインストール、1回サインインしてください。その後 {{productName}}が処理します。", + "kiro_cli_is_installed_and_signed_in_but_too_old": "Kiro CLI はインストール済みでサインインもされていますが、このバージョンは {{productName}} が各セッションで使用する acp コマンドより古いものです。更新すると、このページは自動的に続行します。", "kiro_cli_is_installed_but_could_not_be_verified": "Kiro CLI はインストールされていますが、確認できませんでした", "kiro_cli_is_installed_finish_signing_in_to_conti": "Kiro CLI がインストールされました。続行するにはサインインを完了してください。", "kiro_cli_is_required_on_the_gateway_host": "{{platform}} のゲートウェイホストには Kiro CLI が必要です。", "kiro_cli_s_reason": "拒否された理由", + "kiro_cli_update_needed": "Kiro CLI の更新が必要です", "kiro_cli_was_found_on_this_host": "このホストで Kiro CLI が見つかりました。", "kiro_cli_will_not_load_kiro_crew_s_agent_specs": "Kiro CLI が {{productName}} のエージェント仕様を読み込みません", "kiro_crew_installs_the_agent_specs_kiro_cli_load": "{{productName}} は Kiro CLI が読み込む前にエージェント仕様をインストールしてから、すべてに対応できます。", @@ -6052,15 +6054,21 @@ "the_gateway_returned_an_unexpected_error": "ゲートウェイが予期しないエラーを返しました。", "the_gateway_returned_no_prerequisite_status": "ゲートウェイは前提条件ステータスを返しませんでした。", "the_repair_attempt_failed": "修復試行が失敗しました", + "the_update_attempt_failed": "更新の試行に失敗しました", "then_the_dashboard_will_open_automatically": "その後\n ダッシュボードが自動的に開きます。", "this_host_allows_user_namespaces_but_the_kernel_d": "このホストはユーザー名前空間を許可していますが、カーネルはその後マウント名前空間を拒否しました — これは Ubuntu 23.10 以降の特徴で、ユーザー名前空間を作成したプロセスを制限付きの AppArmor プロファイルへ移動させます。{{productName}} は認証情報を公開するのではなく、サンドボックス化されていないエージェントの実行を拒否するため、プロファイルが用意されるまでブロックされたままになります。", "this_host_provides_no_os_level_sandbox_so_kiro_c": "このホストは OS レベルのサンドボックスを提供しないため、{{productName}} はエージェントを分離できません。認証情報を公開するのではなく、サンドボックス化されていないエージェントの実行を拒否します。", "this_kiro_cli_is_signed_in": "この Kiro CLI はサインイン済みです。", + "this_kiro_cli_is_too_old_for_the_acp_command": "この Kiro CLI は {{productName}} が必要とする acp コマンドに対して古すぎます。ここで更新してください。", "this_page_detects_kiro_cli_automatically": "このページは開いたままにします。ゲートウェイホストを確認し、Kiro CLI のインストールが完了すると自動で次に進みます。", "try_again": "もう一度試してください", + "update_command_label": "更新コマンド", + "update_kiro_cli": "Kiro CLI を更新", + "updating_kiro_cli": "Kiro CLI を更新しています…", "waiting": "待機中", "we_could_not_check_kiro_cli": "Kiro CLI を確認できませんでした。", - "your_crew_is_almost_ready": "クルーの準備がほぼ完了しました。" + "your_crew_is_almost_ready": "クルーの準備がほぼ完了しました。", + "your_kiro_cli_is_out_of_date": "お使いの Kiro CLI は古くなっています" }, "linkPreview": { "copied": "コピー済み", diff --git a/website/src/i18n/locales/ko.json b/website/src/i18n/locales/ko.json index fdfb684d0ba..7d9b5b0f480 100644 --- a/website/src/i18n/locales/ko.json +++ b/website/src/i18n/locales/ko.json @@ -6004,10 +6004,12 @@ "if_you_are_diagnosing_this_from_a_terminal_kiro": "터미널에서 이 문제를 진단하고 있다면, Kiro CLI 앱 자체가 실행되기 전까지 kiro-cli diagnostic은 아무것도 보고하지 않습니다 — 먼저 kiro-cli launch로 실행하세요. 그 거부는 이 문제의 원인이 아닙니다.", "install_kiro_cli_from_kiros_official_setup_page": "Kiro 공식 설정 페이지에서 Kiro CLI를 설치하세요. 사용 중인 플랫폼의 단계가 담겨 있으며 항상 최신 상태로 유지됩니다.", "install_kiro_cli_sign_in_once_and_kiro_crew_will": "Kiro CLI를 설치하고 한 번 로그인하면 나머지는 {{productName}}이(가) 처리합니다.", + "kiro_cli_is_installed_and_signed_in_but_too_old": "Kiro CLI가 설치되어 있고 로그인되어 있지만, 이 버전은 {{productName}}이(가) 모든 세션에서 사용하는 acp 명령보다 이전 버전입니다. 업데이트하면 이 페이지가 자동으로 계속 진행됩니다.", "kiro_cli_is_installed_but_could_not_be_verified": "Kiro CLI가 설치되어 있지만 확인할 수 없습니다", "kiro_cli_is_installed_finish_signing_in_to_conti": "Kiro CLI가 설치되었습니다. 계속하려면 로그인을 완료하세요.", "kiro_cli_is_required_on_the_gateway_host": "{{platform}} 게이트웨이 호스트에는 Kiro CLI가 필요합니다.", "kiro_cli_s_reason": "거부된 이유", + "kiro_cli_update_needed": "Kiro CLI 업데이트 필요", "kiro_cli_was_found_on_this_host": "이 호스트에서 Kiro CLI를 찾았습니다.", "kiro_cli_will_not_load_kiro_crew_s_agent_specs": "Kiro CLI가 {{productName}}의 에이전트 명세를 불러오지 않습니다", "kiro_crew_installs_the_agent_specs_kiro_cli_load": "{{productName}}은(는) Kiro CLI가 무엇이든 응답하기 전에 읽어 들이는 에이전트 사양을 설치합니다.", @@ -6052,15 +6054,21 @@ "the_gateway_returned_an_unexpected_error": "게이트웨이가 예기치 않은 오류를 반환했습니다.", "the_gateway_returned_no_prerequisite_status": "게이트웨이가 전제 조건 상태를 반환하지 않았습니다.", "the_repair_attempt_failed": "복구 시도가 실패했습니다", + "the_update_attempt_failed": "업데이트 시도가 실패했습니다", "then_the_dashboard_will_open_automatically": ". 완료하면\n 대시보드가 자동으로 열립니다.", "this_host_allows_user_namespaces_but_the_kernel_d": "이 호스트는 사용자 네임스페이스를 허용하지만 커널이 마운트 네임스페이스를 거부했습니다 — 사용자 네임스페이스를 생성하는 프로세스를 제한된 AppArmor 프로필로 옮기는 Ubuntu 23.10 이상에서 나타나는 특징입니다. {{productName}}은(는) 자격 증명을 노출하기보다 에이전트를 격리되지 않은 상태로 실행하기를 거부하므로, 프로필이 준비될 때까지 계속 차단됩니다.", "this_host_provides_no_os_level_sandbox_so_kiro_c": "이 호스트는 OS 수준 샌드박스를 제공하지 않아 {{productName}}이(가) 에이전트를 격리할 수 없습니다. 자격 증명을 노출하는 대신 샌드박스 없이 에이전트를 실행하기를 거부합니다.", "this_kiro_cli_is_signed_in": "이 Kiro CLI는 로그인되어 있습니다.", + "this_kiro_cli_is_too_old_for_the_acp_command": "이 Kiro CLI는 {{productName}}에 필요한 acp 명령을 지원하기에는 너무 오래되었습니다. 여기서 업데이트하세요.", "this_page_detects_kiro_cli_automatically": "이 페이지를 열어 두세요. 게이트웨이 호스트를 확인하다가 Kiro CLI가 설치되면 자동으로 진행됩니다.", "try_again": "다시 시도", + "update_command_label": "업데이트 명령", + "update_kiro_cli": "Kiro CLI 업데이트", + "updating_kiro_cli": "Kiro CLI 업데이트 중…", "waiting": "대기 중", "we_could_not_check_kiro_cli": "Kiro CLI를 확인할 수 없었습니다.", - "your_crew_is_almost_ready": "크루가 거의 준비되었습니다." + "your_crew_is_almost_ready": "크루가 거의 준비되었습니다.", + "your_kiro_cli_is_out_of_date": "Kiro CLI가 오래되었습니다" }, "linkPreview": { "copied": "복사됨", diff --git a/website/src/i18n/locales/pt.json b/website/src/i18n/locales/pt.json index 35b2591d241..ccf5b97f28a 100644 --- a/website/src/i18n/locales/pt.json +++ b/website/src/i18n/locales/pt.json @@ -6200,10 +6200,12 @@ "if_you_are_diagnosing_this_from_a_terminal_kiro": "Se você está diagnosticando isso em um terminal, observe que o kiro-cli diagnostic não informa nada até que o próprio aplicativo do Kiro CLI esteja em execução — inicie-o primeiro com kiro-cli launch. Essa recusa não é a causa deste problema.", "install_kiro_cli_from_kiros_official_setup_page": "Instale o Kiro CLI na página de configuração oficial do Kiro. Ela traz os passos para a sua plataforma e se mantém atualizada.", "install_kiro_cli_sign_in_once_and_kiro_crew_will": "Instale o Kiro CLI, entre uma vez e o {{productName}} cuida do resto.", + "kiro_cli_is_installed_and_signed_in_but_too_old": "O Kiro CLI está instalado e com sessão iniciada, mas esta versão é anterior ao comando acp que o {{productName}} usa em cada sessão. Atualize-o e esta página continuará sozinha.", "kiro_cli_is_installed_but_could_not_be_verified": "O Kiro CLI está instalado, mas não foi possível verificá-lo", "kiro_cli_is_installed_finish_signing_in_to_conti": "O Kiro CLI está instalado. Conclua o login para continuar.", "kiro_cli_is_required_on_the_gateway_host": "O Kiro CLI é necessário no host do gateway {{platform}}.", "kiro_cli_s_reason": "Motivo da recusa", + "kiro_cli_update_needed": "Atualização do Kiro CLI necessária", "kiro_cli_was_found_on_this_host": "O Kiro CLI foi encontrado neste host.", "kiro_cli_will_not_load_kiro_crew_s_agent_specs": "O Kiro CLI não carrega as especificações de agente do {{productName}}", "kiro_crew_installs_the_agent_specs_kiro_cli_load": "O {{productName}} instala as especificações de agente que o Kiro CLI carrega antes de poder responder a qualquer coisa.", @@ -6248,15 +6250,21 @@ "the_gateway_returned_an_unexpected_error": "O gateway retornou um erro inesperado.", "the_gateway_returned_no_prerequisite_status": "O gateway não retornou o status dos pré-requisitos.", "the_repair_attempt_failed": "A tentativa de reparo falhou", + "the_update_attempt_failed": "A tentativa de atualização falhou", "then_the_dashboard_will_open_automatically": ", e\n o painel abrirá automaticamente.", "this_host_allows_user_namespaces_but_the_kernel_d": "Este host permite namespaces de usuário, mas o kernel então negou o namespace de montagem — a assinatura do Ubuntu 23.10 e mais recentes, que move qualquer processo que cria um namespace de usuário para um perfil restrito do AppArmor. O {{productName}} se recusa a executar o agente sem sandbox em vez de expor suas credenciais, portanto permanece bloqueado até que o perfil esteja em vigor.", "this_host_provides_no_os_level_sandbox_so_kiro_c": "Este host não oferece um sandbox no nível do sistema operacional, portanto o {{productName}} não consegue isolar o agente. Ele se recusa a executar o agente sem sandbox em vez de expor suas credenciais.", "this_kiro_cli_is_signed_in": "Este Kiro CLI está conectado.", + "this_kiro_cli_is_too_old_for_the_acp_command": "Este Kiro CLI é antigo demais para o comando acp de que o {{productName}} precisa. Atualize-o aqui.", "this_page_detects_kiro_cli_automatically": "Deixe esta página aberta. Ela verifica o host do gateway e continua sozinha quando o Kiro CLI estiver instalado.", "try_again": "Tentar novamente", + "update_command_label": "Comando de atualização", + "update_kiro_cli": "Atualizar Kiro CLI", + "updating_kiro_cli": "Atualizando o Kiro CLI…", "waiting": "Aguardando", "we_could_not_check_kiro_cli": "Não foi possível verificar o Kiro CLI.", - "your_crew_is_almost_ready": "Sua crew está quase pronta." + "your_crew_is_almost_ready": "Sua crew está quase pronta.", + "your_kiro_cli_is_out_of_date": "Seu Kiro CLI está desatualizado" }, "linkPreview": { "copied": "Copiado", diff --git a/website/src/i18n/locales/ru.json b/website/src/i18n/locales/ru.json index abadcbc75d2..0bc0a48bf56 100644 --- a/website/src/i18n/locales/ru.json +++ b/website/src/i18n/locales/ru.json @@ -6298,10 +6298,12 @@ "if_you_are_diagnosing_this_from_a_terminal_kiro": "Если вы диагностируете это из терминала, учтите, что kiro-cli diagnostic ничего не сообщает, пока не запущено само приложение Kiro CLI — сначала запустите его командой kiro-cli launch. Этот отказ не является причиной проблемы.", "install_kiro_cli_from_kiros_official_setup_page": "Установите Kiro CLI на официальной странице настройки Kiro. Там описаны шаги для вашей платформы, и они всегда актуальны.", "install_kiro_cli_sign_in_once_and_kiro_crew_will": "Установите Kiro CLI, войдите один раз — дальше всё сделает {{productName}}.", + "kiro_cli_is_installed_and_signed_in_but_too_old": "Kiro CLI установлен, и выполнен вход, но эта версия старше команды acp, через которую {{productName}} запускает каждый сеанс. Обновите его, и эта страница продолжит работу сама.", "kiro_cli_is_installed_but_could_not_be_verified": "Kiro CLI установлен, но проверить его не удалось", "kiro_cli_is_installed_finish_signing_in_to_conti": "Kiro CLI установлен. Заверши вход, чтобы продолжить.", "kiro_cli_is_required_on_the_gateway_host": "Kiro CLI требуется на хосте шлюза {{platform}}.", "kiro_cli_s_reason": "Причина отказа", + "kiro_cli_update_needed": "Требуется обновление Kiro CLI", "kiro_cli_was_found_on_this_host": "Kiro CLI найден на этом хосте.", "kiro_cli_will_not_load_kiro_crew_s_agent_specs": "Kiro CLI не загружает спецификации агентов {{productName}}", "kiro_crew_installs_the_agent_specs_kiro_cli_load": "{{productName}} устанавливает спецификации агента, которые Kiro CLI загружает, прежде чем сможет что-либо ответить.", @@ -6346,15 +6348,21 @@ "the_gateway_returned_an_unexpected_error": "Шлюз вернул неожиданную ошибку.", "the_gateway_returned_no_prerequisite_status": "Шлюз не вернул статус предварительных требований.", "the_repair_attempt_failed": "Попытка восстановления не удалась", + "the_update_attempt_failed": "Попытка обновления не удалась", "then_the_dashboard_will_open_automatically": ", затем\n панель откроется автоматически.", "this_host_allows_user_namespaces_but_the_kernel_d": "Этот хост разрешает пользовательские пространства имён, но затем ядро отказало в создании пространства имён монтирования — это признак Ubuntu 23.10 и новее, где любой процесс, создающий пользовательское пространство имён, переводится в ограниченный профиль AppArmor. {{productName}} откажется запускать агента без изоляции, чтобы не раскрыть ваши учётные данные, поэтому блокировка сохранится, пока профиль не будет установлен.", "this_host_provides_no_os_level_sandbox_so_kiro_c": "Этот хост не предоставляет песочницу на уровне операционной системы, поэтому {{productName}} не может изолировать агента. Он откажется запускать агента без песочницы, чтобы не раскрыть ваши учётные данные.", "this_kiro_cli_is_signed_in": "В этом Kiro CLI выполнен вход.", + "this_kiro_cli_is_too_old_for_the_acp_command": "Этот Kiro CLI слишком стар для команды acp, необходимой {{productName}}. Обновите его здесь.", "this_page_detects_kiro_cli_automatically": "Оставьте эту страницу открытой. Она проверяет хост шлюза и продолжит сама, как только Kiro CLI будет установлен.", "try_again": "Повторить", + "update_command_label": "Команда обновления", + "update_kiro_cli": "Обновить Kiro CLI", + "updating_kiro_cli": "Обновление Kiro CLI…", "waiting": "Ожидание", "we_could_not_check_kiro_cli": "Нам не удалось проверить Kiro CLI.", - "your_crew_is_almost_ready": "Ваш экипаж почти готов." + "your_crew_is_almost_ready": "Ваш экипаж почти готов.", + "your_kiro_cli_is_out_of_date": "Ваш Kiro CLI устарел" }, "linkPreview": { "copied": "Скопировано", diff --git a/website/src/i18n/locales/zh-CN.json b/website/src/i18n/locales/zh-CN.json index 0be127c55c2..248532874dd 100644 --- a/website/src/i18n/locales/zh-CN.json +++ b/website/src/i18n/locales/zh-CN.json @@ -6004,10 +6004,12 @@ "if_you_are_diagnosing_this_from_a_terminal_kiro": "如果你正在通过终端诊断此问题,请注意:在 Kiro CLI 应用本身运行之前,kiro-cli diagnostic 不会报告任何内容 — 请先使用 kiro-cli launch 启动它。该拒绝并非此问题的原因。", "install_kiro_cli_from_kiros_official_setup_page": "请从 Kiro 官方设置页面安装 Kiro CLI。该页面提供适用于你的平台的步骤,并始终保持最新。", "install_kiro_cli_sign_in_once_and_kiro_crew_will": "安装 Kiro CLI,登录一次,剩下的交给 {{productName}}。", + "kiro_cli_is_installed_and_signed_in_but_too_old": "Kiro CLI 已安装并登录,但此版本早于 {{productName}} 每个会话所使用的 acp 命令。更新后本页面将自动继续。", "kiro_cli_is_installed_but_could_not_be_verified": "Kiro CLI 已安装,但无法验证", "kiro_cli_is_installed_finish_signing_in_to_conti": "Kiro CLI 已安装。完成登录即可继续。", "kiro_cli_is_required_on_the_gateway_host": "{{platform}} 网关主机上必须安装 Kiro CLI。", "kiro_cli_s_reason": "拒绝原因", + "kiro_cli_update_needed": "需要更新 Kiro CLI", "kiro_cli_was_found_on_this_host": "已在此主机上找到 Kiro CLI。", "kiro_cli_will_not_load_kiro_crew_s_agent_specs": "Kiro CLI 不会加载 {{productName}} 的智能体规格", "kiro_crew_installs_the_agent_specs_kiro_cli_load": "Kiro CLI 必须先加载代理规范才能作出任何回答,这些规范由 {{productName}} 安装。", @@ -6052,15 +6054,21 @@ "the_gateway_returned_an_unexpected_error": "网关返回了意外错误。", "the_gateway_returned_no_prerequisite_status": "网关未返回任何前置条件状态。", "the_repair_attempt_failed": "修复尝试失败", + "the_update_attempt_failed": "更新尝试失败", "then_the_dashboard_will_open_automatically": "上完成这两个步骤,然后\n 仪表板会自动打开。", "this_host_allows_user_namespaces_but_the_kernel_d": "此主机允许用户命名空间,但内核随后拒绝了挂载命名空间 — 这是 Ubuntu 23.10 及更新版本的特征,它们会把任何创建用户命名空间的进程移入受限 AppArmor 配置文件。{{productName}} 宁可拒绝在无隔离的情况下运行代理,也不会暴露你的凭据,因此在该配置文件到位之前它会一直处于阻止状态。", "this_host_provides_no_os_level_sandbox_so_kiro_c": "此主机不提供操作系统级沙箱,因此 {{productName}} 无法隔离代理。它宁可拒绝在无沙箱的情况下运行代理,也不会暴露你的凭据。", "this_kiro_cli_is_signed_in": "此 Kiro CLI 已登录。", + "this_kiro_cli_is_too_old_for_the_acp_command": "此 Kiro CLI 版本过旧,不支持 {{productName}} 所需的 acp 命令。请在此处更新。", "this_page_detects_kiro_cli_automatically": "请保持此页面打开。它会检查网关主机,并在 Kiro CLI 安装完成后自动继续。", "try_again": "重试", + "update_command_label": "更新命令", + "update_kiro_cli": "更新 Kiro CLI", + "updating_kiro_cli": "正在更新 Kiro CLI…", "waiting": "等待中", "we_could_not_check_kiro_cli": "我们无法检查 Kiro CLI。", - "your_crew_is_almost_ready": "你的 crew 即将就绪。" + "your_crew_is_almost_ready": "你的 crew 即将就绪。", + "your_kiro_cli_is_out_of_date": "你的 Kiro CLI 已过期" }, "linkPreview": { "copied": "已复制",