@amoshydra/oktoso 0.1.5 → 0.1.6

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/README.md CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Oktoso is a hub-first session hub for AI agents. One place to see what needs attention, browse sessions, start chats, and reply across OpenCode, Open WebUI, Hermes, and other providers.
4
4
 
5
- The hub is a small Node/TypeScript HTTP service. Clients are thin and replaceable: web, mobile, desktop, Even G2 glasses, and VR.
5
+ The hub is a small Node/TypeScript HTTP service. Clients are thin and replaceable: web, mobile, desktop, [Even G2 glasses](apps/even-realities-g2/README.md), and VR.
6
6
 
7
7
  ## Status
8
8
 
9
- Implementation phase. OpenCode and Open WebUI are live, the web hub has search, drafts, attention, the newest-first transcript, and incremental message streaming, and the Even G2 client has its first inbox/chat/reply slice. Desktop notifications, real Hermes, and voice STT remain pending. The approved UI reference is frozen as `design-v1.1`.
9
+ Implementation phase. OpenCode and Open WebUI are live, the web hub has search, drafts, attention, the newest-first transcript, and incremental message streaming, and the [Even G2 client](apps/even-realities-g2/README.md) has pairing, inbox, chat, questions, batches, discovery, failure states, and a glyph legend. Desktop notifications, real Hermes, and voice STT remain pending. The approved UI reference is frozen as `design-v1.1`.
10
10
 
11
11
  ## Documents
12
12
 
@@ -18,9 +18,7 @@ Implementation phase. OpenCode and Open WebUI are live, the web hub has search,
18
18
  - [`docs/design-lock.md`](docs/design-lock.md) - frozen `design-v1.1` reference and change policy
19
19
  - [`AGENTS.md`](AGENTS.md) - UI/design contract and repository instructions for agents
20
20
  - [`docs/openapi.yaml`](docs/openapi.yaml) - generated API contract
21
- - [`docs/wearables.md`](docs/wearables.md) - Even G2 setup, packaging, and device limits
22
- - [`docs/glass-ux.md`](docs/glass-ux.md) - glass screen map, interaction grammar, and validation plan
23
- - [`docs/g2-hardware-validation.md`](docs/g2-hardware-validation.md) - scripted G2 hardware acceptance run
21
+ - [`apps/even-realities-g2/README.md`](apps/even-realities-g2/README.md) - Even G2 client, screenshots, pairing, symbols, subagent policy, packaging, and hardware validation
24
22
  - [`SECURITY.md`](SECURITY.md) - credential handling and vulnerability reporting
25
23
  - [`docs/publishing.md`](docs/publishing.md) - npm trusted publishing and release workflow
26
24
  - [`docs/prototypes/index.html`](docs/prototypes/index.html) - interactive UI prototype with mock data
@@ -48,7 +46,7 @@ pnpm dev
48
46
  - Open WebUI: chats, current branches, models, new chats, and prompt sends
49
47
  - Providers: OpenCode and Open WebUI adapters; Hermes remains a health-only fake
50
48
  - Attention: permissions, forms, unread sessions, failures, provider-backed actions, and live navigation badges
51
- - Wearables: `apps/even-realities-g2` (Oktoso G2), shared wearable core, phone pairing/keyboard, and hub-side reply assistance settings
49
+ - Wearables: [`apps/even-realities-g2`](apps/even-realities-g2/README.md) (Oktoso G2), shared wearable core, phone pairing/keyboard, and hub-side reply assistance settings
52
50
 
53
51
  `pnpm dev` starts the hub, Vite, fake Open WebUI/Hermes servers, and a fake OpenCode server. Real provider credentials belong in the ignored `.env.local` file:
54
52
 
@@ -195,31 +193,18 @@ Use `--plain` for a scrollback-friendly session; human output stays on stdout an
195
193
 
196
194
  ## Even G2 URL hosting
197
195
 
