Dev/fix issues#1885
Conversation
…ry for errored item, adjusted button
## Summary
Add support for Amazon Bedrock as an LLM provider using the native
**Converse API** with API Key authentication.
## Motivation
AWS Bedrock provides access to frontier models (Claude, Amazon Nova,
Llama, DeepSeek etc.) with enterprise-grade security and compliance.
Many teams running AI workloads on AWS infrastructure want to use
Bedrock directly, keeping all traffic within the AWS network.
## Implementation
- Uses Amazon Bedrock's native **Converse API**
(`bedrock-runtime.{region}.amazonaws.com/model/{modelId}/converse`)
- Authentication via **Amazon Bedrock API Key** (`Authorization: Bearer
<key>`) — no SigV4 signing, no extra dependencies
- Config: `apiKey` (Bedrock API key) + `region` (AWS region, default:
`us-east-1`)
- All Bedrock-specific config is declared via the generic
`onboardingFields` mechanism on the provider definition — no
`isAmazonBedrock` branching, no `ProviderConfigData` type changes
- Dynamic model listing via `ListFoundationModels` +
`ListInferenceProfiles` APIs, with fallback to a static list
- Streaming: calls `/converse` (standard JSON response), then re-emits
the full text as `text/event-stream` character-by-character —
bearer-token auth does not support the binary AWS Event Stream protocol
required by `/converse-stream`
## Supported Models
**Anthropic Claude (via Bedrock)**
- Claude Opus/Sonnet/Haiku 4.x
- Claude Sonnet 3.7 (hybrid reasoning)
- Claude Sonnet 3.5 v2
**Amazon Nova**
- Nova Pro (multimodal)
- Nova Lite (multimodal, low cost)
- Nova Micro (text-only, lowest cost)
**Meta / Others**
- Llama 3.3 70B Instruct
- DeepSeek, Moonshot, Minimax models available via inference profiles
## Authentication
Generate a Bedrock API key in: **AWS Console → Amazon Bedrock → API
Keys**
> Note: Long-term API keys have a 30-day expiry. AWS recommends them for
development/exploration use.
## Notes
⚠️ **CORS in browser**: Like other providers (Anthropic, etc.), direct
browser calls to Bedrock are subject to CORS restrictions. Works out of
the box in Tauri desktop app and Node.js server environments. For
browser use, a CORS proxy is needed.
## Testing
```
pnpm vitest run packages/stage-ui/src/libs/providers/providers/amazon-bedrock/index.test.ts
```
---------
Co-authored-by-agent: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
…ls for managing dotnet versions
## Description This PR adds basic CI for Godot stage via ci.yml. --------- Co-authored-by: Neko <neko@ayaka.moe> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Qi <shengen.qi@hpe.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
) ## Description <!-- Please insert your description here and especially provide info about the "what" this PR is solving --> `vue-router` is producing a warning about duplicate route `/devtools` on `stage-web`. Removing `stage-web/src/pages/devtools/index.vue` resolves the warning. There is a duplicate route introduced in `stage-pages/src/pages/devtools/index.vue`. The file in `stage-web` is removed in favor of the one in `stage-pages`. related commit [`44ec5e4`](moeru-ai@44ec5e4) ## Linked Issues <!-- Optional, if you have any --> ## Additional Context <!-- e.g. is there anything you'd like reviewers to focus on? --> --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Neko <neko@ayaka.moe>
Co-authored-by-agent: Unknown <unknown@example.com>
--------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
--------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…eru-ai#1647) --------- Co-authored-by-agent: Antigravity <antigravity@gemini.com> Co-authored-by-agent: Codex <267193182+codex@users.noreply.github.com>
… action routing (moeru-ai#1648) --------- Co-authored-by-agent: Antigravity <antigravity@gemini.com> Co-authored-by-agent: Codex <267193182+codex@users.noreply.github.com>
…ru-ai#1724) ## Summary Add the G0 Godot Stage sidecar preview for `stage-tamagotchi`. ## Design - Keep Electron as the desktop host and run Godot as a separate sidecar window by design. - Use the settings window as the entry point for starting/stopping the experimental Godot Stage. - Require explicit `GODOT4` in development mode instead of auto-discovering local Godot installs. - Use the packaged sidecar under `process.resourcesPath/godot-stage` in the packaged runtime. - Close the Godot WebSocket lifecycle channel on startup failure and stage shutdown. ## Changes - Add the Electron main-side Godot Stage lifecycle service. - Add renderer/settings wiring for switching to the experimental Godot Stage. - Add the minimal Godot stage runtime skeleton and WebSocket handshake path. - Add Godot export presets for sidecar builds. - Add sidecar path verification for the Godot export preset and `electron-builder` resource contract. - Document the development runtime setup and packaging expectations. ## CI/CD - Align Godot CI to `4.6.2`. - Add Linux Godot export smoke coverage as the fastest CI export path. - Add sidecar contract verification to CI. - Run packaged sidecar verification after `electron-builder --dir`. CD is intentionally deferred in this PR. The release workflow still needs a later step to export the Godot sidecar before packaging release artefacts. --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
…comprehensive tests (moeru-ai#1708)
…ession and ghost pointer phases (moeru-ai#1649)
…d window-message adapter
## Summary This PR adds the first usable camera and view-state loop for the experimental Godot stage. The main design direction is that Godot owns the stage view state, while Electron and the settings page act as lifecycle/transport/control surfaces. The settings UI can now edit Godot camera state, and camera changes from the Godot window can flow back to the UI. ## What Changed - Added the shared Godot view-state contract for camera pose, avatar bounds, snapshots, patches, and errors. - Added Electron main bridge APIs for Godot status, scene input, view snapshots, and view patches. - Added Godot-side camera runtime: - initial camera bootstrap from loaded avatar bounds - avatar facing normalisation - orbit, pan, wheel movement, and WASD-style camera movement - idle persistence for camera position, yaw, pitch, and FOV - Added settings-page Godot camera controls with coalesced updates, restart-safe session handling, and stale request protection. - Kept scene input simple: Electron does not cache the selected model for replay. Each Godot start receives the current model selection from the renderer. ## File Guide Shared contracts: - `packages/stage-shared/src/godot-stage/view-state.ts` defines the Godot view-state contract and schema validation. - `packages/stage-shared/src/godot-stage/index.ts` exports the Godot shared contract surface. - `packages/stage-shared/package.json` exposes the new shared entry. Electron / renderer bridge: - `apps/stage-tamagotchi/src/shared/eventa/index.ts` adds the Eventa contracts for Godot status, scene input, view snapshot, patch, and error events. - `apps/stage-tamagotchi/src/main/services/airi/godot-stage/index.ts` owns the Godot sidecar lifecycle, local WebSocket bridge, scene input forwarding, and view-state forwarding. Settings page: - `apps/stage-tamagotchi/src/renderer/pages/settings/models/index.vue` wires the settings page to Godot status, scene input, snapshots, and patches. - `apps/stage-tamagotchi/src/renderer/pages/settings/models/godot-view-patch-queue.ts` coalesces high-frequency camera edits before sending them to Godot. - `apps/stage-tamagotchi/src/renderer/pages/settings/models/godot-view-session.ts` tracks renderer-local Godot session epochs so stale async results are ignored. Shared settings UI: - `packages/stage-ui/src/components/scenarios/settings/model-settings/godot.vue` renders the Godot camera controls. - `packages/stage-ui/src/components/scenarios/settings/model-settings/panel.vue` routes the model settings panel between Live2D, VRM, and Godot settings. - `packages/stage-ui/src/components/scenarios/settings/model-settings/runtime.ts` resolves model-settings runtime display state and Godot camera control range. - `packages/stage-ui/src/components/data-pane/property-number.vue` updates number control behavior so config changes such as min/max/range are reflected correctly. Godot runtime: - `engines/stage-tamagotchi-godot/scripts/StageRoot.cs` wires scene loading, view runtime, and transport together. - `engines/stage-tamagotchi-godot/scripts/scene/StageSceneController.cs` loads VRM avatars and normalizes avatar facing direction. - `engines/stage-tamagotchi-godot/scripts/view/StageViewRuntime.cs` owns Godot view-state updates, snapshots, patch application, and idle persistence. - `engines/stage-tamagotchi-godot/scripts/view/StageCameraPoseController.cs` computes avatar bounds, bootstraps the camera, applies camera pose, and handles camera movement math. - `engines/stage-tamagotchi-godot/scripts/view/StageCameraInputController.cs` maps mouse and keyboard input into camera operations. - `engines/stage-tamagotchi-godot/scripts/view/StageViewStateRules.cs` centralizes view-state defaults and validation rules. - `engines/stage-tamagotchi-godot/scripts/view/StageViewStateStore.cs` persists and loads Godot camera view state. - `engines/stage-tamagotchi-godot/scripts/transport/StageViewJson.cs` parses and serializes view-state transport payloads. - `engines/stage-tamagotchi-godot/scripts/transport/StageViewPayloads.cs` defines the C# payload records used by the transport layer. --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This PR contains updated translations from Crowdin. Created from [GitHub Actions](https://github.com/moeru-ai/airi/blob/main/.github/workflows/crowdin-cron-sync.yml). You can review the source of translations [here](https://crowdin.com/project/proj-airi) Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
…1856) ## Summary\n- Pass the remaining waitForElement budget into each frame-level CU_ACTION send so unresponsive frames cannot consume the fixed 8s sendMessage timeout.\n- Use the remaining deadline for each poll and stop polling immediately when the budget is exhausted.\n- Reduce the bridge-side waitForElement grace from the legacy 9.5s buffer to a small transport grace.\n- Add a regression test covering the hanging-extension case.\n\n## Validation\n- pnpm -C services/computer-use-mcp exec vitest run --config ./vitest.config.ts src/browser-dom/extension-bridge.test.ts --------- Co-authored-by: Neko <neko@ayaka.moe> Co-authored-by: 刘梓恒 <160735726+3361559784@users.noreply.github.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
…ns (moeru-ai#1866) ## Description 修复错误的链接 ## Linked Issues <!-- Optional, if you have any --> ## Additional Context <!-- e.g. is there anything you'd like reviewers to focus on? -->
The streaming speech provider settings page was seeding its model picker with a hardcoded `volcengine/seed-tts-2.0`, which contradicts the just-landed "streaming model catalog comes from the server" contract. Now the default also comes from configKV. - `UNSPEECH_UPSTREAM.streaming` gains `defaultModel?: string`. - `GET /api/v1/audio/models/streaming` response gains `default: string | null` reading that field. - admin slice apply: `streaming.defaultModel` survives key/URL rotation alongside `streaming.models`. - `providerOfficialSpeechStreaming.listModels` stashes the value in a module-scope ref, exposed via `getDefaultStreamingModel()`. - Streaming speech settings page reads the helper instead of the hardcoded id; falls back to the first server-returned model if the operator hasn't curated a default. `handleGenerateSpeech` no longer has a `seed-tts-2.0` backstop — a missing backend prefix in the selected model id now throws instead of silently defaulting.
This PR contains updated translations from Crowdin. Created from [GitHub Actions](https://github.com/moeru-ai/airi/blob/main/.github/workflows/crowdin-cron-sync.yml). You can review the source of translations [here](https://crowdin.com/project/proj-airi) Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
The packaged Electron renderer loads from file://, so its Stripe checkout
and portal requests carry no Referer and an opaque/absent Origin.
resolveTrustedRequestOrigin() returned undefined and the routes threw
INVALID_ORIGIN ("Missing trusted request origin"), blocking FLUX purchases
on desktop. Web and mobile were unaffected because they send a trusted web
origin. CORS was not the blocker: file:// requests already reach the API
(balance, providers, characters all work), so only the checkout-specific
redirect-base dependency failed.
Stripe success_url/cancel_url/return_url must be http(s) URLs, so file://
can never be a valid redirect base. Replace the trusted-origin requirement
with resolveCheckoutRedirectBase(), which prefers the request's trusted
origin (web/mobile return to where they started) and falls back to a
configured canonical web app URL (WEB_APP_URL, default https://airi.moeru.ai)
for origin-less clients like the desktop app.
On the client, the desktop app opens checkout in the system browser via
window.open (routed through setWindowOpenHandler -> shell.openExternal)
instead of navigating the file:// window to Stripe, and refreshes the FLUX
balance on window focus since it never receives the success_url redirect.
This PR contains updated translations from Crowdin. Created from [GitHub Actions](https://github.com/moeru-ai/airi/blob/main/.github/workflows/crowdin-cron-sync.yml). You can review the source of translations [here](https://crowdin.com/project/proj-airi) Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
## Summary - Fix the first Live2D -> VRM switch camera regression where OrbitControls could clamp the camera into the model. - Remove the VRM render scale control from the model settings panel. - Remove the now-unused `settings.vrm.render-scale` locale entries. - Ignore Godot/.NET `bin/` and `obj/` build artifacts under `engines/stage-tamagotchi-godot`. ## Root Cause On the first VRM load, `OrbitControls` can mount before the VRM bootstrap writes a real `modelSize`. The previous watcher copied `modelSize.z = 0` into `minDistance` and `maxDistance`, so later camera updates were clamped onto the target before the bootstrap camera pose finished applying. ## Changes - Skip OrbitControls distance-bound updates until `modelSize.z` is finite and non-zero. - Keep the render scale runtime state intact, but remove the VRM settings UI entry so it is no longer hot-updated from the panel. - Add Godot project ignores for local .NET build output. --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This PR contains updated translations from Crowdin. Created from [GitHub Actions](https://github.com/moeru-ai/airi/blob/main/.github/workflows/crowdin-cron-sync.yml). You can review the source of translations [here](https://crowdin.com/project/proj-airi) Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
… included in the CHANGES.MD file in the root directory of the project
…e in the root directory
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ef5dca2c45
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
|
|
||
| try { | ||
| // Send the command with a trailing carriage return | ||
| const sendResult = await executePrepTool(`pty_send_input:${ptySessionId}:${command}`) |
There was a problem hiding this comment.
Append Enter when sending one-shot PTY commands
For terminal steps that resolve to the PTY one_shot path, this writes only the command text into the shell; writeToPty forwards bytes exactly, and the comment here even says the command should include a trailing carriage return. As a result, commands like pnpm test or npm create ... are merely typed at the prompt, then the engine waits 500 ms, reads the unchanged screen, and reports success without executing the command. Include \r/Enter in the data sent for this path.
Useful? React with 👍 / 👎.
|
Hi @aki-dev-code — comparing your branch to |
…e in the root directory
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: eb484adce6
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| case 'checkout.session.completed': { | ||
| const result = await handleCheckoutSessionCompleted(event.id, event.data.object, fluxService, stripeService, billingService) |
There was a problem hiding this comment.
Gate Flux credit on paid Checkout sessions
When Stripe Checkout has delayed/asynchronous payment methods enabled, checkout.session.completed can arrive while payment_status is still unpaid; Stripe's Checkout fulfillment docs explicitly say to check payment_status and use checkout.session.async_payment_succeeded for delayed methods (https://docs.stripe.com/checkout/fulfillment). Since this branch immediately calls the Flux-credit handler for every completed payment-mode session, those customers can receive Flux before funds settle or even when the async payment later fails.
Useful? React with 👍 / 👎.
| val leaf = chain.firstOrNull() | ||
| if (leaf == null || !looksLikeAiriServerCertificate(leaf)) { | ||
| throw error | ||
| } | ||
|
|
||
| leaf.checkValidity() |
There was a problem hiding this comment.
Verify the AIRI certificate chain before trusting WSS
For a WSS connection whose certificate is not system-trusted, this fallback accepts any leaf certificate with the expected subject/issuer strings and valid dates; it never verifies that the leaf is actually signed by the AIRI CA or pins a known CA/public key. On an untrusted LAN, a MITM can mint a self-signed cert with the same DN/SAN values and pass this check, so the native bridge would connect to an impersonated host instead of the user's Tamagotchi instance.
Useful? React with 👍 / 👎.
Description
Fix failing tests in previous PR. All changes are linked in the CHANGES.md file in the root directory.