Commit Graph
70 Commits
Author SHA1 Message Date
Kaede Akino ad4e72e35d Adopt AgentKit approval policies 2026-09-14 17:33:57 +08:00
Kaede Akino d3145bcccf Fix Assistant approval interaction 2026-09-14 10:09:06 +08:00
Kaede Akino 82061a400b Fix default expand tool 2026-09-14 09:05:43 +08:00
Kaede Akino 3dbcbcccdf Add Quick Action 2026-09-13 23:08:42 +08:00
Kaede Akino 9d73280833 Remove useless tests 2026-09-13 22:19:31 +08:00
Kaede Akino 007ed63e95 Bump to 1.7.3 2026-09-13 22:05:02 +08:00
Kaede Akino 2977677f7b Marketing 2026-09-13 20:13:53 +08:00
Kaede Akino 21cfc1f460 Improve mobile workspace navigation and bump to 1.7.1 2026-09-13 16:06:51 +08:00
Kaede Akino fe2f75b41b Bump to 1.7.0 2026-09-13 13:29:13 +08:00
Kaede Akino a737283621 Add Traditional Chinese localization 2026-09-13 11:41:09 +08:00
Kaede Akino 5acb7f48b6 Updte depends 2026-09-12 23:34:53 +08:00
Kaede Akino abaa6a2f8a Improve SFTP file workflows 2026-09-12 16:38:36 +08:00
Kaede Akino 97248d17f2 Improve mobile SFTP navigation and layout 2026-09-12 10:38:01 +08:00
Kaede Akino 64d0183e03 Add mobile terminal snippet and history lists 2026-09-12 10:37:38 +08:00
Kaede Akino 4c68a01c48 Share cross-platform session and presentation logic 2026-09-12 10:36:15 +08:00
Kaede Akino 5eefc33cb0 Refactor TFI for project structure 2026-09-12 01:21:51 +08:00
Kaede Akino 7bbfeb79e2 Bulk iOS 2026-09-11 21:07:44 +08:00
Kaede Akino 1b835a5df4 Continue iOS port with shared settings and Metrics 2026-09-11 15:12:37 +08:00
Kaede Akino c2958a05b3 Add iOS workspaces and shared feature services
Share Vault, persistence, SSH/SFTP, forwarding, and SwiftUI components across platforms. Add mobile editors, terminal input, standalone Assistant, Metrics navigation, transfers, and a unified Live Activity with host system icons.

Validation: 35 iOS tests and 100 focused macOS tests pass; formatting and zh-Hans checks pass. The full macOS run reports 14 issues in the documented timing, Keychain, and popover suites. Remaining Assistant tool and CloudKit work is tracked in Memory/MOBILE_ROLLOUT.md.
2026-09-11 13:47:16 +08:00
Kaede Akino 66890792b8 Split macOS and iOS targets into shared frameworks 2026-09-11 10:59:38 +08:00
Kaede Akino e11ed85831 Bump to 1.6.0 2026-09-11 01:04:42 +08:00
Kaede Akino e4f3e21615 Fix model role localization and skill wording 2026-09-09 20:58:52 +08:00
Kaede Akino 8cdb3cbd44 Bump to 1.5.4(5) 2026-09-09 17:52:22 +08:00
Kaede Akino 2afc70a285 Normalize fetched model types with AgentKit 0.6.0 2026-09-09 17:14:19 +08:00
Kaede Akino 58d2842a9e Fix zsh integration 2026-09-09 12:33:32 +08:00
Kaede Akino d8b12d98af Add theme selector 2026-09-09 11:47:18 +08:00
Kaede Akino 6a912cc5d0 Fix App Icon 2026-09-09 11:34:51 +08:00
Kaede Akino 3511bf963a Refactor free trial 2026-09-09 01:20:42 +08:00
Kaede Akino dd30b19391 Fix apple speech crash 2026-09-06 19:31:45 +08:00
Kaede Akino f61a2cfc95 Bump to 1.4.2 2026-09-04 11:34:35 +08:00
Kaede AkinoandClaude Opus 5 ea3aae9b52 Address a provider by one URL and one API type
The API Type picker named three vendors — OpenAI, Anthropic, Google — for
four wire protocols, so `.openAI` carried a Responses toggle to express the
fourth. Each kind also carried a default base URL, which the editor printed
as the Base URL placeholder, so `api.openai.com` was on screen for anyone
who had added a provider and typed nothing, and a provider with a key but no
address quietly resolved to a vendor endpoint nobody had named.

