Skip to content

AllInOneIME 0.7.1 - #76

Merged
melatonin98034 merged 18 commits into
mainlinefrom
release-0.7.1
Nov 9, 2026
Merged

melatonin98034 merged 18 commits into
mainlinefrom
release-0.7.1

Conversation

@melatonin98034

Copy link
Copy Markdown
Collaborator

AllInOneIME 0.7.1, the bridge: the last version under the old system identity. Its updater installs the next version, 0.7.2, which has AllInOneIME's own identity, and moves settings and keys over first (with a full rollback on any failure). Updates now come from update-v2.json; update.json stays on 0.7.1 for good so every older version reaches this bridge first.

Also: known password fields keep to secure input's rules (#70, #71), and the pipeline's fixes #63, #64, #67.

Tested: make test, make update-test (old→new, rollback, cleanup record), make app; a real rehearsal 0.7.0 → 0.7.1 → 0.7.2 on a separate Mac's account (keychain, defaults, input sources), and the owner's Mac.

🤖 Generated with Claude Code

weijianz and others added 18 commits November 7, 2026 19:18
…s set up

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…quest is too long

A request too long for Apple Intelligence that couldn't go to Bedrock
instead said "couldn't answer instead: AWS profile not found", because
the not-set-up check looked for AWSConfigError, which the live credential
resolver never throws. A missing profile or one with no credentials
(AWSCredentialError) now counts as not set up, like the other providers;
SSO sign-in errors still say to run aws sso login.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…keys first

0.7.1 keeps the old identity and is the only version that knows both. Its
updater accepts a payload with either identity's bundle IDs (exactly those
two pairs; the signature and team checks are unchanged) and reads
update-v2.json; `make update-manifest` writes update.json too, only for an
archive with the old identity, so earlier versions stop at 0.7.1.

