mirror of
https://github.com/stablyai/orca.git
synced 2026-09-22 00:02:31 +00:00
`src/preload/api-types.ts` was 3,752 raw lines (3,533 counted, 11.8x the 300-line budget) behind an `eslint-disable max-lines`. Almost all of it was a single `PreloadApi` object type whose ~83 namespace properties were declared inline, so any IPC surface change meant editing one 2,600-line type. Give each namespace a named type in its own module under `src/preload/api/` (`pty-api.ts`, `filesystem-api.ts`, `github-pull-request-api.ts`, ...) and recompose `PreloadApi` from those names. `api-types.ts` keeps the `declare global` Window augmentation and re-exports every moved name, so all 52 import sites are untouched. Two shapes needed care to stay type-identical rather than merely compatible: - Three keys (`gh`, `git`, `ui`) are composed from two modules each. A plain intersection is NOT identical to the original flat object literal, so those use a `Merged<T>` mapped type; a negative control confirmed that dropping it fails the parity assertion. - Keys whose module groups several namespaces use indexed access (`fs: FilesystemApi['fs']`) to preserve exact identity and source order. `config/tsconfig.web.json` and `tsconfig.tc.web.json` enumerate files by path, so they need `src/preload/api/**/*` alongside the existing `api-types.ts` seed or the web projects fail TS6307. Verified by exact type identity, not assignability: 41 assertions of the form `Equals<Now.X, Before.X>` against a frozen pre-split snapshot, covering every exported name, plus a per-key pass over all 83 `PreloadApi` keys. All three projects typecheck clean with those assertions active. Verification note: these tsconfigs are `composite: true`, and `tsc --noEmit` will reuse a stale `.tsbuildinfo` and report clean for a state that genuinely fails. Every result above was produced after deleting the buildinfo, including a negative control confirming the gate still fails on deliberate drift. Drops the `max-lines` bypass and its baseline entry (ratchet 346 -> 345).
72 lines
2.2 KiB
TypeScript
72 lines
2.2 KiB
TypeScript
import type {
|
|
AgentType,
|
|
NativeChatMessage,
|
|
NativeChatTurnLifecycle
|
|
} from '../../shared/native-chat-types'
|
|
|
|
// notFound marks a not-yet-on-disk miss (retry-worthy) vs a real read/parse error (#8401).
|
|
export type NativeChatReadSessionResult =
|
|
| {
|
|
messages: NativeChatMessage[]
|
|
lifecycle?: NativeChatTurnLifecycle
|
|
}
|
|
| { error: string; notFound?: true }
|
|
|
|
/** Messages appended to a live-tailed transcript since the previous emit. */
|
|
export type NativeChatAppendedMessages = NativeChatMessage[]
|
|
|
|
export type NativeChatSubscriptionFrame =
|
|
| {
|
|
type: 'snapshot'
|
|
messages: NativeChatMessage[]
|
|
hasMore: boolean
|
|
error?: string
|
|
lifecycle?: NativeChatTurnLifecycle
|
|
}
|
|
| {
|
|
type: 'replacement'
|
|
messages: NativeChatMessage[]
|
|
hasMore: boolean
|
|
lifecycle?: NativeChatTurnLifecycle
|
|
}
|
|
| {
|
|
type: 'appended'
|
|
messages: NativeChatMessage[]
|
|
lifecycle?: NativeChatTurnLifecycle
|
|
}
|
|
|
|
/** Wire payload for the `nativeChat:appended` push channel. */
|
|
export type NativeChatAppendedPayload = {
|
|
subscriptionId: string
|
|
frame: NativeChatSubscriptionFrame
|
|
}
|
|
|
|
export type NativeChatSubscribeArgs = {
|
|
/** Unique per-caller id, echoed on every append so multiple live panes in
|
|
* one renderer don't cross-talk. */
|
|
subscriptionId: string
|
|
agent: AgentType
|
|
sessionId: string
|
|
/** Authoritative transcript path from the agent hook (providerSession). */
|
|
transcriptPath?: string
|
|
/** First snapshot size; later readSession calls grow this for pagination. */
|
|
limit?: number
|
|
}
|
|
|
|
export type NativeChatApi = {
|
|
/** Read the on-disk transcript for an agent + session id, windowed to the most recent `limit`
|
|
* turns. `transcriptPath` is the hook-reported authoritative path, preferred over the id glob. */
|
|
readSession: (
|
|
agent: AgentType,
|
|
sessionId: string,
|
|
limit?: number,
|
|
transcriptPath?: string
|
|
) => Promise<NativeChatReadSessionResult>
|
|
/** Live-tail a transcript. The first frame is a bounded race-safe snapshot;
|
|
* later frames contain only newly appended messages. */
|
|
subscribe: (
|
|
args: NativeChatSubscribeArgs,
|
|
onFrame: (frame: NativeChatSubscriptionFrame) => void
|
|
) => () => void
|
|
}
|