The picker now names the protocol: Automatic, Chat Completions, Responses,
Messages, generateContent. Automatic reads the protocol off the URL's own
suffix and falls back to Chat Completions when nothing matches, which is
what an endpoint that does not name itself is almost always serving.

Base URL and API Path collapse into one field. Splitting them made "does the
base URL include /v1" a question the user had to answer, and it is the
question every client of this shape gets wrong. Paste whatever the gateway's
documentation printed, at whatever depth it printed it; the two captions
underneath say what that produced — Full URL is read from the same value the
request is built from, and the line under it names the body shape, which is
how Automatic explains its own answer and how an explicit pick that
disagrees with the URL stops being a silent surprise. An explicit pick moves
the format, never the address: the person who pasted it keeps it.

Vertex AI goes with the vendor names. It stays in AgentKit, which is an
independent package and does not carry this app's constraints, but nothing
here drives it any more — the editor's project, location and service-account
import are gone, along with five persisted columns and their Keychain path.

`ProviderEndpoint` holds the two things the editor owns, the typed URL and
the picked type, because neither survives a round trip through the composed
result: a URL ending in /messages looks the same whether it was typed or
appended, and Automatic looks the same as picking the format it resolved to.
`AIConfigurationModel.setEndpoint` is the only writer of the derived
`inferenceURL`, `baseURL` and `apiFormat`.

Old rows fold back to the address they used to resolve to rather than to
Automatic, so a provider that worked before the change points at the same
place after it. That fold needs the pre-V12 columns, which is why `kind`,
`baseURL`, `apiPath` and `usesResponsesAPI` are still declared, and it needs
V11 frozen: every VersionedSchema in the plan points at live model types, so
editing a persisted model rewrites what the old version *means* and leaves
an installed store recording a version the plan no longer contains. That is
a refusal to open, not a migration. `TermindSchemaV11Models` is what gives
V11 to V12 two sides — any future attribute change needs the same freeze.

Requires AgentKit 0.5.0, where `ModelAPIFormat` replaces `ModelProviderKind`
and a provider carries `inferenceURL` and `baseURL` instead of a kind, a
base and a path.

Verified with the full test suite (994 tests, including the new
ProviderEndpointTests), swift-format lint --strict,
Scripts/check-zh-localization.sh, npm run build, and a launch of the app
against an existing V11 store.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 11:33:34 +08:00
Kaede Akino 9bd4ac3029 Bump to 1.4.1 2026-09-03 15:19:10 +08:00
Kaede Akino 4a5e52488c Bump to 1.4.0 2026-09-02 19:09:50 +08:00
Kaede Akino 2b7908de6a Bump to 1.3.0 2026-09-02 18:10:28 +08:00
Kaede Akino 1c429a301b Adopt AgentKit 0.3.0 scratch_replace, scratch_copy and scratch_move
scratch_edit is now scratch_replace, and takes a regex mode and a per-entry
count — omit it to require exactly one match as before, 0 for every occurrence,
n for the first n. scratch_copy and scratch_move move a staged file or subtree
without its bytes passing through the transcript, which is what duplicating a
file before a risky change used to cost.

