Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/compatible-agents.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ Source of truth: `captureAgentRecovery` / `RecoveryHost` in `lib/src/host/recove
**Must derive supported executable names and resume options from `CODING_AGENTS`.**

- **Must rebuild only a known invocation plus an opaque id.** The command is *rebuilt* as label, space, captured id, never sliced from the buffer, keeping the hint's executable alias; a long option's id may follow a space or `=`, and only Claude's legacy `claude --continue` omits it. An agent's id must be a UUID unless it registers `id: 'opaque'`, whose ids begin with an ASCII alphanumeric and contain only ASCII alphanumerics, hyphens, and underscores. The invocation must end on a word break but nothing stronger (rationale).
- **Must observe a separator after the newest invocation before capturing it.** Buffer end is insufficient, even at the capture deadline; never fall back to an older hint while the newest is unterminated. Pinned by `waits through every ID split` in `lib/src/host/recovery-capture.test.ts` (rationale).
- **Must observe a separator after the newest invocation before capturing it.** Buffer end is insufficient, even at the capture deadline; never fall back to an older hint while the newest is unterminated. Pinned by `lib/src/host/recovery-capture.test.ts` (rationale).
- **Must strip the scan window as a whole, in one pass, with an unterminated control swallowing the rest of it** — the string controls (OSC, DCS, SOS, PM, APC) **in either introducer form, `ESC` or bare C1**, and equally a CSI the window was cut off *inside* (rationale). **Must match every escape by its full ECMA-48 shape**, never by the Fe range (rationale). **Must share one implementation**: `stripTerminalControls` removes string controls by running `TerminalControlStreamFilter`, so the batch and streaming readers cannot disagree.
- **Must strip in boundary mode**: complete non-string ESC/CSI sequences and standalone C1 controls become newlines, except SGR and charset designators. ESC and C1 counterparts must produce the same boundary. String controls and their payloads vanish; LF, CR, and TAB remain text boundaries; other C0 controls that do not move or erase text vanish. **Must discard incomplete trailing presentation controls without creating a boundary** (rationale).
- **Must select the rightmost well-formed match in the last 50 lines**, newest *by position* and never by pattern order, skipping a terminated id of the wrong shape (rationale).
Expand Down
2 changes: 1 addition & 1 deletion docs/specs/hosted.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ Continuing past the sign-in notice is how an account agrees to the Hosted terms

- **Must show the notice beside every sign-in method**, naming `TERMS_VERSION` and linking the terms and privacy policy without leaving the page.
- **`TERMS_VERSION` is the policy pages' revision date** and changes with every terms revision.
- **Must record each account's first acceptance of each version**, after a sign-in that continued past the notice,, current version only.
- **Must record each account's first acceptance of each version**, after a sign-in that continued past the notice, current version only.

Source of truth: `termsRoutes` in `hosted/server/terms.ts`; `TERMS_VERSION` in `hosted/server/policy-constants.ts`.

Expand Down
2 changes: 1 addition & 1 deletion lib/src/lib/alert-settings-model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { cfg } from '../cfg';
export interface AlertSettings {
/** ms — how long without typing, pointer, or wheel input before the user counts as away (the renderer's presence window). */
inactivityTimeoutMs: number;
/** Defer non-exit rings until five seconds after the last accepted output. */
/** Defer non-exit rings while the output detector has confirmed work, until it settles. */
deferAlertsUntilQuiet: boolean;
/** Speak a ring out loud after `speakDelayMs`, unless its pane is the one being looked at. */
speakEnabled: boolean;
Expand Down
5 changes: 3 additions & 2 deletions lib/src/lib/lath/test-fixtures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
import type { LeafMeta } from './persistence';

/** Build a `LeafMeta` for tests. `tabComponent` defaults from `component` the same way
* the real builders do (`terminal` → `terminal`, anything else → `surface`); `title`
* the real builders do (`terminal` → `terminal`, `tool` → `tool`, anything else →
* `surface`); `title`
* defaults to `'t'`. The single builder shared by every Lath wall test suite. */
export function leafMeta(overrides: {
title?: string;
Expand All @@ -15,7 +16,7 @@ export function leafMeta(overrides: {
const component = overrides.component ?? 'terminal';
return {
component,
tabComponent: overrides.tabComponent ?? (component === 'terminal' ? 'terminal' : 'surface'),
tabComponent: overrides.tabComponent ?? (component === 'terminal' || component === 'tool' ? component : 'surface'),
title: overrides.title ?? 't',
...(overrides.params ? { params: overrides.params } : {}),
};
Expand Down
2 changes: 1 addition & 1 deletion lib/src/remote/burrow/push-delivery.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ function aclRecord(deliveryId: string, label: string): BurrowAclRecord {

/**
* A stand-in for the Burrow's seal: shape-correct, distinct per recipient, and
* free of WebCrypto, so the cases below mint no keys. The real construction is
* free of WebCrypto. The real construction is
* driven with real keys in `sealed push`.
*/
function fakeSeal(): AlertPushDeps['seal'] {
Expand Down
2 changes: 1 addition & 1 deletion scripts/pairing-walkthrough/cdp.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/**
* Just enough raw CDP for the two things `agent-browser` cannot do: give the
* Pocket page a virtual WebAuthn authenticator, and keep a record of everything
* that page logs (`scripts/pairing-walkthrough/README.md` → The Pocket browser).
* that page logs (`scripts/pairing-walkthrough/README.md` → Known limitations).
*
* The CLI has no raw-CDP verb, so this opens a WebSocket of its own to the page
* target's `webSocketDebuggerUrl`. Chrome accepts that second client while
Expand Down
9 changes: 4 additions & 5 deletions website/src/lib/tutorial-shell.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -131,11 +131,10 @@ describe("TutorialShell program dispatch", () => {
});
});

// The playground shell drives the alert tutorial's WATCHING/command-exit demos
// (docs/specs/tutorial.md) entirely through OSC 633 shell-integration reports.
// Nothing else asserts these bytes, so a refactor could silently stop emitting
// them and leave every alert demo showing "nothing is running" while the rest
// of the suite stays green.
// The playground shell reports every command, including the Alerts section's
// `agent` and `build` programs (docs/specs/tutorial.md), through OSC 633
// shell-integration reports. Nothing else asserts these bytes, so a refactor
// could silently stop emitting them while the rest of the suite stays green.
describe("TutorialShell OSC 633 shell integration", () => {
it("reports the prompt with OSC 633;A / 633;B", () => {
const { output, shell } = createHarness();
Expand Down
Loading