@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 +10 -25
- package/dist/hub.js +13 -11
- package/dist/hub.js.map +1 -1
- package/package.json +1 -1
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
|
|
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
|
-
- [`
|
|
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
|
|
199
|
-
|
|
200
|
-
|
|
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
|
|
214
|
-
|
|
215
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
29614
|
-
return
|
|
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 (
|
|
29960
|
-
|
|
29961
|
-
"
|
|
29962
|
-
|
|
29963
|
-
|
|
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) {
|