clankerbend 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/docs/protocol.md CHANGED
@@ -1,17 +1,17 @@
1
- # OneWhack Protocol
1
+ # ClankerBend Protocol
2
2
 
3
3
  Status: draft
4
4
 
5
- Disclaimer: OneWhack is an independent OneWill project compatible with OpenAI
5
+ Disclaimer: ClankerBend is an independent OneWill project compatible with OpenAI
6
6
  Codex Desktop. It is not affiliated with or endorsed by OpenAI.
7
7
 
8
- OneWhack Protocol, short for the OneWill Extension Hacks protocol, is a
8
+ ClankerBend Protocol, short for the OneWill ClankerBend protocol, is a
9
9
  standalone local protocol for building companion apps around Codex Desktop
10
- without requiring changes to Codex Desktop itself. OneWhack separates a shared
10
+ without requiring changes to Codex Desktop itself. ClankerBend separates a shared
11
11
  local host from individual apps: the host owns the risky integration work, and
12
12
  apps consume stable transcript, annotation, navigation, and state primitives.
13
13
 
14
- OneWhack codifies the hack paths available today:
14
+ ClankerBend codifies the hack paths available today:
15
15
 
16
16
  - a local host process bound to loopback
17
17
  - a browser side panel loaded from that local host
@@ -20,8 +20,8 @@ OneWhack codifies the hack paths available today:
20
20
  - `codex app-server` awareness for thread, turn, item, approval, and rollback
21
21
  data
22
22
 
23
- OneWhack is not a proposal for a privileged built-in Codex plugin API. If Codex later
24
- adds such an API, it should be able to replace the adapters underneath OneWhack, but
23
+ ClankerBend is not a proposal for a privileged built-in Codex plugin API. If Codex later
24
+ adds such an API, it should be able to replace the adapters underneath ClankerBend, but
25
25
  the protocol here is designed to work now with external tools.
26
26
 
27
27
  ## Normative Language
@@ -32,7 +32,7 @@ non-normative unless explicitly marked otherwise.
32
32
 
33
33
  ## Goals
34
34
 
35
- OneWhack should give any local app a small set of reusable primitives:
35
+ ClankerBend should give any local app a small set of reusable primitives:
36
36
 
37
37
  1. **View**: start a local browser UI and place it in Codex Desktop's existing
38
38
  side panel.
@@ -55,32 +55,32 @@ OneWhack should give any local app a small set of reusable primitives:
55
55
 
56
56
  ## Scope
57
57
 
58
- OneWhack `0.1` is transcript-adjacent. It covers side panels that observe, annotate,
58
+ ClankerBend `0.1` is transcript-adjacent. It covers side panels that observe, annotate,
59
59
  navigate, and correlate Codex Desktop transcript content. Other Desktop
60
60
  surfaces such as terminal panes, file trees, browser previews, command palette
61
61
  commands, notifications, and settings are out of scope for this version.
62
62
 
63
63
  ## Non-Goals
64
64
 
65
- - OneWhack does not require Codex Desktop changes.
66
- - OneWhack does not replace `codex app-server`.
67
- - OneWhack does not define a security boundary.
68
- - OneWhack does not grant host filesystem, shell, network, or approval authority.
69
- - OneWhack does not assume exact item-to-DOM mapping is always possible.
65
+ - ClankerBend does not require Codex Desktop changes.
66
+ - ClankerBend does not replace `codex app-server`.
67
+ - ClankerBend does not define a security boundary.
68
+ - ClankerBend does not grant host filesystem, shell, network, or approval authority.
69
+ - ClankerBend does not assume exact item-to-DOM mapping is always possible.
70
70
 
71
71
  ## Architecture
72
72
 
73
- OneWhack describes a shared local host that can mount multiple apps.
73
+ ClankerBend describes a shared local host that can mount multiple apps.
74
74
 
75
75
  ```text
76
- OneWhack app panel(s) <-> OneWhack host <-> Codex Desktop adapter <-> renderer bridge
76
+ ClankerBend app panel(s) <-> ClankerBend host <-> Codex Desktop adapter <-> renderer bridge
77
77
  \
78
78
  -> app-server adapter
79
79
  ```
80
80
 
81
- ### OneWhack Host
81
+ ### ClankerBend Host
82
82
 
83
- The OneWhack host is the trusted local process for a session. It owns the
83
+ The ClankerBend host is the trusted local process for a session. It owns the
84
84
  loopback HTTP/SSE server, app registry, app state fanout, Desktop CDP adapter,
85
85
  renderer bridge injection, app-server adapter, lifecycle cleanup, and policy
86
86
  checks. Apps do not talk directly to CDP or app-server unless the host grants a
@@ -91,9 +91,9 @@ Vim-style transcript navigation, diagnostics, bookmarks, or review tools. Apps
91
91
  share transcript anchors, selection, app-server correlation, and side-panel
92
92
  placement through the host.
93
93
 
94
- ### OneWhack App
94
+ ### ClankerBend App
95
95
 
96
- A OneWhack app is a UI and state contributor mounted by the host. It may provide
96
+ A ClankerBend app is a UI and state contributor mounted by the host. It may provide
97
97
  a side-panel route, annotations, commands, app state entries, and action
98
98
  handlers. An app is identified by a stable `appId` and described by a manifest.
99
99
 
@@ -106,7 +106,7 @@ a future built-in plugin API, or a mock adapter.
106
106
  The Codex Desktop adapter is the implementation-specific component that launches
107
107
  or attaches to Codex Desktop with a loopback CDP port and evaluates the injected
108
108
  renderer bridge. This adapter is not the protocol. It is the current way the
109
- OneWhack host realizes the protocol without Codex Desktop changes.
109
+ ClankerBend host realizes the protocol without Codex Desktop changes.
110
110
 
111
111
  ### Injected Renderer Bridge
112
112
 
@@ -119,12 +119,12 @@ single app.
119
119
 
120
120
  Connection to `codex app-server --stdio` or another app-server transport when
121
121
  available. It is used for task identity and lifecycle data, not for Desktop UI
122
- control. A OneWhack host may still run when app-server is unavailable, but it
122
+ control. A ClankerBend host may still run when app-server is unavailable, but it
123
123
  must report that state explicitly.
124
124
 
125
125
  ## Transport
126
126
 
127
- OneWhack uses ordinary local web primitives:
127
+ ClankerBend uses ordinary local web primitives:
128
128
 
129
129
  - HTTP JSON endpoints for commands
130
130
  - Server-Sent Events for state updates
@@ -147,7 +147,7 @@ explicitly defined as SSE. JSON endpoints must use `application/json`.
147
147
  Successful JSON responses use this envelope:
148
148
 
149
149
  ```ts
150
- type OneWhackResponse<T> = {
150
+ type ClankerBendResponse<T> = {
151
151
  ok: true;
152
152
  data: T;
153
153
  };
@@ -156,7 +156,7 @@ type OneWhackResponse<T> = {
156
156
  Failed JSON responses use this envelope:
157
157
 
158
158
  ```ts