The app-side changes are the ones the rename and the two new tools reach:
ActionKind.copy in both the English and Chinese verb tables, the pull → copy →
replace → push recipe in the built-in config-edit skill, and the same wording in
the system prompt and the plan contract. The legacy tables are deliberately
untouched: legacyToolNames and legacyMetadata describe cards written before
presenter IDs were persisted, and scratch_edit belongs in both. AgentKit keeps
builtin.scratch_edit registered as an alias, so a transcript from before the
rename still draws its diff rather than falling back to generic fields — which
aCardWrittenAsScratchEditStillFindsItsProjection now pins.

AppLanguageTests no longer requires %lld results. That plural moved to AgentKit
with web_search's card, which is what db8796c removed from this catalog; the
test's list had been left behind and was failing.

AGENTS.md said AgentKit was referenced as a local SPM package. It is a versioned
remote dependency, so an uncommitted change in ../AgentKit is invisible to the
app and a change spanning both sides needs a tagged release in between. Said so,
because working the other way wastes a build cycle before the mistake shows.

Verified: AgentKit 0.3.0 builds and passes its 112 tests, and the six suites
this touches pass here. The five failures in the full run — ColorSystemTests,
two ChatComposerStateTests, FileURLDropTargetTests and WindowStateTests — all
reproduce on a clean worktree at HEAD and are unrelated.
2026-09-02 15:44:52 +08:00
Kaede Akino 6d17fef156 update libghostty-spm to 1.5.1 2026-09-02 15:44:51 +08:00
Kaede Akino cdd8fe0668 Extract the agent runtime as AgentKit
The loop, the approval gate, the provider adapters, the MCP client, and the
tools with no opinion about transports now live in a package and are consumed
from it. Termind keeps everything that reaches a machine or a person: the SSH
and SFTP tools, the connection pool, the Vault resolver, scratch_pull and
scratch_push, the SwiftData store, and every view.

They meet at four seams. TermindAgentTools registers our tools alongside the
built-in groups; AgentToolServices carries the SSH credential prompt to them
without that prompt appearing in a runtime protocol; TermindAgentPolicy owns the
system prompt, the plan contract, and the ssh_exec plan-mode rule the runtime
cannot write for us; TermindAgentPresentation extends the card vocabulary with
our own semantics.

ChatPermissionMode becomes AgentPermissionMode and moves out of the conversation
model — who authorizes an action is a property of the run, not of a view.
AgentRunRequest takes the session context as rendered text rather than our
SessionContext, because the runtime does nothing with it but insert it in front
of the turn it describes.

Termind's system prompt and plan contract are byte-identical to what shipped.
Every provider cache is a prefix cache, so editing a word there would miss the
cache on every replayed conversation at once.
2026-09-02 13:58:35 +08:00
Kaede Akino 54ea515750 unified ProAccessControllerError 2026-09-02 07:34:14 +08:00
Kaede Akino dc4bd34414 Add review mode and remove developer pro 2026-09-01 23:27:58 +08:00
Kaede Akino 7128b64681 Bump to 1.2.2 2026-09-01 10:48:59 +08:00
Kaede Akino 1449bd62ac Bump to 1.2.1 2026-08-31 22:03:31 +08:00
Kaede Akino 8e55b12e4a Bump to 1.2.0 2026-08-30 17:27:00 +08:00
Kaede Akino cc04892238 Bump to 1.2.0 2026-08-30 17:06:38 +08:00
Kaede Akino a7145adf6d Bump to 1.1.0 2026-08-30 13:49:31 +08:00
Kaede Akino 12afb7295a Fix Assistant transcript scroll restoration 2026-08-30 12:43:54 +08:00
Kaede Akino 098c5b01a9 Bump to 1.0.0 (2) 2026-08-30 11:31:37 +08:00
Kaede Akino c11c5bb6d7 Bump to 1.0.0 2026-08-30 10:53:02 +08:00
Kaede Akino 3f0dd9a7f2 Bump to 0.4.0 2026-08-30 03:19:33 +08:00
Kaede Akino 58c5b9615f Add debug Pro entitlement controls 2026-08-30 01:44:38 +08:00
Kaede Akino 2597745544 fix terminal suggetion 2026-08-29 23:44:03 +08:00