Installing a new-identity payload goes through Migration (one file,
Sources/AllInOneIMEMac/Migration.swift), from the update helper and from
`--migrate-identity APP` (the 0.7.2 installer's way): the old defaults
domains' keys copied into the new ones, the old keychain group's items
(synced or not) into the new group, each read back; the apps swapped, the
new input method started, its input source registered and enabled and
selected if the old one was; only then the old identity cleaned up. A
failure before that puts everything back; a cleanup step that fails is
left for the next run and never undoes the switch.

The entitlements list both keychain groups (the profile allows the team's
9SR8N3UD5Y.*). Tested with fakes for defaults, keychain, input sources and
the swap, and end to end by `make update-test` on a temporary install.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…date-v2.json

CHANGELOG 0.7.1 (unreleased), both languages: updates can bring the next
version, which moves AllInOneIME to its new system identity, carrying the
settings and keys over. The READMEs name update-v2.json, say which manifest
`make update-manifest` writes when, and how 0.7.1 moves to the new identity.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Assistant says Bedrock "couldn't answer" when no AWS profile is set up (#63)
…efuses their profiles

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… login shell

The Assistant's profile listing read only the input method's own environment,
so it fell back to ~/.aws while the AWS Profile picker and Bedrock's requests
read the files AWS_CONFIG_FILE and AWS_SHARED_CREDENTIALS_FILE name in the
login shell. It now finds the files as the resolver does (its live environment
and AWSFileLocations), so both list the same profiles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Assistant ignores the AWS files named in the shell and refuses their profiles (#64)
…h in a Chinese UI

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t version, no install over it

The login keychain's keys (key sync off, the Cloud session, the replaced
copies) are readable without asking only by the identity that saved
them. Before the swap, 0.7.1 reads each without asking and copies it
into the new identity's access group as a handover item (never synced,
its label, comment, ending and save time kept), read back; the new
version imports it at launch as its own item, so macOS never asks. The
originals are deleted by the cleanup once the switch is verified, and
only when their handover item holds the same key; a key that would ask
is left where it is. A failure before the switch takes the handover
items out again.

Before the swap the migration also writes what its cleanup will remove
to ~/Library/Application Support/AllInOneIME/identity-cleanup.json
(0600, identifiers only: the old input source, defaults domains, app
paths, launch agents, keychain group and items, login keys), updates it
as each step succeeds, and deletes it when all have; a step left stays
in it, handed over, for the new version to finish at launch.

The installer and `make install` (install-check) refuse to replace an
installed AllInOneIME with the new identity: it is newer.

Tested with fakes (MigrationTests: the handover, event order, failures,
the record before the swap and after a step left, the downgrade check;
IdentityHandoverTests: the record file and the test install's store) and
end to end by `make update-test` (the test install's login keychain, a
step left in the record, install-check and the installer in a test home).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…language

An inner @py, @js, run command or @READ that failed reached the panel
with its English errorDescription: only @search's stream was described
in the interface language first. Every inner command's stream now is,
so a Chinese interface shows "@py:运行超过 10 秒,已停止" as @py does
on its own.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Inner py, js and run command failures show in English in a non-English UI (#67)
… one kept until it is enabled, the new version started as a new instance

What the rehearsal of 0.7.0 → 0.7.1 → 0.7.2 on a real account found:

- macOS lets only the user add a new input method: asked to enable the
  new input source, Text Input Sources says noErr and changes nothing.
  After asking to enable and select it, the move now asks Text Input
  Sources how it is and logs that (it said "enabled, selected" after
  "couldn't be selected"); left off is no rollback.
- Its cache can file the new source under the old bundle ID, so taking
  out every entry with that bundle ID left the user with no AllInOneIME
  at all. The old input source is now disabled by its input source ID,
  never an entry another source is filed under, and only once the new
  one is enabled as itself (filed under its own bundle ID); until then
  that step stays in the cleanup record, handed over, for 0.7.2.
- The helper called Text Input Sources itself, so Launch Services took
  it for the app at the input method's path and `open` started nothing
  (-600). Text Input Sources is now asked by this executable in a
  process of its own (`--input-source`, found where the swap moved it),
  the input method is started as a new instance when none runs, and
  looked for until it runs: a launch that fails is said in the update
  result (`launchError`), which About shows.
- A move rolled back left two empty preference files: the domains its
  copies created are deleted with their files once emptied.
- The rollback said "nothing was changed": it says what failed and that
  the previous version is back, as an update's rollback does.
- The helper's lines, the move's included, go to the unified log too.
- The old input method's folder in ~/Library/Caches is removed by the
  cleanup and listed in the record (`caches`).

Tested with fakes (MigrationTests: macOS leaving the source off, the
cache filing it under the old bundle ID, a failed enable, the record
keeping the old source until another run finds the new one enabled, the
emptied files after an undo, the caches, the child process's calls and
answers; UpdateRelaunchTests: a new instance, one that doesn't run,
the kernel's process list after a move; InputSourceListTests,
IdentityHandoverTests, UpdateTests) and by `make update-test` (a new
source left to the user, then added; the caches; the rollback's text).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e can't be used, and logs a failure right after the swap

The 0.7.1 → 0.7.2 rehearsal: asked to enable the new input source,
Text Input Sources changes nothing and opens System Settings by itself
(on a locked screen, with no window of AllInOneIME's saying why). The
move no longer asks: it registers the new input source (selected only
when it is enabled as itself already, as the old one was) and leaves it
to the user, whom 0.7.2 shows that step first. The `enable` call is gone
from MigrationInputSources, `--input-source` and the test install's
input sources.

What it says is the truth: until the user adds the new input source no
AllInOneIME input source works; the old one's entry is kept only to be
taken out once they have (its app is gone, it can't be used). The log
line, `--migrate-identity`'s output, the changelogs and the READMEs say
so.

A failure during or right after the swap is logged as it goes
(`AppsSwitch.perform(log:)`): "apps: swapped", "rolling back: …", "apps:
the previous ones are back", before what went wrong. And a refused
update says "nothing was changed" once: `UpdateError.invalidApp` no
longer adds it to the About page's text, which says it already.

Tested with fakes (MigrationTests: the input source left to the user,
one enabled already, the record waiting for it, the lines of a failure
at the swap with real bundles), UpdateTests, the self-test, and `make
update-test` (the old input source waits in the record until the test
adds the new one as the user would).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… (GitHub #70, #71)

A field Accessibility tells to be a password field where secure input
isn't on (some web and Electron login fields) was refused only the
selection: `@reply` read and sent the text around the caret, one @
listed AI rows (⏎ on "Qwerty!@abc123" sent "abc123"), AI commands,
background scripts and suggestion lookups got what was typed, and
Translate as You Type collected and sent it.

One check now says whether anything of the field may leave the device:
`InputSession.nothingLeavesDevice()`, secure input on or
`passwordField == .yes`. A field not told yet, or one the shell
couldn't tell, is as before. It is what the composer goes by as its
`secureInputActive` (one @'s `noAI`, `modeCollects`,
`translateModeDraft`, terminal commands, links, reports, messages, a
note to Notion, answers remembered), and what the session checks for
@reply's `.text` read (with a key and with Option), `readFieldText`,
the selection, refused requests, background scripts, `list` lookups,
status lines, messages sent, a note to Notion and questions remembered.

A request refused in such a field by a key ends as where secure input
is on in the field itself: what was typed goes in as typed, the notice
(secure input's wording) says why, and the key goes on to the field,
so ⏎ signs in. Where secure input is on elsewhere it is refused in the
panel as before.

On the Mac, a key's `.text` read is skipped where Accessibility told a
password field in the same read, and Translate as You Type's notices
say text goes in as typed in a known password field too.

Left as they are (nothing typed leaves the device there): warming a
provider's connection, the clipboard read, ⌃V's clipboard history,
the starting-input correction, the long press of Shift, refreshing
suggestion lists, and the Mac's caret and window reads.

Tested: Issue70Tests and Issue71Tests, NothingLeavesDeviceTests (the
predicate, @reply's read, no AI rows nor Translate as You Type, a
refused request in a known password field and under secure input
elsewhere), `make test`, `make update-test`, `make app`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The pipeline's three fixes since 32734a4: Bedrock with no AWS profile
says it isn't set up when an Assistant request is too long (#63), the
Assistant reads the AWS files the login shell names (#64), and a
command failing inside another's text says why in the interface
language (#67). Both changelogs' 0.7.1 section keeps the bridge's
lines and gets the three fixes under Fixed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@melatonin98034
melatonin98034 merged commit b60a997 into mainline Nov 9, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Assistant says Bedrock "couldn't answer" when no AWS profile is set up

1 participant