159
- type OneWhackError = {
159
+ type ClankerBendError = {
160
160
  ok: false;
161
161
  error: {
162
162
  code:
@@ -199,9 +199,9 @@ app or adapter:
199
199
 
200
200
  1. Request bodies must parse as JSON objects. Arrays, strings, numbers, and
201
201
  invalid JSON return `400` with code `bad_request`.
202
- 2. Hosts should reject bodies larger than 1 MiB for OneWhack `0.1` JSON
202
+ 2. Hosts should reject bodies larger than 1 MiB for ClankerBend `0.1` JSON
203
203
  endpoints.
204
- 3. `POST /onewhack/apps/:appId/actions` requires an `action` object with
204
+ 3. `POST /clankerbend/apps/:appId/actions` requires an `action` object with
205
205
  non-empty string `appId`, `actionId`, and `type` fields.
206
206
  4. `action.appId` must match the route `:appId`. A mismatch returns `400` with
207
207
  code `bad_request`.
@@ -215,7 +215,7 @@ additional validation for app-specific payloads.
215
215
 
216
216
  ### Session Token
217
217
 
218
- A production OneWhack host must protect JSON and SSE endpoints with an
218
+ A production ClankerBend host must protect JSON and SSE endpoints with an
219
219
  unguessable session token. The token is passed as:
220
220
 
221
221
  ```text
@@ -236,10 +236,10 @@ An app must not bypass the host token by calling CDP or app-server directly.
236
236
 
237
237
  ### Bootstrap
238
238
 
239
- OneWhack `0.1` defines two token bootstrap paths:
239
+ ClankerBend `0.1` defines two token bootstrap paths:
240
240
 
241
241
  1. **Hosted panel apps**: the host serves the app entry URL and may append the
242
- token in the URL fragment as `#onewhack_token=<token>`. App JavaScript reads
242
+ token in the URL fragment as `#clankerbend_token=<token>`. App JavaScript reads
243
243
  the fragment, stores the token in memory, immediately removes the fragment
244
244
  with `history.replaceState`, and sends the token in the `Authorization`
245
245
  header for JSON and SSE requests.
@@ -256,23 +256,23 @@ support the bearer-token header.
256
256
  The host maintains one public state object and streams snapshots to the panel.
257
257
 
258
258
  ```ts
259
- type OneWhackPublicState = {
260
- protocolName: "onewhack";
259
+ type ClankerBendPublicState = {
260
+ protocolName: "clankerbend";
261
261
  protocolVersion: "0.1";
262
262
  sequence: number;
263
263
  generatedAt: string;
264
- capabilities: OneWhackCapabilities;
264
+ capabilities: ClankerBendCapabilities;
265
265
  host: HostStatus;
266
266
  desktop: DesktopStatus;
267
267
  panel: PanelStatus;
268
268
  transcript: TranscriptState;
269
- selection: OneWhackSelection | null;
270
- selectionActions?: OneWhackSelectionAction[];
271
- overlay?: OneWhackOverlay | null;
272
- composer?: OneWhackComposerState;
273
- apps: OneWhackAppState[];
269
+ selection: ClankerBendSelection | null;
270
+ selectionActions?: ClankerBendSelectionAction[];
271
+ overlay?: ClankerBendOverlay | null;
272
+ composer?: ClankerBendComposerState;
273
+ apps: ClankerBendAppState[];
274
274
  appServer: AppServerStatus;
275
- lastAction?: OneWhackActionResult;
275
+ lastAction?: ClankerBendActionResult;
276
276
  };
277
277
  ```
278
278
 
@@ -312,15 +312,15 @@ type TranscriptScrollState = {
312
312
  The state object is intentionally denormalized so the panel can render from a
313
313
  single event payload.
314
314
 
315
- ### `GET /onewhack/state`
315
+ ### `GET /clankerbend/state`
316
316
 
317
317
  Returns the latest public state.
318
318
 
319
319
  ```ts
320
- type GetStateResponse = OneWhackResponse<OneWhackPublicState>;
320
+ type GetStateResponse = ClankerBendResponse<ClankerBendPublicState>;
321
321
  ```
322
322
 
323
- ### `GET /onewhack/events`
323
+ ### `GET /clankerbend/events`
324
324
 
325
325
  Streams host events as SSE. The host must send a full state snapshot
326
326
  immediately after a client connects.
@@ -328,19 +328,19 @@ immediately after a client connects.
328
328
  ```text
329
329
  event: state
330
330
  id: 42
331
- data: {"protocolName":"onewhack","protocolVersion":"0.1","sequence":42,...}
331
+ data: {"protocolName":"clankerbend","protocolVersion":"0.1","sequence":42,...}
332
332
  ```
333
333
 
334
334
  SSE rules:
335
335
 
336
- 1. `id` is the decimal string form of `OneWhackPublicState.sequence`.
337
- 2. `state` events contain a complete `OneWhackPublicState`.
338
- 3. `app-state` events may contain one `OneWhackAppState`; clients must still be
336
+ 1. `id` is the decimal string form of `ClankerBendPublicState.sequence`.
337
+ 2. `state` events contain a complete `ClankerBendPublicState`.
338
+ 3. `app-state` events may contain one `ClankerBendAppState`; clients must still be
339
339
  able to recover from `state`.
340
- 4. `action` events contain `OneWhackActionResult`.
340
+ 4. `action` events contain `ClankerBendActionResult`.
341
341
  5. `heartbeat` events have empty JSON object data and should be sent at least
342
342
  every 15 seconds.
343
- 6. `error` events contain `OneWhackError["error"]`.
343
+ 6. `error` events contain `ClankerBendError["error"]`.
344
344
  7. Hosts should avoid emitting `state` when nothing semantically changed.
345
345
  8. Clients may reconnect with `Last-Event-ID`; hosts may replay missed events
346
346
  but must send a fresh `state` event even if replay is unavailable.
@@ -353,7 +353,7 @@ The host exposes negotiated capabilities in every state snapshot so apps can
353
353
  degrade cleanly.
354
354
 
355
355
  ```ts
356
- type OneWhackCapabilities = {
356
+ type ClankerBendCapabilities = {
357
357
  protocolVersion: "0.1";
358
358
  host: {
359
359
  apps: boolean;
@@ -409,11 +409,11 @@ transcript operation until a future protocol version adds dynamic arbitration.
409
409
 
410
410
  ### Forward Compatibility
411
411
 
412
- OneWhack clients must treat minor-version protocol changes as additive.
412
+ ClankerBend clients must treat minor-version protocol changes as additive.
413
413
  Unknown object fields, unknown capability keys, unknown app state entry fields,
414
414
  and unknown action result data must be ignored by default. Apps must gate
415
- optional behavior on the capabilities they read from `GET /onewhack/manifest`
416
- or `GET /onewhack/state`; they must not infer availability from the host name,
415
+ optional behavior on the capabilities they read from `GET /clankerbend/manifest`
416
+ or `GET /clankerbend/state`; they must not infer availability from the host name,
417
417
  adapter name, or Codex Desktop version alone.
418
418
 
419
419
  Hosts must keep the `ok` envelope, error envelope, endpoint names, and required
@@ -442,27 +442,27 @@ lowercase reverse-DNS-style names such as `onewill.vim-nav`.
442
442
  Apps must read host capabilities before assuming any optional feature exists.
443
443
 
444
444
  ```text
445
- GET /onewhack/manifest
446
- GET /onewhack/state
447
- GET /onewhack/events
445
+ GET /clankerbend/manifest
446
+ GET /clankerbend/state
447
+ GET /clankerbend/events
448
448
  ```
449
449
 
450
- `GET /onewhack/manifest` returns host identity, protocol version, and mounted
450
+ `GET /clankerbend/manifest` returns host identity, protocol version, and mounted
451
451
  app manifests.
452
452
 
453
453
  ```ts
454
- type GetManifestResponse = OneWhackResponse<OneWhackHostManifest>;
454
+ type GetManifestResponse = ClankerBendResponse<ClankerBendHostManifest>;
455
455
 
456
- type OneWhackHostManifest = {
457
- oneWhackVersion: "0.1";
456
+ type ClankerBendHostManifest = {
457
+ clankerbendVersion: "0.1";
458
458
  hostId: string;
459
459
  hostName: string;
460
- capabilities: OneWhackCapabilities;
460
+ capabilities: ClankerBendCapabilities;
461
461
  security?: {
462
462
  auth: "bearer" | "none";
463
463
  localDevInsecure?: boolean;
464
464
  };
465
- apps: OneWhackAppManifest[];
465
+ apps: ClankerBendAppManifest[];
466
466
  };
467
467
  ```
468
468
 
@@ -474,32 +474,32 @@ render a degraded state rather than attempting direct CDP or app-server access.
474
474
  The host exposes mounted apps through a registry.
475
475
 
476
476
  ```text
477
- GET /onewhack/apps
478
- GET /onewhack/apps/:appId/manifest
479
- GET /onewhack/apps/:appId/state
480
- GET /onewhack/apps/:appId/actions/:actionId
481
- POST /onewhack/apps/:appId/actions
477
+ GET /clankerbend/apps
478
+ GET /clankerbend/apps/:appId/manifest
479
+ GET /clankerbend/apps/:appId/state
480
+ GET /clankerbend/apps/:appId/actions/:actionId
481
+ POST /clankerbend/apps/:appId/actions
482
482
  ```
483
483
 
484
484
  The registry lets one host serve multiple apps without each app owning a
485
485
  separate CDP adapter or injected bridge.
486
486
 
487
487
  ```ts
488
- type GetAppsResponse = OneWhackResponse<{
489
- apps: OneWhackAppSummary[];
488
+ type GetAppsResponse = ClankerBendResponse<{
489
+ apps: ClankerBendAppSummary[];
490
490
  }>;
491
491
 
492
- type OneWhackAppSummary = {
492
+ type ClankerBendAppSummary = {
493
493
  appId: string;
494
494
  name: string;
495
- status: OneWhackAppStatus;
495
+ status: ClankerBendAppStatus;
496
496
  entry?: string;
497
497
  };
498
498
 
499
- type GetAppManifestResponse = OneWhackResponse<OneWhackAppManifest>;
500
- type GetAppStateResponse = OneWhackResponse<OneWhackAppState>;
499
+ type GetAppManifestResponse = ClankerBendResponse<ClankerBendAppManifest>;
500
+ type GetAppStateResponse = ClankerBendResponse<ClankerBendAppState>;
501
501
 
502
- type OneWhackAppStatus =
502
+ type ClankerBendAppStatus =
503
503
  | "mounted"
504
504
  | "loading"
505
505
  | "ready"
@@ -507,15 +507,15 @@ type OneWhackAppStatus =
507
507
  | "disabled"
508
508
  | "error";
509
509
 
510
- type OneWhackAppManifest = {
511
- oneWhackVersion: "0.1";
510
+ type ClankerBendAppManifest = {
511
+ clankerbendVersion: "0.1";
512
512
  appId: string;
513
513
  version: string;
514
514
  name: string;
515
515
  description?: string;
516
516
  entry: string;
517
- distribution?: OneWhackAppDistribution;
518
- entrypoint?: OneWhackAppEntrypoint;
517
+ distribution?: ClankerBendAppDistribution;
518
+ entrypoint?: ClankerBendAppEntrypoint;
519
519
  capabilities?: {
520
520
  panel?: boolean;
521
521
  annotations?: boolean;
@@ -554,11 +554,11 @@ type OneWhackAppManifest = {
554
554
  reloadPolicy: "preserve" | "reload";
555
555
  preferredWidth?: number;
556
556
  };
557
- rendererBridge?: OneWhackRendererBridgeManifest;
558
- lifecycle?: OneWhackAppLifecycleManifest;
557
+ rendererBridge?: ClankerBendRendererBridgeManifest;
558
+ lifecycle?: ClankerBendAppLifecycleManifest;
559
559
  };
560
560
 
561
- type OneWhackAppDistribution = {
561
+ type ClankerBendAppDistribution = {
562
562
  kind: "local" | "npm" | "tarball" | "binary";
563
563
  source?: string;
564
564
  integrity?: string;
@@ -569,7 +569,7 @@ type OneWhackAppDistribution = {
569
569
  };
570
570
  };
571
571
 
572
- type OneWhackAppEntrypoint = {
572
+ type ClankerBendAppEntrypoint = {
573
573
  kind: "module" | "binary" | "static";
574
574
  module?: string;
575
575
  factory?: string;
@@ -578,7 +578,7 @@ type OneWhackAppEntrypoint = {
578
578
  publicDir?: string;
579
579
  };
580
580
 
581
- type OneWhackRendererBridgeManifest = {
581
+ type ClankerBendRendererBridgeManifest = {
582
582
  script: string;
583
583
  primary?: boolean;
584
584
  provides?: (
@@ -597,7 +597,7 @@ type OneWhackRendererBridgeManifest = {
597
597
  };
598
598
  };
599
599
 
600
- type OneWhackAppLifecycleManifest = {
600
+ type ClankerBendAppLifecycleManifest = {
601
601
  install?: { kind: string };
602
602
  start?: { kind: string };
603
603
  stop?: { kind: string };
@@ -613,14 +613,14 @@ approval rules.
613
613
 
614
614
  ```ts
615
615
  type PostAppActionRequest = {
616
- action: OneWhackAction;
616
+ action: ClankerBendAction;
617
617
  };
618
618
 
619
- type PostAppActionResponse = OneWhackResponse<
620
- OneWhackActionResult | OneWhackActionReceipt
619
+ type PostAppActionResponse = ClankerBendResponse<
620
+ ClankerBendActionResult | ClankerBendActionReceipt
621
621
  >;
622
622
 
623
- type OneWhackAction = {
623
+ type ClankerBendAction = {
624
624
  actionId: string;
625
625
  appId: string;
626
626
  type: string;
@@ -631,7 +631,7 @@ type OneWhackAction = {
631
631
  requestedAt: string;
632
632
  };
633
633
 
634
- type OneWhackActionReceipt = {
634
+ type ClankerBendActionReceipt = {
635
635
  actionId: string;
636
636
  appId: string;
637
637
  accepted: true;
@@ -639,7 +639,7 @@ type OneWhackActionReceipt = {
639
639
  resultUrl?: string;
640
640
  };
641
641
 
642
- type OneWhackActionResult = {
642
+ type ClankerBendActionResult = {
643
643
  actionId: string;
644
644
  appId: string;
645
645
  ok: boolean;
@@ -663,7 +663,7 @@ Action rules:
663
663
  7. Unavailable adapters must return `503` with code `adapter_unavailable` or
664
664
  `capability_unavailable`.
665
665
  8. When `resultUrl` is present, it must point to
666
- `/onewhack/apps/:appId/actions/:actionId`.
666
+ `/clankerbend/apps/:appId/actions/:actionId`.
667
667
  9. App handlers must return an action result with boolean `ok`. Invalid handler
668
668
  returns must fail with `500` and code `action_failed`.
669
669
 
@@ -676,12 +676,12 @@ this document, but they must follow the same action contract.
676
676
  Hosts must retain completed action results for at least 60 seconds.
677
677
 
678
678
  ```text
679
- GET /onewhack/apps/:appId/actions/:actionId
679
+ GET /clankerbend/apps/:appId/actions/:actionId
680
680
  ```
681
681
 
682
682
  ```ts
683
- type GetAppActionResponse = OneWhackResponse<
684
- OneWhackActionResult | OneWhackActionReceipt
683
+ type GetAppActionResponse = ClankerBendResponse<
684
+ ClankerBendActionResult | ClankerBendActionReceipt
685
685
  >;
686
686
  ```
687
687
 
@@ -689,24 +689,24 @@ This endpoint lets clients recover when they miss an SSE `action` event.
689
689
 
690
690
  ### App Lifecycle
691
691
 
692
- OneWhack `0.1` defines manifest-based app registration. A host may install apps
692
+ ClankerBend `0.1` defines manifest-based app registration. A host may install apps
693
693
  from local manifests, npm packages, tarballs, or binary-style bundles. Download
694
694
  and update transports are implementation details, but every installed app must
695
- resolve to a validated `OneWhackAppManifest`.
695
+ resolve to a validated `ClankerBendAppManifest`.
696
696
 
697
697
  The public launcher command is intentionally small:
698
698
 
699
699
  ```text
700
- clankerbend codex
700
+ clankerbend
701
701
  ```
702
702
 
703
703
  App installation, enablement, update, and removal are product configuration
704
- concerns owned by the running OneWhack experience. The registry model remains
704
+ concerns owned by the running ClankerBend experience. The registry model remains
705
705
  part of the host protocol, but apps should not depend on a public app-management
706
706
  CLI being present.
707
707
 
708
708
  Regardless of loading mechanism, a mounted app must appear in
709
- `GET /onewhack/apps`.
709
+ `GET /clankerbend/apps`.
710
710
 
711
711
  Lifecycle rules:
712
712
 
@@ -728,7 +728,7 @@ Lifecycle rules:
728
728
 
729
729
  ### Panel Model
730
730
 
731
- OneWhack `0.1` assumes one Codex Desktop side panel controlled by the host. The
731
+ ClankerBend `0.1` assumes one Codex Desktop side panel controlled by the host. The
732
732
  host may implement that side panel as:
733
733
 
734
734
  - a shared shell that routes between mounted apps, or
@@ -737,9 +737,9 @@ host may implement that side panel as:
737
737
  In either model:
738
738
 
739
739
  1. `PanelStatus.activeAppId` identifies the app currently shown when known.
740
- 2. `POST /onewhack/panel/open` opens or focuses the host panel and may switch
740
+ 2. `POST /clankerbend/panel/open` opens or focuses the host panel and may switch
741
741
  the active panel app by `appId`.
742
- 3. `POST /onewhack/apps/:appId/actions` may switch the active app when the
742
+ 3. `POST /clankerbend/apps/:appId/actions` may switch the active app when the
743
743
  action requires app UI.
744
744
  4. Opening an already-loaded panel must not reload the page unless the app
745
745
  manifest uses `reloadPolicy: "reload"`.
@@ -749,13 +749,13 @@ In either model:
749
749
 
750
750
  ### Launch
751
751
 
752
- OneWhack can launch Codex Desktop with CDP:
752
+ ClankerBend can launch Codex Desktop with CDP:
753
753
 
754
754
  ```sh
755
755
  /Applications/Codex.app/Contents/MacOS/Codex \
756
756
  --remote-debugging-address=127.0.0.1 \
757
757
  --remote-debugging-port=<free> \
758
- --user-data-dir=<test-or-onewhack-profile>
758
+ --user-data-dir=<test-or-clankerbend-profile>
759
759
  ```
760
760
 
761
761
  The host must not patch `/Applications/Codex.app`.
@@ -787,14 +787,14 @@ type DesktopStatus = {
787
787
  The CDP adapter initializes a single renderer runtime at:
788
788
 
789
789
  ```ts
790
- window.__oneWhackRuntime
790
+ window.__clankerbendRuntime
791
791
  ```
792
792
 
793
793
  Apps register into runtime-owned app slots. The runtime is the only privileged
794
794
  renderer global; individual apps must not require their own global bridge names.
795
795
 
796
796
  ```ts
797
- type OneWhackRendererRuntime = {
797
+ type ClankerBendRendererRuntime = {
798
798
  protocolVersion: string;
799
799
  hostUrl: string;
800
800
  apps: Record<string, RendererAppSlot>;
@@ -874,7 +874,7 @@ type RendererSnapshot = {
874
874
  anchors: TranscriptAnchor[];
875
875
  visibleCount: number;
876
876
  annotationCount: number;
877
- selection: OneWhackSelection | null;
877
+ selection: ClankerBendSelection | null;
878
878
  };
879
879
  ```
880
880
 
@@ -919,11 +919,11 @@ app-server identity.
919
919
 
920
920
  ### Identity Tiers
921
921
 
922
- OneWhack uses separate identity tiers because exact app-server-to-DOM mapping is
922
+ ClankerBend uses separate identity tiers because exact app-server-to-DOM mapping is
923
923
  not always available.
924
924
 
925
925
  ```ts
926
- type OneWhackIdentity = {
926
+ type ClankerBendIdentity = {
927
927
  anchorId?: string;
928
928
  entryId?: string;
929
929
  markerId?: string;
@@ -1054,7 +1054,7 @@ Annotation ownership rules:
1054
1054
  3. Lower `priority` values render earlier; omitted priority defaults to `100`.
1055
1055
  Ties sort by `appId`, then `markerId`, both lexicographically.
1056
1056
  4. Marker clicks route to the contributing app through
1057
- `POST /onewhack/apps/:appId/actions`.
1057
+ `POST /clankerbend/apps/:appId/actions`.
1058
1058
  5. The renderer bridge must remove stale markers for an app without removing
1059
1059
  markers owned by other apps.
1060
1060
  6. Marker identity is scoped by `(appId, markerId)`. Two apps may use the same
@@ -1069,10 +1069,10 @@ Annotation ownership rules:
1069
1069
 
1070
1070
  The panel talks only to the host server. It does not need direct CDP access.
1071
1071
 
1072
- ### `POST /onewhack/panel/open`
1072
+ ### `POST /clankerbend/panel/open`
1073
1073
 
1074
1074
  Asks the host to open/focus the panel in Codex Desktop. The host calls
1075
- `window.__oneWhackRuntime.getBridge(activeAppId).openPanel()` or an equivalent
1075
+ `window.__clankerbendRuntime.getBridge(activeAppId).openPanel()` or an equivalent
1076
1076
  app-id-scoped bridge call via CDP.
1077
1077
 
1078
1078
  ```ts
@@ -1085,10 +1085,10 @@ When `appId` is provided, the host must set `PanelStatus.activeAppId` to that
1085
1085
  registered app before loading the panel URL. Unknown app ids return `404`.
1086
1086
 
1087
1087
  ```ts
1088
- type OpenPanelResponse = OneWhackResponse<PanelOpenResult>;
1088
+ type OpenPanelResponse = ClankerBendResponse<PanelOpenResult>;
1089
1089
  ```
1090
1090
 
1091
- ### `POST /onewhack/transcript/scroll`
1091
+ ### `POST /clankerbend/transcript/scroll`
1092
1092
 
1093
1093
  ```json
1094
1094
  {
@@ -1105,10 +1105,10 @@ type ScrollToAnchorRequest = {
1105
1105
  block?: "start" | "center" | "end" | "nearest";
1106
1106
  };
1107
1107
 
1108
- type ScrollToAnchorResponse = OneWhackResponse<ScrollResult>;
1108
+ type ScrollToAnchorResponse = ClankerBendResponse<ScrollResult>;
1109
1109
  ```
1110
1110
 
1111
- ### `POST /onewhack/transcript/highlight`
1111
+ ### `POST /clankerbend/transcript/highlight`
1112
1112
 
1113
1113
  ```json
1114
1114
  {
@@ -1123,10 +1123,10 @@ type HighlightAnchorRequest = {
1123
1123
  durationMs?: number;
1124
1124
  };
1125
1125
 
1126
- type HighlightAnchorResponse = OneWhackResponse<HighlightResult>;
1126
+ type HighlightAnchorResponse = ClankerBendResponse<HighlightResult>;
1127
1127
  ```
1128
1128
 
1129
- ### `POST /onewhack/selection`
1129
+ ### `POST /clankerbend/selection`
1130
1130
 
1131
1131
  Updates global host selection.
1132
1132
 
@@ -1145,11 +1145,11 @@ Updates global host selection.
1145
1145
 
1146
1146
  ```ts
1147
1147
  type PostSelectionRequest = {
1148
- selection: OneWhackSelection;
1148
+ selection: ClankerBendSelection;
1149
1149
  };
1150
1150
 
1151
- type PostSelectionResponse = OneWhackResponse<{
1152
- selection: OneWhackSelection;
1151
+ type PostSelectionResponse = ClankerBendResponse<{
1152
+ selection: ClankerBendSelection;
1153
1153
  stale?: boolean;
1154
1154
  }>;
1155
1155
  ```
@@ -1160,14 +1160,14 @@ is older than the current accepted selection. If two selections have the same
1160
1160
  assign a monotonically increasing `sequence` and `acceptedAt` timestamp.
1161
1161
 
1162
1162
  ```ts
1163
- type OneWhackSelection = {
1163
+ type ClankerBendSelection = {
1164
1164
  selectionId: string;
1165
1165
  sequence?: number;
1166
1166
  source: "panel" | "transcript" | "adapter";
1167
1167
  appId?: string;
1168
1168
  anchorId?: string;
1169
1169
  quote?: string;
1170
- range?: OneWhackTextRange;
1170
+ range?: ClankerBendTextRange;
1171
1171
  markerId?: string;
1172
1172
  entryId?: string;
1173
1173
  appServer?: {
@@ -1188,10 +1188,10 @@ older transcript click after the user selected a newer side-panel entry.
1188
1188
 
1189
1189
  Apps must not inspect Codex Desktop DOM to interpret selected text. When the
1190
1190
  adapter observes a transcript text selection, it normalizes that selection into
1191
- a `OneWhackTextRange` and updates host `selection`.
1191
+ a `ClankerBendTextRange` and updates host `selection`.
1192
1192
 
1193
1193
  ```ts
1194
- type OneWhackTextRange = {
1194
+ type ClankerBendTextRange = {
1195
1195
  anchorId: string;
1196
1196
  text: string;
1197
1197
  quote?: string;
@@ -1208,12 +1208,12 @@ Apps may store them for later source matching, but they must treat `anchorId`
1208
1208
  plus selected `text` as the only required fields.
1209
1209
 
1210
1210
  ```text
1211
- POST /onewhack/transcript/highlight-range
1211
+ POST /clankerbend/transcript/highlight-range
1212
1212
  ```
1213
1213
 
1214
1214
  ```ts
1215
1215
  type PostHighlightRangeRequest = {
1216
- range: OneWhackTextRange;
1216
+ range: ClankerBendTextRange;
1217
1217
  durationMs?: number;
1218
1218
  behavior?: "auto" | "smooth";
1219
1219
  block?: "start" | "center" | "end" | "nearest";
@@ -1229,7 +1229,7 @@ Apps can contribute actions for host-rendered transcript selection menus through
1229
1229
  app state. The host or renderer runtime owns menu placement and click routing.
1230
1230
 
1231
1231
  ```ts
1232
- type OneWhackSelectionAction = {
1232
+ type ClankerBendSelectionAction = {
1233
1233
  actionId: string;
1234
1234
  appId: string;
1235
1235
  type: string;
@@ -1242,7 +1242,7 @@ type OneWhackSelectionAction = {
1242
1242
  ```
1243
1243
 
1244
1244
  When the user chooses a selection action, the host sends a normal
1245
- `POST /onewhack/apps/:appId/actions` request with the current selection in the
1245
+ `POST /clankerbend/apps/:appId/actions` request with the current selection in the
1246
1246
  action payload or app context.
1247
1247
 
1248
1248
  ### Anchored Overlays
@@ -1251,31 +1251,31 @@ Apps can request a host-rendered overlay anchored to an anchor or text range.
1251
1251
  Apps provide fields and actions; the host/adapter owns DOM placement.
1252
1252
 
1253
1253
  ```text
1254
- POST /onewhack/overlay/open
1255
- POST /onewhack/overlay/close
1254
+ POST /clankerbend/overlay/open
1255
+ POST /clankerbend/overlay/close
1256
1256
  ```
1257
1257
 
1258
1258
  ```ts
1259
- type OneWhackOverlay = {
1259
+ type ClankerBendOverlay = {
1260
1260
  overlayId: string;
1261
1261
  appId: string;
1262
1262
  kind: "form" | "menu" | "notice";
1263
1263
  title?: string;
1264
1264
  anchorId?: string;
1265
- range?: OneWhackTextRange;
1266
- fields?: OneWhackOverlayField[];
1267
- actions?: OneWhackOverlayAction[];
1265
+ range?: ClankerBendTextRange;
1266
+ fields?: ClankerBendOverlayField[];
1267
+ actions?: ClankerBendOverlayAction[];
1268
1268
  openedAt?: string;
1269
1269
  };
1270
1270
 
1271
- type OneWhackOverlayField = {
1271
+ type ClankerBendOverlayField = {
1272
1272
  fieldId: string;
1273
1273
  kind: "text" | "textarea" | "hidden";
1274
1274
  label?: string;
1275
1275
  value?: string;
1276
1276
  };
1277
1277
 
1278
- type OneWhackOverlayAction = {
1278
+ type ClankerBendOverlayAction = {
1279
1279
  label: string;
1280
1280
  type: string;
1281
1281
  payload?: unknown;
@@ -1289,8 +1289,8 @@ host. Apps add/remove items and ask the host to serialize them into a draft; the
1289
1289
  adapter owns Codex composer DOM details.
1290
1290
 
1291
1291
  ```ts
1292
- type OneWhackComposerState = {
1293
- contextItems: OneWhackComposerContextItem[];
1292
+ type ClankerBendComposerState = {
1293
+ contextItems: ClankerBendComposerContextItem[];
1294
1294
  draft: {
1295
1295
  text: string;
1296
1296
  mode: "replace" | "append" | "prepend";
@@ -1300,13 +1300,13 @@ type OneWhackComposerState = {
1300
1300
  lastSubmittedAt?: string;
1301
1301
  };
1302
1302
 
1303
- type OneWhackComposerContextItem = {
1303
+ type ClankerBendComposerContextItem = {
1304
1304
  itemId: string;
1305
1305
  appId: string;
1306
1306
  label: string;
1307
1307
  body: string;
1308
1308
  anchorId?: string;
1309
- range?: OneWhackTextRange;
1309
+ range?: ClankerBendTextRange;
1310
1310
  status: "queued" | "sent" | "resolved";
1311
1311
  createdAt?: string;
1312
1312
  updatedAt?: string;
@@ -1314,10 +1314,10 @@ type OneWhackComposerContextItem = {
1314
1314
  ```
1315
1315
 
1316
1316
  ```text
1317
- POST /onewhack/composer/context
1318
- POST /onewhack/composer/context/remove
1319
- POST /onewhack/composer/draft
1320
- POST /onewhack/composer/submit
1317
+ POST /clankerbend/composer/context
1318
+ POST /clankerbend/composer/context/remove
1319
+ POST /clankerbend/composer/draft
1320
+ POST /clankerbend/composer/submit
1321
1321
  ```
1322
1322
 
1323
1323
  `/composer/draft` accepts `{ text, mode, contextItemIds }`. `/composer/submit`
@@ -1333,9 +1333,9 @@ The bridge records events in renderer globals:
1333
1333
 
1334
1334
  ```ts
1335
1335
  type RendererEventBuffer = {
1336
- selection?: OneWhackSelection;
1336
+ selection?: ClankerBendSelection;
1337
1337
  panelOpen?: PanelOpenResult & { at: string };
1338
- hostEvents?: OneWhackRendererHostEvent[];
1338
+ hostEvents?: ClankerBendRendererHostEvent[];
1339
1339
  };
1340
1340
  ```
1341
1341
 
@@ -1345,10 +1345,10 @@ chips, the renderer queues typed host events. The CDP adapter drains those
1345
1345
  events and invokes the same host APIs that app panels use.
1346
1346
 
1347
1347
  ```ts
1348
- type OneWhackRendererHostEvent =
1348
+ type ClankerBendRendererHostEvent =
1349
1349
  | {
1350
1350
  kind: "selection";
1351
- selection: OneWhackSelection;
1351
+ selection: ClankerBendSelection;
1352
1352
  }
1353
1353
  | {
1354
1354
  kind: "appAction";
@@ -1367,7 +1367,7 @@ type OneWhackRendererHostEvent =
1367
1367
  }
1368
1368
  | {
1369
1369
  kind: "highlightRange";
1370
- range: OneWhackTextRange;
1370
+ range: ClankerBendTextRange;
1371
1371
  }
1372
1372
  | {
1373
1373
  kind: "highlightAnchor";
@@ -1380,25 +1380,25 @@ host HTTP endpoints directly as an optimization.
1380
1380
 
1381
1381
  ## App State
1382
1382
 
1383
- OneWhack does not prescribe an app state provider. App state can come from
1383
+ ClankerBend does not prescribe an app state provider. App state can come from
1384
1384
  app-server, a local audit system, an MCP server, a test runner, a diagnostics
1385
1385
  collector, a bookmark store, an editor-navigation model, or simple DOM
1386
1386
  inference.
1387
1387
 
1388
1388
  ```ts
1389
- type OneWhackAppState = {
1389
+ type ClankerBendAppState = {
1390
1390
  appId: string;
1391
- status: OneWhackAppStatus;
1391
+ status: ClankerBendAppStatus;
1392
1392
  source: string;
1393
1393
  connected: boolean;
1394
- entries: OneWhackAppEntry[];
1394
+ entries: ClankerBendAppEntry[];
1395
1395
  annotations?: AnchorAnnotation[];
1396
- commands?: OneWhackCommand[];
1397
- selectionActions?: OneWhackSelectionAction[];
1396
+ commands?: ClankerBendCommand[];
1397
+ selectionActions?: ClankerBendSelectionAction[];
1398
1398
  updatedAt?: string;
1399
1399
  };
1400
1400
 
1401
- type OneWhackAppEntry = {
1401
+ type ClankerBendAppEntry = {
1402
1402
  entryId: string;
1403
1403
  appId: string;
1404
1404
  anchorId?: string;
@@ -1418,7 +1418,7 @@ type OneWhackAppEntry = {
1418
1418
  occurredAt?: string;
1419
1419
  };
1420
1420
 
1421
- type OneWhackCommand = {
1421
+ type ClankerBendCommand = {
1422
1422
  commandId: string;
1423
1423
  appId: string;
1424
1424
  label: string;
@@ -1429,13 +1429,13 @@ type OneWhackCommand = {
1429
1429
  };
1430
1430
  ```
1431
1431
 
1432
- Panel UIs should render `OneWhackAppEntry[]` without knowing the provider. A
1432
+ Panel UIs should render `ClankerBendAppEntry[]` without knowing the provider. A
1433
1433
  timeline, review list, trace viewer, bookmark list, or diagnostics stream can
1434
1434
  all be represented as entries bound optionally to transcript anchors.
1435
1435
 
1436
1436
  ## App-Server Adapter
1437
1437
 
1438
- The app-server adapter is separate from Desktop control. OneWhack hosts are
1438
+ The app-server adapter is separate from Desktop control. ClankerBend hosts are
1439
1439
  app-server-aware and report app-server status even when they cannot connect.
1440
1440
 
1441
1441
  Useful app-server methods include:
@@ -1450,7 +1450,7 @@ Useful app-server methods include:
1450
1450
  - approval request/response methods
1451
1451
  - `thread/rollback`
1452
1452
 
1453
- OneWhack should expose app-server data as correlation metadata, not as a replacement
1453
+ ClankerBend should expose app-server data as correlation metadata, not as a replacement
1454
1454
  transport.
1455
1455
 
1456
1456
  ```ts
@@ -1463,39 +1463,39 @@ type AppServerStatus = {
1463
1463
  ```
1464
1464
 
1465
1465
  If an app sends approval responses through app-server, that path must be
1466
- explicit and user-driven. OneWhack must not auto-approve or auto-deny actions.
1466
+ explicit and user-driven. ClankerBend must not auto-approve or auto-deny actions.
1467
1467
 
1468
1468
  ## Minimal Endpoint Set
1469
1469
 
1470
- A OneWhack host must implement these endpoints:
1470
+ A ClankerBend host must implement these endpoints:
1471
1471
 
1472
1472
  ```text
1473
- GET /onewhack/manifest
1474
- GET /onewhack/state
1475
- GET /onewhack/events
1476
- GET /onewhack/apps
1477
- GET /onewhack/apps/:appId/manifest
1478
- GET /onewhack/apps/:appId/state
1479
- GET /onewhack/apps/:appId/actions/:actionId
1480
- POST /onewhack/apps/:appId/actions
1481
- POST /onewhack/panel/open
1482
- POST /onewhack/transcript/scroll
1483
- POST /onewhack/transcript/highlight
1484
- POST /onewhack/selection
1473
+ GET /clankerbend/manifest
1474
+ GET /clankerbend/state
1475
+ GET /clankerbend/events
1476
+ GET /clankerbend/apps
1477
+ GET /clankerbend/apps/:appId/manifest
1478
+ GET /clankerbend/apps/:appId/state
1479
+ GET /clankerbend/apps/:appId/actions/:actionId
1480
+ POST /clankerbend/apps/:appId/actions
1481
+ POST /clankerbend/panel/open
1482
+ POST /clankerbend/transcript/scroll
1483
+ POST /clankerbend/transcript/highlight
1484
+ POST /clankerbend/selection
1485
1485
  ```
1486
1486
 
1487
1487
  ## Manifest
1488
1488
 
1489
- OneWhack hosts and apps describe themselves with manifests. Manifests are
1489
+ ClankerBend hosts and apps describe themselves with manifests. Manifests are
1490
1490
  normative for the host launcher, app registry, and panel UI; Codex Desktop does
1491
1491
  not need to understand them. A packaged app should keep its manifest on disk,
1492
1492
  and a running host must expose resolved manifests through the host API.
1493
1493
 
1494
1494
  ```json
1495
1495
  {
1496
- "oneWhackVersion": "0.1",
1497
- "hostId": "onewill.onewhack.local",
1498
- "hostName": "OneWhack Host",
1496
+ "clankerbendVersion": "0.1",
1497
+ "hostId": "onewill.clankerbend.local",
1498
+ "hostName": "ClankerBend Host",
1499
1499
  "security": {
1500
1500
  "auth": "bearer",
1501
1501
  "localDevInsecure": false
@@ -1533,7 +1533,7 @@ and a running host must expose resolved manifests through the host API.
1533
1533
  },
1534
1534
  "apps": [
1535
1535
  {
1536
- "oneWhackVersion": "0.1",
1536
+ "clankerbendVersion": "0.1",
1537
1537
  "appId": "example.app",
1538
1538
  "version": "0.1.0",
1539
1539
  "name": "Example App",
@@ -1582,9 +1582,9 @@ and a running host must expose resolved manifests through the host API.
1582
1582
  }
1583
1583
  ```
1584
1584
 
1585
- ## Public Example: Vim Navigator App
1585
+ ## Public Example: VimNav App
1586
1586
 
1587
- The public reference app for OneWhack `0.1` is a Vim-style transcript navigator.
1587
+ The public reference app for ClankerBend `0.1` is VimNav, a Vim-style transcript navigator.
1588
1588
  Other apps should use the same host/app contract and document any app-specific
1589
1589
  state or action vocabulary they expose.
1590
1590
 
@@ -1592,10 +1592,10 @@ state or action vocabulary they expose.
1592
1592
 
1593
1593
  ```json
1594
1594
  {
1595
- "oneWhackVersion": "0.1",
1595
+ "clankerbendVersion": "0.1",
1596
1596
  "appId": "onewill.vim-nav",
1597
1597
  "version": "0.1.0",
1598
- "name": "OneWill VimNav",
1598
+ "name": "VimNav",
1599
1599
  "entry": "http://127.0.0.1:49152/apps/onewill.vim-nav/",
1600
1600
  "distribution": {
1601
1601
  "kind": "local",
@@ -1605,7 +1605,7 @@ state or action vocabulary they expose.
1605
1605
  "entrypoint": {
1606
1606
  "kind": "module",
1607
1607
  "module": "./src/vim-nav-app.js",
1608
- "factory": "createVimNavigatorApp",
1608
+ "factory": "createVimNavApp",
1609
1609
  "publicDir": "./public"
1610
1610
  },
1611
1611
  "capabilities": {
@@ -1632,7 +1632,7 @@ state or action vocabulary they expose.
1632
1632
  "appServerRollback": false
1633
1633
  },
1634
1634
  "panel": {
1635
- "title": "Vim Nav",
1635
+ "title": "VimNav",
1636
1636
  "reloadPolicy": "preserve",
1637
1637
  "preferredWidth": 360
1638
1638
  }
@@ -1738,7 +1738,7 @@ state or action vocabulary they expose.
1738
1738
 
1739
1739
  ## Security And Lifecycle
1740
1740
 
1741
- OneWhack is local integration glue, not a sandbox or security boundary. The
1741
+ ClankerBend is local integration glue, not a sandbox or security boundary. The
1742
1742
  host still needs explicit safety rules because it can reach CDP, app-server,
1743
1743
  and user-visible UI.
1744
1744
 
@@ -1755,7 +1755,7 @@ and user-visible UI.
1755
1755
  App manifests declare requested permissions. The host must enforce them.
1756
1756
 
1757
1757
  ```ts
1758
- type OneWhackAppPermissions = {
1758
+ type ClankerBendAppPermissions = {
1759
1759
  transcriptRead?: boolean;
1760
1760
  transcriptAnnotate?: boolean;
1761
1761
  transcriptNavigate?: boolean;
@@ -1765,7 +1765,7 @@ type OneWhackAppPermissions = {
1765
1765
  };
1766
1766
  ```
1767
1767
 
1768
- For OneWhack `0.1`, an explicit `false` means the host must deny that
1768
+ For ClankerBend `0.1`, an explicit `false` means the host must deny that
1769
1769
  capability. Omitted permissions are interpreted by host policy, but reference
1770
1770
  hosts should treat omitted transcript permissions as allowed for local
1771
1771
  development apps. A host that denies `transcriptRead` must provide an empty
@@ -1784,7 +1784,7 @@ user-driven, and visible in app state.
1784
1784
  - Prefer launching through the host so CDP is enabled at process startup.
1785
1785
  - Attach to an already-running Desktop session only when CDP is already
1786
1786
  available.
1787
- - Use a test or OneWhack profile when launching Desktop unless the user
1787
+ - Use a test or ClankerBend profile when launching Desktop unless the user
1788
1788
  explicitly requests their normal profile.
1789
1789
  - Clean up host-launched Codex and Node processes on exit.
1790
1790
 
@@ -1797,27 +1797,27 @@ user-driven, and visible in app state.
1797
1797
 
1798
1798
  ## Appendix: Non-Normative Reference Mapping
1799
1799
 
1800
- The public Vim Navigator example maps implementation files to OneWhack terms as
1800
+ The public VimNav example maps implementation files to ClankerBend terms as
1801
1801
  follows:
1802
1802
 
1803
- | Vim Navigator implementation | OneWhack term |
1803
+ | VimNav implementation | ClankerBend term |
1804
1804
  | --- | --- |
1805
- | `onewhack/host/src/index.js` | Reusable OneWhack Host |
1806
- | `onewhack/apps/vim-nav/server.mjs` | Host launcher registering one app |
1807
- | `onewhack/apps/vim-nav/src/vim-nav-app.js` | Vim Navigator app manifest, state, and actions |
1808
- | `onewhack/apps/vim-nav/public/index.html` | Hosted app panel |
1809
- | `onewhack/apps/vim-nav/public/app.js` | App client |
1810
- | `onewhack/apps/vim-nav/public/styles.css` | App panel styling |
1811
- | `onewhack/host/src/codex-desktop-renderer-bridge.js` | Host-owned injected renderer bridge |
1805
+ | `clankerbend/host/src/index.js` | Reusable ClankerBend Host |
1806
+ | `clankerbend/apps/vim-nav/server.mjs` | Host launcher registering one app |
1807
+ | `clankerbend/apps/vim-nav/src/vim-nav-app.js` | VimNav app manifest, state, and actions |
1808
+ | `clankerbend/apps/vim-nav/public/index.html` | Hosted app panel |
1809
+ | `clankerbend/apps/vim-nav/public/app.js` | App client |
1810
+ | `clankerbend/apps/vim-nav/public/styles.css` | App panel styling |
1811
+ | `clankerbend/host/src/codex-desktop-renderer-bridge.js` | Host-owned injected renderer bridge |
1812
1812
  | CDP `Runtime.evaluate` | Desktop CDP Adapter call, not used by mock tests |
1813
- | `window.__oneWhackRuntime.getBridge("onewill.vim-nav").snapshot()` | `RendererBridge.snapshot()` |
1814
- | `window.__oneWhackRuntime.getBridge("onewill.vim-nav").openPanel()` | `RendererBridge.openPanel()` |
1815
- | `window.__oneWhackRuntime.getBridge("onewill.vim-nav").scrollToAnchor(anchorId)` | `scrollToAnchor(anchorId)` |
1816
- | `window.__oneWhackRuntime.getBridge("onewill.vim-nav").highlightAnchor(anchorId)` | `highlightAnchor(anchorId)` |
1813
+ | `window.__clankerbendRuntime.getBridge("onewill.vim-nav").snapshot()` | `RendererBridge.snapshot()` |
1814
+ | `window.__clankerbendRuntime.getBridge("onewill.vim-nav").openPanel()` | `RendererBridge.openPanel()` |
1815
+ | `window.__clankerbendRuntime.getBridge("onewill.vim-nav").scrollToAnchor(anchorId)` | `scrollToAnchor(anchorId)` |
1816
+ | `window.__clankerbendRuntime.getBridge("onewill.vim-nav").highlightAnchor(anchorId)` | `highlightAnchor(anchorId)` |
1817
1817
  | numbered transcript ruler pills | `AnchorAnnotation.markers` |
1818
- | `/onewhack/apps/onewill.vim-nav/state` | App state endpoint |
1819
- | `/onewhack/apps/onewill.vim-nav/actions` | App action endpoint |
1820
- | `onewhack/apps/vim-nav/test-onewhack.mjs` | Fast host/app behavior e2e |
1818
+ | `/clankerbend/apps/onewill.vim-nav/state` | App state endpoint |
1819
+ | `/clankerbend/apps/onewill.vim-nav/actions` | App action endpoint |
1820
+ | `clankerbend/apps/vim-nav/test-clankerbend.mjs` | Fast host/app behavior e2e |
1821
1821
 
1822
1822
  ## Operational Rules
1823
1823
 
@@ -1832,7 +1832,7 @@ follows:
1832
1832
 
1833
1833
  ## Behavior Profiles
1834
1834
 
1835
- OneWhack `0.1` describes behavior in four profiles. Implementations should state
1835
+ ClankerBend `0.1` describes behavior in four profiles. Implementations should state
1836
1836
  which profiles they support and cover those behaviors with e2e tests.
1837
1837
 
1838
1838
  ### Core Host
@@ -1841,25 +1841,25 @@ A Core Host must implement:
1841
1841
 
1842
1842
  - JSON envelope and error model.
1843
1843
  - Session token behavior or explicit `localDevInsecure`.
1844
- - `GET /onewhack/manifest`.
1845
- - `GET /onewhack/state`.
1846
- - `GET /onewhack/events`.
1847
- - `GET /onewhack/apps`.
1848
- - `GET /onewhack/apps/:appId/manifest`.
1849
- - `GET /onewhack/apps/:appId/state`.
1850
- - `GET /onewhack/apps/:appId/actions/:actionId`.
1851
- - `POST /onewhack/apps/:appId/actions`.
1844
+ - `GET /clankerbend/manifest`.
1845
+ - `GET /clankerbend/state`.
1846
+ - `GET /clankerbend/events`.
1847
+ - `GET /clankerbend/apps`.
1848
+ - `GET /clankerbend/apps/:appId/manifest`.
1849
+ - `GET /clankerbend/apps/:appId/state`.
1850
+ - `GET /clankerbend/apps/:appId/actions/:actionId`.
1851
+ - `POST /clankerbend/apps/:appId/actions`.
1852
1852
  - App lifecycle states and permission enforcement.
1853
1853
 
1854
1854
  ### Transcript Host
1855
1855
 
1856
1856
  A Transcript Host is a Core Host that also implements:
1857
1857
 
1858
- - Transcript anchors in `OneWhackPublicState`.
1859
- - `POST /onewhack/panel/open`.
1860
- - `POST /onewhack/transcript/scroll`.
1861
- - `POST /onewhack/transcript/highlight`.
1862
- - `POST /onewhack/selection`.
1858
+ - Transcript anchors in `ClankerBendPublicState`.
1859
+ - `POST /clankerbend/panel/open`.
1860
+ - `POST /clankerbend/transcript/scroll`.
1861
+ - `POST /clankerbend/transcript/highlight`.
1862
+ - `POST /clankerbend/selection`.
1863
1863
  - Annotation ownership and merge rules.
1864
1864
 
1865
1865
  ### Codex Desktop Adapter
@@ -1873,48 +1873,48 @@ process cleanup.
1873
1873
 
1874
1874
  An App Client must:
1875
1875
 
1876
- - Read `GET /onewhack/manifest` and verify required capabilities.
1877
- - Use `GET /onewhack/apps/:appId/state` or `GET /onewhack/state` as its source
1876
+ - Read `GET /clankerbend/manifest` and verify required capabilities.
1877
+ - Use `GET /clankerbend/apps/:appId/state` or `GET /clankerbend/state` as its source
1878
1878
  of truth.
1879
- - Use `POST /onewhack/apps/:appId/actions` for app commands.
1880
- - Use `GET /onewhack/apps/:appId/actions/:actionId` to recover action results
1879
+ - Use `POST /clankerbend/apps/:appId/actions` for app commands.
1880
+ - Use `GET /clankerbend/apps/:appId/actions/:actionId` to recover action results
1881
1881
  when needed.
1882
- - Treat `OneWhackError` as the only failure contract.
1882
+ - Treat `ClankerBendError` as the only failure contract.
1883
1883
  - Degrade cleanly when capabilities or permissions are unavailable.
1884
1884
 
1885
1885
  ## Required E2E Coverage
1886
1886
 
1887
- A OneWhack `0.1` implementation should include fast e2e coverage for these
1887
+ A ClankerBend `0.1` implementation should include fast e2e coverage for these
1888
1888
  observable behaviors:
1889
1889
 
1890
- 1. `GET /onewhack/manifest` returns `ok: true`, `oneWhackVersion: "0.1"`,
1890
+ 1. `GET /clankerbend/manifest` returns `ok: true`, `clankerbendVersion: "0.1"`,
1891
1891
  host capabilities, security posture, and app manifests.
1892
- 2. `GET /onewhack/state` returns `ok: true` with `protocolName: "onewhack"`,
1892
+ 2. `GET /clankerbend/state` returns `ok: true` with `protocolName: "clankerbend"`,
1893
1893
  `protocolVersion: "0.1"`, numeric `sequence`, ISO `generatedAt`, host
1894
1894
  status, transcript state, app states, and app-server status.
1895
- 3. `GET /onewhack/events` emits an initial `state` event, monotonically
1895
+ 3. `GET /clankerbend/events` emits an initial `state` event, monotonically
1896
1896
  increasing event ids, and `heartbeat` events.
1897
- 4. Unknown apps return `404` with `OneWhackError.error.code: "not_found"`.
1897
+ 4. Unknown apps return `404` with `ClankerBendError.error.code: "not_found"`.
1898
1898
  5. Missing or invalid bearer tokens return `401` unless `localDevInsecure` is
1899
1899
  explicitly enabled.
1900
1900
  6. Duplicate `(appId, actionId)` submissions return the same receipt or result
1901
1901
  without executing twice.
1902
1902
  7. Async action completion is observable through both SSE `action` events and
1903
- `GET /onewhack/apps/:appId/actions/:actionId`.
1903
+ `GET /clankerbend/apps/:appId/actions/:actionId`.
1904
1904
  8. Stale selections return the current accepted selection with `stale: true`
1905
1905
  and do not change host `selection`.
1906
1906
  9. Annotation merge order is stable by `priority`, then `appId`, then
1907
1907
  `markerId`.
1908
1908
  10. Disabling or unmounting an app removes only that app's annotations.
1909
- 11. `POST /onewhack/transcript/scroll` and
1910
- `POST /onewhack/transcript/highlight` return `404` for unknown anchors and do
1909
+ 11. `POST /clankerbend/transcript/scroll` and
1910
+ `POST /clankerbend/transcript/highlight` return `404` for unknown anchors and do
1911
1911
  not mutate selection.
1912
1912
  12. Opening an already-loaded panel does not reload it when
1913
1913
  `reloadPolicy: "preserve"`.
1914
1914
 
1915
1915
  ## Versioning
1916
1916
 
1917
- OneWhack version `0.1` is the minimal hack-path protocol:
1917
+ ClankerBend version `0.1` is the minimal hack-path protocol:
1918
1918
 
1919
1919
  - local host state/event endpoints
1920
1920
  - host/app manifest negotiation
@@ -1931,5 +1931,5 @@ Future versions may add alternate adapters, but they should preserve the same
1931
1931
  host-facing concepts. Minor versions should add optional capabilities or fields
1932
1932
  behind capability checks. Major versions may change required fields or endpoint
1933
1933
  semantics, but a host must make that visible through `protocolVersion`,
1934
- `oneWhackVersion`, and `capabilities.protocolVersion` before app actions are
1934
+ `clankerbendVersion`, and `capabilities.protocolVersion` before app actions are
1935
1935
  required.