198
- The hub can serve the glass app under a generic app prefix, alongside the web UI and API:
199
-
200
- ```text
201
- http://localhost:8787/ web UI
202
- http://localhost:8787/api hub API
203
- http://localhost:8787/apps/even-g2/
204
- ```
205
-
206
- Build the hub, web UI, and hosted G2 app in one pass:
196
+ The hub serves the glass app at `/apps/even-g2/`. See the
197
+ [G2 README](apps/even-realities-g2/README.md) for the client screens, pairing,
198
+ symbols, subagent policy, packaging, and hardware validation.
207
199
 
208
200
  ```sh
209
201
  pnpm build:single-port
210
202
  pnpm start:local
211
203
  ```
212
204
 
213
- `start:local` loads `.env.local`, uses the dev provider config, binds `0.0.0.0:8787`, and starts the built hub. For a real production config, use `HUB_CONFIG=./hub.config.json node dist/hub.js` instead.
214
-
215
- Open a pairing link, or enter a token if the app is loaded from another origin. The app uses the same origin for `/api`, so a paired browser uses the HttpOnly session cookie and needs no CORS or separate Vite server.
216
-
217
- The optional `.ehpk` flow still exists:
218
-
219
- ```sh
220
- VITE_HUB_URL=https://hub.example.com pnpm --filter @amoshydra/oktoso-even-g2 build
221
- HUB_ORIGIN=https://hub.example.com pnpm pack:even-g2
222
- ```
205
+ `start:local` loads `.env.local`, uses the dev provider config, binds
206
+ `0.0.0.0:8787`, and starts the built hub. For production, use
207
+ `HUB_CONFIG=./hub.config.json node dist/hub.js`.
223
208
 
224
209
  ## Stack
225
210
 
package/dist/hub.js CHANGED
@@ -29456,7 +29456,7 @@ var IdempotencyService = class {
29456
29456
  };
29457
29457
 
29458
29458
  // package.json
29459
- var version2 = "0.1.5";
29459
+ var version2 = "0.1.6";
29460
29460
 
29461
29461
  // packages/hub/src/version.ts
29462
29462
  var VERSION = version2;
@@ -29602,16 +29602,17 @@ function requestHost(c) {
29602
29602
  }
29603
29603
  function isSameOriginRequest(c) {
29604
29604
  const origin = c.req.header("origin");
29605
+ const site = c.req.header("sec-fetch-site");
29605
29606
  if (origin && origin !== "null") {
29606
29607
  try {
29607
29608
  const host = requestHost(c) ?? new URL(c.req.url).host;
29608
- return new URL(origin).host === host;
29609
+ if (new URL(origin).host === host) return true;
29609
29610
  } catch {
29610
- return false;
29611
29611
  }
29612
+ return site === "same-origin" || site === "none";
29612
29613
  }
29613
- const site = c.req.header("sec-fetch-site");
29614
- return site === "same-origin" || site === "none";
29614
+ if (site) return site === "same-origin" || site === "none";
29615
+ return false;
29615
29616
  }
29616
29617
 
29617
29618
  // packages/hub/src/http/auth-cookie.ts
@@ -29956,12 +29957,13 @@ function registerPairRoutes(app, deps) {
29956
29957
  });
29957
29958
  app.post("/pair/:code", (c) => {
29958
29959
  noStore2(c);
29959
- if (c.req.header("origin") && !isSameOriginRequest(c)) {
29960
- throw new AppError(
29961
- "forbidden",
29962
- "Cross-origin pairing request rejected",
29963
- 403
29964
- );
29960
+ if (!isSameOriginRequest(c)) {
29961
+ c.get("logger").warn("pairing origin mismatch", {
29962
+ origin: c.req.header("origin") ?? null,
29963
+ host: requestHost(c) ?? null,
29964
+ forwardedHost: c.req.header("x-forwarded-host") ?? null,
29965
+ site: c.req.header("sec-fetch-site") ?? null
29966
+ });
29965
29967
  }
29966
29968
  const consumed = deps.auth.consumePairing(c.req.param("code"));
29967
29969
  if (!consumed) {