push from SNAPKITTYWEST/kittybrowse
Browse files- .gitignore +7 -0
- LICENSE +59 -0
- README.md +63 -0
- crates/rust-vm-bridge/Cargo.lock +1684 -0
- crates/rust-vm-bridge/Cargo.toml +14 -0
- crates/rust-vm-bridge/src/lib.rs +267 -0
- crates/rust-vm-bridge/src/main.rs +20 -0
- docs/apl-wasm-runtime.md +26 -0
- docs/kitty-protocol-v1.md +48 -0
- docs/nats-rust-bridge.md +40 -0
- index.html +128 -0
- lineage/kittybrowse-shadow-handshake.json +116 -0
- package-lock.json +255 -0
- package.json +26 -0
- plugins/ide/vscode/kitty.plugin.json +13 -0
- plugins/vm/apl-wasm/kitty.plugin.json +20 -0
- plugins/vm/rust/kitty.plugin.json +14 -0
- scripts/copy-renderer.mjs +12 -0
- scripts/validate-handshake.mjs +43 -0
- scripts/write-handshake.mjs +119 -0
- src/main/main.ts +64 -0
- src/main/preload.ts +8 -0
- src/renderer/index.html +103 -0
- src/renderer/renderer.js +83 -0
- src/renderer/styles.css +188 -0
- src/runtime/adapters.ts +35 -0
- src/runtime/agent-runtime.ts +132 -0
- src/runtime/mesh.ts +112 -0
- src/runtime/plugins.ts +75 -0
- src/shared/entropy.ts +41 -0
- src/shared/protocol.ts +58 -0
- tests/entropy.test.ts +25 -0
- tests/handshake.test.ts +37 -0
- tests/runtime.test.ts +50 -0
- tsconfig.json +17 -0
.gitignore
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
node_modules/
|
| 2 |
+
dist/
|
| 3 |
+
target/
|
| 4 |
+
coverage/
|
| 5 |
+
*.log
|
| 6 |
+
.env
|
| 7 |
+
.env.*
|
LICENSE
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
SOVEREIGN SOURCE LICENSE v1.0
|
| 2 |
+
Copyright (c) 2026 Ahmad Ali Parr -- Bel Esprit D'Accord Trust
|
| 3 |
+
SnapKitty Collective -- All Sovereign Rights Reserved
|
| 4 |
+
|
| 5 |
+
WORM SEALED -- Evidence or Silence
|
| 6 |
+
|
| 7 |
+
GRANT OF RIGHTS
|
| 8 |
+
|
| 9 |
+
Permission is hereby granted, free of charge, to any person
|
| 10 |
+
obtaining a copy of this software and associated documentation
|
| 11 |
+
files (the "Work"), to use, study, copy, and modify the Work
|
| 12 |
+
for personal, educational, and non-commercial purposes, subject
|
| 13 |
+
to the following conditions:
|
| 14 |
+
|
| 15 |
+
1. ATTRIBUTION
|
| 16 |
+
All copies, modifications, or derivative works must carry
|
| 17 |
+
the following notice, visibly and without alteration:
|
| 18 |
+
|
| 19 |
+
"Built on Sovereign Source -- Bel Esprit D'Accord Trust
|
| 20 |
+
(c) 2026 Ahmad Ali Parr -- snapkittywest.github.io"
|
| 21 |
+
|
| 22 |
+
2. NON-COMMERCIAL USE
|
| 23 |
+
Commercial use of this Work -- including but not limited to
|
| 24 |
+
use in products, services, training datasets, or AI model
|
| 25 |
+
training -- requires express written permission from
|
| 26 |
+
Bel Esprit D'Accord Trust.
|
| 27 |
+
|
| 28 |
+
3. TRAINING DATA RESTRICTION
|
| 29 |
+
This Work and its contents may NOT be used to train, fine-tune,
|
| 30 |
+
evaluate, or benchmark any machine learning model, large language
|
| 31 |
+
model, or AI system without express written permission from
|
| 32 |
+
Bel Esprit D'Accord Trust. This restriction applies regardless
|
| 33 |
+
of whether the use is commercial or non-commercial.
|
| 34 |
+
|
| 35 |
+
4. SHARE-ALIKE
|
| 36 |
+
Any derivative work distributed publicly must be released
|
| 37 |
+
under this same Sovereign Source License v1.0 or later,
|
| 38 |
+
with full attribution chain preserved.
|
| 39 |
+
|
| 40 |
+
5. WORM INTEGRITY
|
| 41 |
+
Any redistribution must preserve all WORM chain seals,
|
| 42 |
+
cryptographic hashes, and audit trail entries present in
|
| 43 |
+
the original Work.
|
| 44 |
+
|
| 45 |
+
6. NO INSTITUTIONAL CAPTURE
|
| 46 |
+
No government agency, corporation, non-profit organization,
|
| 47 |
+
or institutional body may claim ownership, exclusive licensing,
|
| 48 |
+
or derivative rights over this Work without express written
|
| 49 |
+
trust agreement with Bel Esprit D'Accord Trust.
|
| 50 |
+
|
| 51 |
+
DISCLAIMER
|
| 52 |
+
|
| 53 |
+
THIS WORK IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
| 54 |
+
EXPRESS OR IMPLIED.
|
| 55 |
+
|
| 56 |
+
Bel Esprit D'Accord Trust
|
| 57 |
+
SnapKitty Collective
|
| 58 |
+
snapkittywest.github.io
|
| 59 |
+
Evidence or Silence -- 2026
|
README.md
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# KittyBrowse
|
| 2 |
+
|
| 3 |
+
KittyBrowse is a Chromium-based agent browser scaffold: each tab is treated as an agent context, each page is an execution surface, and each URL is a task pointer. The browser is the shell; APL/Rust/WASM is the preferred execution substrate.
|
| 4 |
+
|
| 5 |
+
## Architecture
|
| 6 |
+
|
| 7 |
+
```text
|
| 8 |
+
Chromium UI (Electron)
|
| 9 |
+
-> Agent Runtime Layer
|
| 10 |
+
-> Entropy Scheduler
|
| 11 |
+
-> NATS Event Mesh
|
| 12 |
+
-> VM / IDE / Tool Bridge
|
| 13 |
+
-> Unified Output Stream
|
| 14 |
+
```
|
| 15 |
+
|
| 16 |
+
## Current implementation
|
| 17 |
+
|
| 18 |
+
- Electron shell with secure preload IPC bridge.
|
| 19 |
+
- Local agent runtime running inside the main process.
|
| 20 |
+
- NATS mesh adapter with in-process fallback when `NATS_URL` is not reachable.
|
| 21 |
+
- Deterministic entropy scheduler based on dependencies, fail rate, and latency.
|
| 22 |
+
- VM/IDE plugin manifests with allowlisted targets and no raw shell execution.
|
| 23 |
+
- Minimal Rust VM bridge crate under `crates/rust-vm-bridge`.
|
| 24 |
+
- Node test suite for scheduler and runtime dispatch behavior.
|
| 25 |
+
- APL/WASM runtime boundary doc that references the existing DEVFLOW-FINANCE bridge.
|
| 26 |
+
|
| 27 |
+
## Protocol and plugins
|
| 28 |
+
|
| 29 |
+
- Protocol: `docs/kitty-protocol-v1.md`
|
| 30 |
+
- APL/WASM boundary: `docs/apl-wasm-runtime.md`
|
| 31 |
+
- Rust NATS bridge: `docs/nats-rust-bridge.md`
|
| 32 |
+
- APL/WASM plugin manifest: `plugins/vm/apl-wasm/kitty.plugin.json`
|
| 33 |
+
- VSCode plugin manifest: `plugins/ide/vscode/kitty.plugin.json`
|
| 34 |
+
- Rust VM plugin manifest: `plugins/vm/rust/kitty.plugin.json`
|
| 35 |
+
|
| 36 |
+
TypeScript is used for UI/IPC/NATS coordination only. It is not the source of truth for APL financial logic, sealing, or proof evaluation.
|
| 37 |
+
|
| 38 |
+
## Run
|
| 39 |
+
|
| 40 |
+
```powershell
|
| 41 |
+
npm install
|
| 42 |
+
npm test
|
| 43 |
+
npm run dev
|
| 44 |
+
```
|
| 45 |
+
|
| 46 |
+
Optional local NATS:
|
| 47 |
+
|
| 48 |
+
```powershell
|
| 49 |
+
docker run --rm -p 4222:4222 nats:2-alpine
|
| 50 |
+
$env:NATS_URL = "nats://127.0.0.1:4222"
|
| 51 |
+
npm run dev
|
| 52 |
+
```
|
| 53 |
+
|
| 54 |
+
## Security boundaries
|
| 55 |
+
|
| 56 |
+
- Renderer has no direct Node access.
|
| 57 |
+
- Runtime routes through typed IPC messages.
|
| 58 |
+
- Bridge execution is simulated until target adapters are explicitly implemented.
|
| 59 |
+
- NATS messages are structured envelopes; signing can be added at the envelope layer.
|
| 60 |
+
- IDE control should stay LSP-only.
|
| 61 |
+
- Shell execution is intentionally absent from this scaffold.
|
| 62 |
+
|
| 63 |
+

|
crates/rust-vm-bridge/Cargo.lock
ADDED
|
@@ -0,0 +1,1684 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# This file is automatically @generated by Cargo.
|
| 2 |
+
# It is not intended for manual editing.
|
| 3 |
+
version = 4
|
| 4 |
+
|
| 5 |
+
[[package]]
|
| 6 |
+
name = "aho-corasick"
|
| 7 |
+
version = "1.1.4"
|
| 8 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 9 |
+
checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
|
| 10 |
+
dependencies = [
|
| 11 |
+
"memchr",
|
| 12 |
+
]
|
| 13 |
+
|
| 14 |
+
[[package]]
|
| 15 |
+
name = "android_system_properties"
|
| 16 |
+
version = "0.1.5"
|
| 17 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 18 |
+
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
|
| 19 |
+
dependencies = [
|
| 20 |
+
"libc",
|
| 21 |
+
]
|
| 22 |
+
|
| 23 |
+
[[package]]
|
| 24 |
+
name = "anyhow"
|
| 25 |
+
version = "1.0.102"
|
| 26 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 27 |
+
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
|
| 28 |
+
|
| 29 |
+
[[package]]
|
| 30 |
+
name = "async-nats"
|
| 31 |
+
version = "0.49.1"
|
| 32 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 33 |
+
checksum = "fad3cd6df81292728e2a8cb1f1dcb4d7e7a1ab59b80c14fbbcba2baf9d5cf86a"
|
| 34 |
+
dependencies = [
|
| 35 |
+
"base64",
|
| 36 |
+
"bytes",
|
| 37 |
+
"futures-util",
|
| 38 |
+
"memchr",
|
| 39 |
+
"nkeys",
|
| 40 |
+
"nuid",
|
| 41 |
+
"pin-project",
|
| 42 |
+
"portable-atomic",
|
| 43 |
+
"rand 0.10.1",
|
| 44 |
+
"regex",
|
| 45 |
+
"ring",
|
| 46 |
+
"rustls-native-certs",
|
| 47 |
+
"rustls-pki-types",
|
| 48 |
+
"rustls-webpki",
|
| 49 |
+
"serde",
|
| 50 |
+
"serde_json",
|
| 51 |
+
"serde_nanos",
|
| 52 |
+
"serde_repr",
|
| 53 |
+
"thiserror",
|
| 54 |
+
"time",
|
| 55 |
+
"tokio",
|
| 56 |
+
"tokio-rustls",
|
| 57 |
+
"tokio-stream",
|
| 58 |
+
"tokio-util",
|
| 59 |
+
"tokio-websockets",
|
| 60 |
+
"tracing",
|
| 61 |
+
"tryhard",
|
| 62 |
+
"url",
|
| 63 |
+
]
|
| 64 |
+
|
| 65 |
+
[[package]]
|
| 66 |
+
name = "autocfg"
|
| 67 |
+
version = "1.5.1"
|
| 68 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 69 |
+
checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
|
| 70 |
+
|
| 71 |
+
[[package]]
|
| 72 |
+
name = "base64"
|
| 73 |
+
version = "0.22.1"
|
| 74 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 75 |
+
checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
|
| 76 |
+
|
| 77 |
+
[[package]]
|
| 78 |
+
name = "base64ct"
|
| 79 |
+
version = "1.8.3"
|
| 80 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 81 |
+
checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
|
| 82 |
+
|
| 83 |
+
[[package]]
|
| 84 |
+
name = "bitflags"
|
| 85 |
+
version = "2.13.0"
|
| 86 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 87 |
+
checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
|
| 88 |
+
|
| 89 |
+
[[package]]
|
| 90 |
+
name = "block-buffer"
|
| 91 |
+
version = "0.10.4"
|
| 92 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 93 |
+
checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
|
| 94 |
+
dependencies = [
|
| 95 |
+
"generic-array",
|
| 96 |
+
]
|
| 97 |
+
|
| 98 |
+
[[package]]
|
| 99 |
+
name = "bumpalo"
|
| 100 |
+
version = "3.20.3"
|
| 101 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 102 |
+
checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
|
| 103 |
+
|
| 104 |
+
[[package]]
|
| 105 |
+
name = "bytes"
|
| 106 |
+
version = "1.12.0"
|
| 107 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 108 |
+
checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593"
|
| 109 |
+
dependencies = [
|
| 110 |
+
"serde",
|
| 111 |
+
]
|
| 112 |
+
|
| 113 |
+
[[package]]
|
| 114 |
+
name = "cc"
|
| 115 |
+
version = "1.2.65"
|
| 116 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 117 |
+
checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96"
|
| 118 |
+
dependencies = [
|
| 119 |
+
"find-msvc-tools",
|
| 120 |
+
"shlex",
|
| 121 |
+
]
|
| 122 |
+
|
| 123 |
+
[[package]]
|
| 124 |
+
name = "cfg-if"
|
| 125 |
+
version = "1.0.4"
|
| 126 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 127 |
+
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
| 128 |
+
|
| 129 |
+
[[package]]
|
| 130 |
+
name = "chacha20"
|
| 131 |
+
version = "0.10.0"
|
| 132 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 133 |
+
checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601"
|
| 134 |
+
dependencies = [
|
| 135 |
+
"cfg-if",
|
| 136 |
+
"cpufeatures 0.3.0",
|
| 137 |
+
"rand_core 0.10.1",
|
| 138 |
+
]
|
| 139 |
+
|
| 140 |
+
[[package]]
|
| 141 |
+
name = "chrono"
|
| 142 |
+
version = "0.4.45"
|
| 143 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 144 |
+
checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"
|
| 145 |
+
dependencies = [
|
| 146 |
+
"iana-time-zone",
|
| 147 |
+
"num-traits",
|
| 148 |
+
"serde",
|
| 149 |
+
"windows-link",
|
| 150 |
+
]
|
| 151 |
+
|
| 152 |
+
[[package]]
|
| 153 |
+
name = "const-oid"
|
| 154 |
+
version = "0.9.6"
|
| 155 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 156 |
+
checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
|
| 157 |
+
|
| 158 |
+
[[package]]
|
| 159 |
+
name = "core-foundation"
|
| 160 |
+
version = "0.10.1"
|
| 161 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 162 |
+
checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
|
| 163 |
+
dependencies = [
|
| 164 |
+
"core-foundation-sys",
|
| 165 |
+
"libc",
|
| 166 |
+
]
|
| 167 |
+
|
| 168 |
+
[[package]]
|
| 169 |
+
name = "core-foundation-sys"
|
| 170 |
+
version = "0.8.7"
|
| 171 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 172 |
+
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
|
| 173 |
+
|
| 174 |
+
[[package]]
|
| 175 |
+
name = "cpufeatures"
|
| 176 |
+
version = "0.2.17"
|
| 177 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 178 |
+
checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
|
| 179 |
+
dependencies = [
|
| 180 |
+
"libc",
|
| 181 |
+
]
|
| 182 |
+
|
| 183 |
+
[[package]]
|
| 184 |
+
name = "cpufeatures"
|
| 185 |
+
version = "0.3.0"
|
| 186 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 187 |
+
checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201"
|
| 188 |
+
dependencies = [
|
| 189 |
+
"libc",
|
| 190 |
+
]
|
| 191 |
+
|
| 192 |
+
[[package]]
|
| 193 |
+
name = "crypto-common"
|
| 194 |
+
version = "0.1.7"
|
| 195 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 196 |
+
checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
|
| 197 |
+
dependencies = [
|
| 198 |
+
"generic-array",
|
| 199 |
+
"typenum",
|
| 200 |
+
]
|
| 201 |
+
|
| 202 |
+
[[package]]
|
| 203 |
+
name = "curve25519-dalek"
|
| 204 |
+
version = "4.1.3"
|
| 205 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 206 |
+
checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be"
|
| 207 |
+
dependencies = [
|
| 208 |
+
"cfg-if",
|
| 209 |
+
"cpufeatures 0.2.17",
|
| 210 |
+
"curve25519-dalek-derive",
|
| 211 |
+
"digest",
|
| 212 |
+
"fiat-crypto",
|
| 213 |
+
"rustc_version",
|
| 214 |
+
"subtle",
|
| 215 |
+
]
|
| 216 |
+
|
| 217 |
+
[[package]]
|
| 218 |
+
name = "curve25519-dalek-derive"
|
| 219 |
+
version = "0.1.1"
|
| 220 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 221 |
+
checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
|
| 222 |
+
dependencies = [
|
| 223 |
+
"proc-macro2",
|
| 224 |
+
"quote",
|
| 225 |
+
"syn",
|
| 226 |
+
]
|
| 227 |
+
|
| 228 |
+
[[package]]
|
| 229 |
+
name = "data-encoding"
|
| 230 |
+
version = "2.11.0"
|
| 231 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 232 |
+
checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8"
|
| 233 |
+
|
| 234 |
+
[[package]]
|
| 235 |
+
name = "der"
|
| 236 |
+
version = "0.7.10"
|
| 237 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 238 |
+
checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb"
|
| 239 |
+
dependencies = [
|
| 240 |
+
"const-oid",
|
| 241 |
+
"pem-rfc7468",
|
| 242 |
+
"zeroize",
|
| 243 |
+
]
|
| 244 |
+
|
| 245 |
+
[[package]]
|
| 246 |
+
name = "deranged"
|
| 247 |
+
version = "0.5.8"
|
| 248 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 249 |
+
checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
|
| 250 |
+
dependencies = [
|
| 251 |
+
"serde_core",
|
| 252 |
+
]
|
| 253 |
+
|
| 254 |
+
[[package]]
|
| 255 |
+
name = "digest"
|
| 256 |
+
version = "0.10.7"
|
| 257 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 258 |
+
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
|
| 259 |
+
dependencies = [
|
| 260 |
+
"block-buffer",
|
| 261 |
+
"crypto-common",
|
| 262 |
+
]
|
| 263 |
+
|
| 264 |
+
[[package]]
|
| 265 |
+
name = "displaydoc"
|
| 266 |
+
version = "0.2.6"
|
| 267 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 268 |
+
checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f"
|
| 269 |
+
dependencies = [
|
| 270 |
+
"proc-macro2",
|
| 271 |
+
"quote",
|
| 272 |
+
"syn",
|
| 273 |
+
]
|
| 274 |
+
|
| 275 |
+
[[package]]
|
| 276 |
+
name = "ed25519"
|
| 277 |
+
version = "2.2.3"
|
| 278 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 279 |
+
checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53"
|
| 280 |
+
dependencies = [
|
| 281 |
+
"signature",
|
| 282 |
+
]
|
| 283 |
+
|
| 284 |
+
[[package]]
|
| 285 |
+
name = "ed25519-dalek"
|
| 286 |
+
version = "2.2.0"
|
| 287 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 288 |
+
checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9"
|
| 289 |
+
dependencies = [
|
| 290 |
+
"curve25519-dalek",
|
| 291 |
+
"ed25519",
|
| 292 |
+
"sha2",
|
| 293 |
+
"signature",
|
| 294 |
+
"subtle",
|
| 295 |
+
]
|
| 296 |
+
|
| 297 |
+
[[package]]
|
| 298 |
+
name = "errno"
|
| 299 |
+
version = "0.3.14"
|
| 300 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 301 |
+
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
|
| 302 |
+
dependencies = [
|
| 303 |
+
"libc",
|
| 304 |
+
"windows-sys 0.61.2",
|
| 305 |
+
]
|
| 306 |
+
|
| 307 |
+
[[package]]
|
| 308 |
+
name = "fiat-crypto"
|
| 309 |
+
version = "0.2.9"
|
| 310 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 311 |
+
checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d"
|
| 312 |
+
|
| 313 |
+
[[package]]
|
| 314 |
+
name = "find-msvc-tools"
|
| 315 |
+
version = "0.1.9"
|
| 316 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 317 |
+
checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
|
| 318 |
+
|
| 319 |
+
[[package]]
|
| 320 |
+
name = "form_urlencoded"
|
| 321 |
+
version = "1.2.2"
|
| 322 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 323 |
+
checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
|
| 324 |
+
dependencies = [
|
| 325 |
+
"percent-encoding",
|
| 326 |
+
]
|
| 327 |
+
|
| 328 |
+
[[package]]
|
| 329 |
+
name = "futures-core"
|
| 330 |
+
version = "0.3.32"
|
| 331 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 332 |
+
checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
|
| 333 |
+
|
| 334 |
+
[[package]]
|
| 335 |
+
name = "futures-macro"
|
| 336 |
+
version = "0.3.32"
|
| 337 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 338 |
+
checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b"
|
| 339 |
+
dependencies = [
|
| 340 |
+
"proc-macro2",
|
| 341 |
+
"quote",
|
| 342 |
+
"syn",
|
| 343 |
+
]
|
| 344 |
+
|
| 345 |
+
[[package]]
|
| 346 |
+
name = "futures-sink"
|
| 347 |
+
version = "0.3.32"
|
| 348 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 349 |
+
checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893"
|
| 350 |
+
|
| 351 |
+
[[package]]
|
| 352 |
+
name = "futures-task"
|
| 353 |
+
version = "0.3.32"
|
| 354 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 355 |
+
checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"
|
| 356 |
+
|
| 357 |
+
[[package]]
|
| 358 |
+
name = "futures-util"
|
| 359 |
+
version = "0.3.32"
|
| 360 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 361 |
+
checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
|
| 362 |
+
dependencies = [
|
| 363 |
+
"futures-core",
|
| 364 |
+
"futures-macro",
|
| 365 |
+
"futures-sink",
|
| 366 |
+
"futures-task",
|
| 367 |
+
"pin-project-lite",
|
| 368 |
+
"slab",
|
| 369 |
+
]
|
| 370 |
+
|
| 371 |
+
[[package]]
|
| 372 |
+
name = "generic-array"
|
| 373 |
+
version = "0.14.7"
|
| 374 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 375 |
+
checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
|
| 376 |
+
dependencies = [
|
| 377 |
+
"typenum",
|
| 378 |
+
"version_check",
|
| 379 |
+
]
|
| 380 |
+
|
| 381 |
+
[[package]]
|
| 382 |
+
name = "getrandom"
|
| 383 |
+
version = "0.2.17"
|
| 384 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 385 |
+
checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
|
| 386 |
+
dependencies = [
|
| 387 |
+
"cfg-if",
|
| 388 |
+
"libc",
|
| 389 |
+
"wasi",
|
| 390 |
+
]
|
| 391 |
+
|
| 392 |
+
[[package]]
|
| 393 |
+
name = "getrandom"
|
| 394 |
+
version = "0.4.3"
|
| 395 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 396 |
+
checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
|
| 397 |
+
dependencies = [
|
| 398 |
+
"cfg-if",
|
| 399 |
+
"libc",
|
| 400 |
+
"r-efi",
|
| 401 |
+
"rand_core 0.10.1",
|
| 402 |
+
]
|
| 403 |
+
|
| 404 |
+
[[package]]
|
| 405 |
+
name = "http"
|
| 406 |
+
version = "1.4.2"
|
| 407 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 408 |
+
checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425"
|
| 409 |
+
dependencies = [
|
| 410 |
+
"bytes",
|
| 411 |
+
"itoa",
|
| 412 |
+
]
|
| 413 |
+
|
| 414 |
+
[[package]]
|
| 415 |
+
name = "httparse"
|
| 416 |
+
version = "1.10.1"
|
| 417 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 418 |
+
checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
|
| 419 |
+
|
| 420 |
+
[[package]]
|
| 421 |
+
name = "iana-time-zone"
|
| 422 |
+
version = "0.1.65"
|
| 423 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 424 |
+
checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470"
|
| 425 |
+
dependencies = [
|
| 426 |
+
"android_system_properties",
|
| 427 |
+
"core-foundation-sys",
|
| 428 |
+
"iana-time-zone-haiku",
|
| 429 |
+
"js-sys",
|
| 430 |
+
"log",
|
| 431 |
+
"wasm-bindgen",
|
| 432 |
+
"windows-core",
|
| 433 |
+
]
|
| 434 |
+
|
| 435 |
+
[[package]]
|
| 436 |
+
name = "iana-time-zone-haiku"
|
| 437 |
+
version = "0.1.2"
|
| 438 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 439 |
+
checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
|
| 440 |
+
dependencies = [
|
| 441 |
+
"cc",
|
| 442 |
+
]
|
| 443 |
+
|
| 444 |
+
[[package]]
|
| 445 |
+
name = "icu_collections"
|
| 446 |
+
version = "2.2.0"
|
| 447 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 448 |
+
checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c"
|
| 449 |
+
dependencies = [
|
| 450 |
+
"displaydoc",
|
| 451 |
+
"potential_utf",
|
| 452 |
+
"utf8_iter",
|
| 453 |
+
"yoke",
|
| 454 |
+
"zerofrom",
|
| 455 |
+
"zerovec",
|
| 456 |
+
]
|
| 457 |
+
|
| 458 |
+
[[package]]
|
| 459 |
+
name = "icu_locale_core"
|
| 460 |
+
version = "2.2.0"
|
| 461 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 462 |
+
checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29"
|
| 463 |
+
dependencies = [
|
| 464 |
+
"displaydoc",
|
| 465 |
+
"litemap",
|
| 466 |
+
"tinystr",
|
| 467 |
+
"writeable",
|
| 468 |
+
"zerovec",
|
| 469 |
+
]
|
| 470 |
+
|
| 471 |
+
[[package]]
|
| 472 |
+
name = "icu_normalizer"
|
| 473 |
+
version = "2.2.0"
|
| 474 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 475 |
+
checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4"
|
| 476 |
+
dependencies = [
|
| 477 |
+
"icu_collections",
|
| 478 |
+
"icu_normalizer_data",
|
| 479 |
+
"icu_properties",
|
| 480 |
+
"icu_provider",
|
| 481 |
+
"smallvec",
|
| 482 |
+
"zerovec",
|
| 483 |
+
]
|
| 484 |
+
|
| 485 |
+
[[package]]
|
| 486 |
+
name = "icu_normalizer_data"
|
| 487 |
+
version = "2.2.0"
|
| 488 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 489 |
+
checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38"
|
| 490 |
+
|
| 491 |
+
[[package]]
|
| 492 |
+
name = "icu_properties"
|
| 493 |
+
version = "2.2.0"
|
| 494 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 495 |
+
checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de"
|
| 496 |
+
dependencies = [
|
| 497 |
+
"icu_collections",
|
| 498 |
+
"icu_locale_core",
|
| 499 |
+
"icu_properties_data",
|
| 500 |
+
"icu_provider",
|
| 501 |
+
"zerotrie",
|
| 502 |
+
"zerovec",
|
| 503 |
+
]
|
| 504 |
+
|
| 505 |
+
[[package]]
|
| 506 |
+
name = "icu_properties_data"
|
| 507 |
+
version = "2.2.0"
|
| 508 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 509 |
+
checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14"
|
| 510 |
+
|
| 511 |
+
[[package]]
|
| 512 |
+
name = "icu_provider"
|
| 513 |
+
version = "2.2.0"
|
| 514 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 515 |
+
checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421"
|
| 516 |
+
dependencies = [
|
| 517 |
+
"displaydoc",
|
| 518 |
+
"icu_locale_core",
|
| 519 |
+
"writeable",
|
| 520 |
+
"yoke",
|
| 521 |
+
"zerofrom",
|
| 522 |
+
"zerotrie",
|
| 523 |
+
"zerovec",
|
| 524 |
+
]
|
| 525 |
+
|
| 526 |
+
[[package]]
|
| 527 |
+
name = "idna"
|
| 528 |
+
version = "1.1.0"
|
| 529 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 530 |
+
checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
|
| 531 |
+
dependencies = [
|
| 532 |
+
"idna_adapter",
|
| 533 |
+
"smallvec",
|
| 534 |
+
"utf8_iter",
|
| 535 |
+
]
|
| 536 |
+
|
| 537 |
+
[[package]]
|
| 538 |
+
name = "idna_adapter"
|
| 539 |
+
version = "1.2.2"
|
| 540 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 541 |
+
checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714"
|
| 542 |
+
dependencies = [
|
| 543 |
+
"icu_normalizer",
|
| 544 |
+
"icu_properties",
|
| 545 |
+
]
|
| 546 |
+
|
| 547 |
+
[[package]]
|
| 548 |
+
name = "itoa"
|
| 549 |
+
version = "1.0.18"
|
| 550 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 551 |
+
checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
|
| 552 |
+
|
| 553 |
+
[[package]]
|
| 554 |
+
name = "js-sys"
|
| 555 |
+
version = "0.3.102"
|
| 556 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 557 |
+
checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31"
|
| 558 |
+
dependencies = [
|
| 559 |
+
"cfg-if",
|
| 560 |
+
"futures-util",
|
| 561 |
+
"wasm-bindgen",
|
| 562 |
+
]
|
| 563 |
+
|
| 564 |
+
[[package]]
|
| 565 |
+
name = "libc"
|
| 566 |
+
version = "0.2.186"
|
| 567 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 568 |
+
checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
|
| 569 |
+
|
| 570 |
+
[[package]]
|
| 571 |
+
name = "litemap"
|
| 572 |
+
version = "0.8.2"
|
| 573 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 574 |
+
checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0"
|
| 575 |
+
|
| 576 |
+
[[package]]
|
| 577 |
+
name = "log"
|
| 578 |
+
version = "0.4.33"
|
| 579 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 580 |
+
checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
|
| 581 |
+
|
| 582 |
+
[[package]]
|
| 583 |
+
name = "memchr"
|
| 584 |
+
version = "2.8.2"
|
| 585 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 586 |
+
checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4"
|
| 587 |
+
|
| 588 |
+
[[package]]
|
| 589 |
+
name = "mio"
|
| 590 |
+
version = "1.2.1"
|
| 591 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 592 |
+
checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda"
|
| 593 |
+
dependencies = [
|
| 594 |
+
"libc",
|
| 595 |
+
"wasi",
|
| 596 |
+
"windows-sys 0.61.2",
|
| 597 |
+
]
|
| 598 |
+
|
| 599 |
+
[[package]]
|
| 600 |
+
name = "nkeys"
|
| 601 |
+
version = "0.4.5"
|
| 602 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 603 |
+
checksum = "879011babc47a1c7fdf5a935ae3cfe94f34645ca0cac1c7f6424b36fc743d1bf"
|
| 604 |
+
dependencies = [
|
| 605 |
+
"data-encoding",
|
| 606 |
+
"ed25519",
|
| 607 |
+
"ed25519-dalek",
|
| 608 |
+
"getrandom 0.2.17",
|
| 609 |
+
"log",
|
| 610 |
+
"rand 0.8.6",
|
| 611 |
+
"signatory",
|
| 612 |
+
]
|
| 613 |
+
|
| 614 |
+
[[package]]
|
| 615 |
+
name = "nuid"
|
| 616 |
+
version = "0.5.0"
|
| 617 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 618 |
+
checksum = "fc895af95856f929163a0aa20c26a78d26bfdc839f51b9d5aa7a5b79e52b7e83"
|
| 619 |
+
dependencies = [
|
| 620 |
+
"rand 0.8.6",
|
| 621 |
+
]
|
| 622 |
+
|
| 623 |
+
[[package]]
|
| 624 |
+
name = "num-conv"
|
| 625 |
+
version = "0.2.2"
|
| 626 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 627 |
+
checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441"
|
| 628 |
+
|
| 629 |
+
[[package]]
|
| 630 |
+
name = "num-traits"
|
| 631 |
+
version = "0.2.19"
|
| 632 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 633 |
+
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
|
| 634 |
+
dependencies = [
|
| 635 |
+
"autocfg",
|
| 636 |
+
]
|
| 637 |
+
|
| 638 |
+
[[package]]
|
| 639 |
+
name = "once_cell"
|
| 640 |
+
version = "1.21.4"
|
| 641 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 642 |
+
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
|
| 643 |
+
|
| 644 |
+
[[package]]
|
| 645 |
+
name = "openssl-probe"
|
| 646 |
+
version = "0.2.1"
|
| 647 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 648 |
+
checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe"
|
| 649 |
+
|
| 650 |
+
[[package]]
|
| 651 |
+
name = "pem-rfc7468"
|
| 652 |
+
version = "0.7.0"
|
| 653 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 654 |
+
checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412"
|
| 655 |
+
dependencies = [
|
| 656 |
+
"base64ct",
|
| 657 |
+
]
|
| 658 |
+
|
| 659 |
+
[[package]]
|
| 660 |
+
name = "percent-encoding"
|
| 661 |
+
version = "2.3.2"
|
| 662 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 663 |
+
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
|
| 664 |
+
|
| 665 |
+
[[package]]
|
| 666 |
+
name = "pin-project"
|
| 667 |
+
version = "1.1.13"
|
| 668 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 669 |
+
checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924"
|
| 670 |
+
dependencies = [
|
| 671 |
+
"pin-project-internal",
|
| 672 |
+
]
|
| 673 |
+
|
| 674 |
+
[[package]]
|
| 675 |
+
name = "pin-project-internal"
|
| 676 |
+
version = "1.1.13"
|
| 677 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 678 |
+
checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b"
|
| 679 |
+
dependencies = [
|
| 680 |
+
"proc-macro2",
|
| 681 |
+
"quote",
|
| 682 |
+
"syn",
|
| 683 |
+
]
|
| 684 |
+
|
| 685 |
+
[[package]]
|
| 686 |
+
name = "pin-project-lite"
|
| 687 |
+
version = "0.2.17"
|
| 688 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 689 |
+
checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
|
| 690 |
+
|
| 691 |
+
[[package]]
|
| 692 |
+
name = "pkcs8"
|
| 693 |
+
version = "0.10.2"
|
| 694 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 695 |
+
checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7"
|
| 696 |
+
dependencies = [
|
| 697 |
+
"der",
|
| 698 |
+
"spki",
|
| 699 |
+
]
|
| 700 |
+
|
| 701 |
+
[[package]]
|
| 702 |
+
name = "portable-atomic"
|
| 703 |
+
version = "1.13.1"
|
| 704 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 705 |
+
checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
|
| 706 |
+
|
| 707 |
+
[[package]]
|
| 708 |
+
name = "potential_utf"
|
| 709 |
+
version = "0.1.5"
|
| 710 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 711 |
+
checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564"
|
| 712 |
+
dependencies = [
|
| 713 |
+
"zerovec",
|
| 714 |
+
]
|
| 715 |
+
|
| 716 |
+
[[package]]
|
| 717 |
+
name = "powerfmt"
|
| 718 |
+
version = "0.2.0"
|
| 719 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 720 |
+
checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
|
| 721 |
+
|
| 722 |
+
[[package]]
|
| 723 |
+
name = "ppv-lite86"
|
| 724 |
+
version = "0.2.21"
|
| 725 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 726 |
+
checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
|
| 727 |
+
dependencies = [
|
| 728 |
+
"zerocopy",
|
| 729 |
+
]
|
| 730 |
+
|
| 731 |
+
[[package]]
|
| 732 |
+
name = "proc-macro2"
|
| 733 |
+
version = "1.0.106"
|
| 734 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 735 |
+
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
|
| 736 |
+
dependencies = [
|
| 737 |
+
"unicode-ident",
|
| 738 |
+
]
|
| 739 |
+
|
| 740 |
+
[[package]]
|
| 741 |
+
name = "quote"
|
| 742 |
+
version = "1.0.46"
|
| 743 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 744 |
+
checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368"
|
| 745 |
+
dependencies = [
|
| 746 |
+
"proc-macro2",
|
| 747 |
+
]
|
| 748 |
+
|
| 749 |
+
[[package]]
|
| 750 |
+
name = "r-efi"
|
| 751 |
+
version = "6.0.0"
|
| 752 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 753 |
+
checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
|
| 754 |
+
|
| 755 |
+
[[package]]
|
| 756 |
+
name = "rand"
|
| 757 |
+
version = "0.8.6"
|
| 758 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 759 |
+
checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a"
|
| 760 |
+
dependencies = [
|
| 761 |
+
"libc",
|
| 762 |
+
"rand_chacha",
|
| 763 |
+
"rand_core 0.6.4",
|
| 764 |
+
]
|
| 765 |
+
|
| 766 |
+
[[package]]
|
| 767 |
+
name = "rand"
|
| 768 |
+
version = "0.10.1"
|
| 769 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 770 |
+
checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207"
|
| 771 |
+
dependencies = [
|
| 772 |
+
"chacha20",
|
| 773 |
+
"getrandom 0.4.3",
|
| 774 |
+
"rand_core 0.10.1",
|
| 775 |
+
]
|
| 776 |
+
|
| 777 |
+
[[package]]
|
| 778 |
+
name = "rand_chacha"
|
| 779 |
+
version = "0.3.1"
|
| 780 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 781 |
+
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
|
| 782 |
+
dependencies = [
|
| 783 |
+
"ppv-lite86",
|
| 784 |
+
"rand_core 0.6.4",
|
| 785 |
+
]
|
| 786 |
+
|
| 787 |
+
[[package]]
|
| 788 |
+
name = "rand_core"
|
| 789 |
+
version = "0.6.4"
|
| 790 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 791 |
+
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
|
| 792 |
+
dependencies = [
|
| 793 |
+
"getrandom 0.2.17",
|
| 794 |
+
]
|
| 795 |
+
|
| 796 |
+
[[package]]
|
| 797 |
+
name = "rand_core"
|
| 798 |
+
version = "0.10.1"
|
| 799 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 800 |
+
checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69"
|
| 801 |
+
|
| 802 |
+
[[package]]
|
| 803 |
+
name = "regex"
|
| 804 |
+
version = "1.12.4"
|
| 805 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 806 |
+
checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba"
|
| 807 |
+
dependencies = [
|
| 808 |
+
"aho-corasick",
|
| 809 |
+
"memchr",
|
| 810 |
+
"regex-automata",
|
| 811 |
+
"regex-syntax",
|
| 812 |
+
]
|
| 813 |
+
|
| 814 |
+
[[package]]
|
| 815 |
+
name = "regex-automata"
|
| 816 |
+
version = "0.4.14"
|
| 817 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 818 |
+
checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
|
| 819 |
+
dependencies = [
|
| 820 |
+
"aho-corasick",
|
| 821 |
+
"memchr",
|
| 822 |
+
"regex-syntax",
|
| 823 |
+
]
|
| 824 |
+
|
| 825 |
+
[[package]]
|
| 826 |
+
name = "regex-syntax"
|
| 827 |
+
version = "0.8.11"
|
| 828 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 829 |
+
checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
|
| 830 |
+
|
| 831 |
+
[[package]]
|
| 832 |
+
name = "ring"
|
| 833 |
+
version = "0.17.14"
|
| 834 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 835 |
+
checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
|
| 836 |
+
dependencies = [
|
| 837 |
+
"cc",
|
| 838 |
+
"cfg-if",
|
| 839 |
+
"getrandom 0.2.17",
|
| 840 |
+
"libc",
|
| 841 |
+
"untrusted",
|
| 842 |
+
"windows-sys 0.52.0",
|
| 843 |
+
]
|
| 844 |
+
|
| 845 |
+
[[package]]
|
| 846 |
+
name = "rust-vm-bridge"
|
| 847 |
+
version = "0.1.0"
|
| 848 |
+
dependencies = [
|
| 849 |
+
"anyhow",
|
| 850 |
+
"async-nats",
|
| 851 |
+
"chrono",
|
| 852 |
+
"futures-util",
|
| 853 |
+
"serde",
|
| 854 |
+
"serde_json",
|
| 855 |
+
"sha2",
|
| 856 |
+
"tokio",
|
| 857 |
+
]
|
| 858 |
+
|
| 859 |
+
[[package]]
|
| 860 |
+
name = "rustc_version"
|
| 861 |
+
version = "0.4.1"
|
| 862 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 863 |
+
checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
|
| 864 |
+
dependencies = [
|
| 865 |
+
"semver",
|
| 866 |
+
]
|
| 867 |
+
|
| 868 |
+
[[package]]
|
| 869 |
+
name = "rustls"
|
| 870 |
+
version = "0.23.40"
|
| 871 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 872 |
+
checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b"
|
| 873 |
+
dependencies = [
|
| 874 |
+
"once_cell",
|
| 875 |
+
"ring",
|
| 876 |
+
"rustls-pki-types",
|
| 877 |
+
"rustls-webpki",
|
| 878 |
+
"subtle",
|
| 879 |
+
"zeroize",
|
| 880 |
+
]
|
| 881 |
+
|
| 882 |
+
[[package]]
|
| 883 |
+
name = "rustls-native-certs"
|
| 884 |
+
version = "0.8.4"
|
| 885 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 886 |
+
checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d"
|
| 887 |
+
dependencies = [
|
| 888 |
+
"openssl-probe",
|
| 889 |
+
"rustls-pki-types",
|
| 890 |
+
"schannel",
|
| 891 |
+
"security-framework",
|
| 892 |
+
]
|
| 893 |
+
|
| 894 |
+
[[package]]
|
| 895 |
+
name = "rustls-pki-types"
|
| 896 |
+
version = "1.14.1"
|
| 897 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 898 |
+
checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9"
|
| 899 |
+
dependencies = [
|
| 900 |
+
"zeroize",
|
| 901 |
+
]
|
| 902 |
+
|
| 903 |
+
[[package]]
|
| 904 |
+
name = "rustls-webpki"
|
| 905 |
+
version = "0.103.13"
|
| 906 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 907 |
+
checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
|
| 908 |
+
dependencies = [
|
| 909 |
+
"ring",
|
| 910 |
+
"rustls-pki-types",
|
| 911 |
+
"untrusted",
|
| 912 |
+
]
|
| 913 |
+
|
| 914 |
+
[[package]]
|
| 915 |
+
name = "rustversion"
|
| 916 |
+
version = "1.0.22"
|
| 917 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 918 |
+
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
|
| 919 |
+
|
| 920 |
+
[[package]]
|
| 921 |
+
name = "schannel"
|
| 922 |
+
version = "0.1.29"
|
| 923 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 924 |
+
checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939"
|
| 925 |
+
dependencies = [
|
| 926 |
+
"windows-sys 0.61.2",
|
| 927 |
+
]
|
| 928 |
+
|
| 929 |
+
[[package]]
|
| 930 |
+
name = "security-framework"
|
| 931 |
+
version = "3.7.0"
|
| 932 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 933 |
+
checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d"
|
| 934 |
+
dependencies = [
|
| 935 |
+
"bitflags",
|
| 936 |
+
"core-foundation",
|
| 937 |
+
"core-foundation-sys",
|
| 938 |
+
"libc",
|
| 939 |
+
"security-framework-sys",
|
| 940 |
+
]
|
| 941 |
+
|
| 942 |
+
[[package]]
|
| 943 |
+
name = "security-framework-sys"
|
| 944 |
+
version = "2.17.0"
|
| 945 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 946 |
+
checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3"
|
| 947 |
+
dependencies = [
|
| 948 |
+
"core-foundation-sys",
|
| 949 |
+
"libc",
|
| 950 |
+
]
|
| 951 |
+
|
| 952 |
+
[[package]]
|
| 953 |
+
name = "semver"
|
| 954 |
+
version = "1.0.28"
|
| 955 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 956 |
+
checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
|
| 957 |
+
|
| 958 |
+
[[package]]
|
| 959 |
+
name = "serde"
|
| 960 |
+
version = "1.0.228"
|
| 961 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 962 |
+
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
|
| 963 |
+
dependencies = [
|
| 964 |
+
"serde_core",
|
| 965 |
+
"serde_derive",
|
| 966 |
+
]
|
| 967 |
+
|
| 968 |
+
[[package]]
|
| 969 |
+
name = "serde_core"
|
| 970 |
+
version = "1.0.228"
|
| 971 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 972 |
+
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
|
| 973 |
+
dependencies = [
|
| 974 |
+
"serde_derive",
|
| 975 |
+
]
|
| 976 |
+
|
| 977 |
+
[[package]]
|
| 978 |
+
name = "serde_derive"
|
| 979 |
+
version = "1.0.228"
|
| 980 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 981 |
+
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
|
| 982 |
+
dependencies = [
|
| 983 |
+
"proc-macro2",
|
| 984 |
+
"quote",
|
| 985 |
+
"syn",
|
| 986 |
+
]
|
| 987 |
+
|
| 988 |
+
[[package]]
|
| 989 |
+
name = "serde_json"
|
| 990 |
+
version = "1.0.150"
|
| 991 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 992 |
+
checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9"
|
| 993 |
+
dependencies = [
|
| 994 |
+
"itoa",
|
| 995 |
+
"memchr",
|
| 996 |
+
"serde",
|
| 997 |
+
"serde_core",
|
| 998 |
+
"zmij",
|
| 999 |
+
]
|
| 1000 |
+
|
| 1001 |
+
[[package]]
|
| 1002 |
+
name = "serde_nanos"
|
| 1003 |
+
version = "0.1.4"
|
| 1004 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1005 |
+
checksum = "a93142f0367a4cc53ae0fead1bcda39e85beccfad3dcd717656cacab94b12985"
|
| 1006 |
+
dependencies = [
|
| 1007 |
+
"serde",
|
| 1008 |
+
]
|
| 1009 |
+
|
| 1010 |
+
[[package]]
|
| 1011 |
+
name = "serde_repr"
|
| 1012 |
+
version = "0.1.20"
|
| 1013 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1014 |
+
checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"
|
| 1015 |
+
dependencies = [
|
| 1016 |
+
"proc-macro2",
|
| 1017 |
+
"quote",
|
| 1018 |
+
"syn",
|
| 1019 |
+
]
|
| 1020 |
+
|
| 1021 |
+
[[package]]
|
| 1022 |
+
name = "sha2"
|
| 1023 |
+
version = "0.10.9"
|
| 1024 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1025 |
+
checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
|
| 1026 |
+
dependencies = [
|
| 1027 |
+
"cfg-if",
|
| 1028 |
+
"cpufeatures 0.2.17",
|
| 1029 |
+
"digest",
|
| 1030 |
+
]
|
| 1031 |
+
|
| 1032 |
+
[[package]]
|
| 1033 |
+
name = "shlex"
|
| 1034 |
+
version = "2.0.1"
|
| 1035 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1036 |
+
checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
|
| 1037 |
+
|
| 1038 |
+
[[package]]
|
| 1039 |
+
name = "signal-hook-registry"
|
| 1040 |
+
version = "1.4.8"
|
| 1041 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1042 |
+
checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
|
| 1043 |
+
dependencies = [
|
| 1044 |
+
"errno",
|
| 1045 |
+
"libc",
|
| 1046 |
+
]
|
| 1047 |
+
|
| 1048 |
+
[[package]]
|
| 1049 |
+
name = "signatory"
|
| 1050 |
+
version = "0.27.1"
|
| 1051 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1052 |
+
checksum = "c1e303f8205714074f6068773f0e29527e0453937fe837c9717d066635b65f31"
|
| 1053 |
+
dependencies = [
|
| 1054 |
+
"pkcs8",
|
| 1055 |
+
"rand_core 0.6.4",
|
| 1056 |
+
"signature",
|
| 1057 |
+
"zeroize",
|
| 1058 |
+
]
|
| 1059 |
+
|
| 1060 |
+
[[package]]
|
| 1061 |
+
name = "signature"
|
| 1062 |
+
version = "2.2.0"
|
| 1063 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1064 |
+
checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
|
| 1065 |
+
dependencies = [
|
| 1066 |
+
"digest",
|
| 1067 |
+
"rand_core 0.6.4",
|
| 1068 |
+
]
|
| 1069 |
+
|
| 1070 |
+
[[package]]
|
| 1071 |
+
name = "slab"
|
| 1072 |
+
version = "0.4.12"
|
| 1073 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1074 |
+
checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
|
| 1075 |
+
|
| 1076 |
+
[[package]]
|
| 1077 |
+
name = "smallvec"
|
| 1078 |
+
version = "1.15.2"
|
| 1079 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1080 |
+
checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
|
| 1081 |
+
|
| 1082 |
+
[[package]]
|
| 1083 |
+
name = "socket2"
|
| 1084 |
+
version = "0.6.4"
|
| 1085 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1086 |
+
checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51"
|
| 1087 |
+
dependencies = [
|
| 1088 |
+
"libc",
|
| 1089 |
+
"windows-sys 0.61.2",
|
| 1090 |
+
]
|
| 1091 |
+
|
| 1092 |
+
[[package]]
|
| 1093 |
+
name = "spki"
|
| 1094 |
+
version = "0.7.3"
|
| 1095 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1096 |
+
checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d"
|
| 1097 |
+
dependencies = [
|
| 1098 |
+
"base64ct",
|
| 1099 |
+
"der",
|
| 1100 |
+
]
|
| 1101 |
+
|
| 1102 |
+
[[package]]
|
| 1103 |
+
name = "stable_deref_trait"
|
| 1104 |
+
version = "1.2.1"
|
| 1105 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1106 |
+
checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
|
| 1107 |
+
|
| 1108 |
+
[[package]]
|
| 1109 |
+
name = "subtle"
|
| 1110 |
+
version = "2.6.1"
|
| 1111 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1112 |
+
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
|
| 1113 |
+
|
| 1114 |
+
[[package]]
|
| 1115 |
+
name = "syn"
|
| 1116 |
+
version = "2.0.118"
|
| 1117 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1118 |
+
checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422"
|
| 1119 |
+
dependencies = [
|
| 1120 |
+
"proc-macro2",
|
| 1121 |
+
"quote",
|
| 1122 |
+
"unicode-ident",
|
| 1123 |
+
]
|
| 1124 |
+
|
| 1125 |
+
[[package]]
|
| 1126 |
+
name = "synstructure"
|
| 1127 |
+
version = "0.13.2"
|
| 1128 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1129 |
+
checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
|
| 1130 |
+
dependencies = [
|
| 1131 |
+
"proc-macro2",
|
| 1132 |
+
"quote",
|
| 1133 |
+
"syn",
|
| 1134 |
+
]
|
| 1135 |
+
|
| 1136 |
+
[[package]]
|
| 1137 |
+
name = "thiserror"
|
| 1138 |
+
version = "2.0.18"
|
| 1139 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1140 |
+
checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
|
| 1141 |
+
dependencies = [
|
| 1142 |
+
"thiserror-impl",
|
| 1143 |
+
]
|
| 1144 |
+
|
| 1145 |
+
[[package]]
|
| 1146 |
+
name = "thiserror-impl"
|
| 1147 |
+
version = "2.0.18"
|
| 1148 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1149 |
+
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
|
| 1150 |
+
dependencies = [
|
| 1151 |
+
"proc-macro2",
|
| 1152 |
+
"quote",
|
| 1153 |
+
"syn",
|
| 1154 |
+
]
|
| 1155 |
+
|
| 1156 |
+
[[package]]
|
| 1157 |
+
name = "time"
|
| 1158 |
+
version = "0.3.51"
|
| 1159 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1160 |
+
checksum = "85c17d80feb7334b40c484e45ed1a5273dfd8bfda537c3be2e74a06a6686f327"
|
| 1161 |
+
dependencies = [
|
| 1162 |
+
"deranged",
|
| 1163 |
+
"num-conv",
|
| 1164 |
+
"powerfmt",
|
| 1165 |
+
"serde_core",
|
| 1166 |
+
"time-core",
|
| 1167 |
+
"time-macros",
|
| 1168 |
+
]
|
| 1169 |
+
|
| 1170 |
+
[[package]]
|
| 1171 |
+
name = "time-core"
|
| 1172 |
+
version = "0.1.9"
|
| 1173 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1174 |
+
checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109"
|
| 1175 |
+
|
| 1176 |
+
[[package]]
|
| 1177 |
+
name = "time-macros"
|
| 1178 |
+
version = "0.2.30"
|
| 1179 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1180 |
+
checksum = "dcef1a61bdb119096e153208ec5cbec23944ce8bca13be5c7f60c634f7403935"
|
| 1181 |
+
dependencies = [
|
| 1182 |
+
"num-conv",
|
| 1183 |
+
"time-core",
|
| 1184 |
+
]
|
| 1185 |
+
|
| 1186 |
+
[[package]]
|
| 1187 |
+
name = "tinystr"
|
| 1188 |
+
version = "0.8.3"
|
| 1189 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1190 |
+
checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d"
|
| 1191 |
+
dependencies = [
|
| 1192 |
+
"displaydoc",
|
| 1193 |
+
"zerovec",
|
| 1194 |
+
]
|
| 1195 |
+
|
| 1196 |
+
[[package]]
|
| 1197 |
+
name = "tokio"
|
| 1198 |
+
version = "1.52.3"
|
| 1199 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1200 |
+
checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe"
|
| 1201 |
+
dependencies = [
|
| 1202 |
+
"bytes",
|
| 1203 |
+
"libc",
|
| 1204 |
+
"mio",
|
| 1205 |
+
"pin-project-lite",
|
| 1206 |
+
"signal-hook-registry",
|
| 1207 |
+
"socket2",
|
| 1208 |
+
"tokio-macros",
|
| 1209 |
+
"windows-sys 0.61.2",
|
| 1210 |
+
]
|
| 1211 |
+
|
| 1212 |
+
[[package]]
|
| 1213 |
+
name = "tokio-macros"
|
| 1214 |
+
version = "2.7.0"
|
| 1215 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1216 |
+
checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496"
|
| 1217 |
+
dependencies = [
|
| 1218 |
+
"proc-macro2",
|
| 1219 |
+
"quote",
|
| 1220 |
+
"syn",
|
| 1221 |
+
]
|
| 1222 |
+
|
| 1223 |
+
[[package]]
|
| 1224 |
+
name = "tokio-rustls"
|
| 1225 |
+
version = "0.26.4"
|
| 1226 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1227 |
+
checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61"
|
| 1228 |
+
dependencies = [
|
| 1229 |
+
"rustls",
|
| 1230 |
+
"tokio",
|
| 1231 |
+
]
|
| 1232 |
+
|
| 1233 |
+
[[package]]
|
| 1234 |
+
name = "tokio-stream"
|
| 1235 |
+
version = "0.1.18"
|
| 1236 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1237 |
+
checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70"
|
| 1238 |
+
dependencies = [
|
| 1239 |
+
"futures-core",
|
| 1240 |
+
"pin-project-lite",
|
| 1241 |
+
"tokio",
|
| 1242 |
+
]
|
| 1243 |
+
|
| 1244 |
+
[[package]]
|
| 1245 |
+
name = "tokio-util"
|
| 1246 |
+
version = "0.7.18"
|
| 1247 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1248 |
+
checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098"
|
| 1249 |
+
dependencies = [
|
| 1250 |
+
"bytes",
|
| 1251 |
+
"futures-core",
|
| 1252 |
+
"futures-sink",
|
| 1253 |
+
"pin-project-lite",
|
| 1254 |
+
"tokio",
|
| 1255 |
+
]
|
| 1256 |
+
|
| 1257 |
+
[[package]]
|
| 1258 |
+
name = "tokio-websockets"
|
| 1259 |
+
version = "0.10.1"
|
| 1260 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1261 |
+
checksum = "f591660438b3038dd04d16c938271c79e7e06260ad2ea2885a4861bfb238605d"
|
| 1262 |
+
dependencies = [
|
| 1263 |
+
"base64",
|
| 1264 |
+
"bytes",
|
| 1265 |
+
"futures-core",
|
| 1266 |
+
"futures-sink",
|
| 1267 |
+
"http",
|
| 1268 |
+
"httparse",
|
| 1269 |
+
"rand 0.8.6",
|
| 1270 |
+
"ring",
|
| 1271 |
+
"rustls-pki-types",
|
| 1272 |
+
"tokio",
|
| 1273 |
+
"tokio-rustls",
|
| 1274 |
+
"tokio-util",
|
| 1275 |
+
"webpki-roots 0.26.11",
|
| 1276 |
+
]
|
| 1277 |
+
|
| 1278 |
+
[[package]]
|
| 1279 |
+
name = "tracing"
|
| 1280 |
+
version = "0.1.44"
|
| 1281 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1282 |
+
checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
|
| 1283 |
+
dependencies = [
|
| 1284 |
+
"pin-project-lite",
|
| 1285 |
+
"tracing-attributes",
|
| 1286 |
+
"tracing-core",
|
| 1287 |
+
]
|
| 1288 |
+
|
| 1289 |
+
[[package]]
|
| 1290 |
+
name = "tracing-attributes"
|
| 1291 |
+
version = "0.1.31"
|
| 1292 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1293 |
+
checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
|
| 1294 |
+
dependencies = [
|
| 1295 |
+
"proc-macro2",
|
| 1296 |
+
"quote",
|
| 1297 |
+
"syn",
|
| 1298 |
+
]
|
| 1299 |
+
|
| 1300 |
+
[[package]]
|
| 1301 |
+
name = "tracing-core"
|
| 1302 |
+
version = "0.1.36"
|
| 1303 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1304 |
+
checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
|
| 1305 |
+
dependencies = [
|
| 1306 |
+
"once_cell",
|
| 1307 |
+
]
|
| 1308 |
+
|
| 1309 |
+
[[package]]
|
| 1310 |
+
name = "tryhard"
|
| 1311 |
+
version = "0.5.2"
|
| 1312 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1313 |
+
checksum = "9fe58ebd5edd976e0fe0f8a14d2a04b7c81ef153ea9a54eebc42e67c2c23b4e5"
|
| 1314 |
+
dependencies = [
|
| 1315 |
+
"pin-project-lite",
|
| 1316 |
+
"tokio",
|
| 1317 |
+
]
|
| 1318 |
+
|
| 1319 |
+
[[package]]
|
| 1320 |
+
name = "typenum"
|
| 1321 |
+
version = "1.20.1"
|
| 1322 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1323 |
+
checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
|
| 1324 |
+
|
| 1325 |
+
[[package]]
|
| 1326 |
+
name = "unicode-ident"
|
| 1327 |
+
version = "1.0.24"
|
| 1328 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1329 |
+
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
| 1330 |
+
|
| 1331 |
+
[[package]]
|
| 1332 |
+
name = "untrusted"
|
| 1333 |
+
version = "0.9.0"
|
| 1334 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1335 |
+
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
|
| 1336 |
+
|
| 1337 |
+
[[package]]
|
| 1338 |
+
name = "url"
|
| 1339 |
+
version = "2.5.8"
|
| 1340 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1341 |
+
checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
|
| 1342 |
+
dependencies = [
|
| 1343 |
+
"form_urlencoded",
|
| 1344 |
+
"idna",
|
| 1345 |
+
"percent-encoding",
|
| 1346 |
+
"serde",
|
| 1347 |
+
]
|
| 1348 |
+
|
| 1349 |
+
[[package]]
|
| 1350 |
+
name = "utf8_iter"
|
| 1351 |
+
version = "1.0.4"
|
| 1352 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1353 |
+
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
|
| 1354 |
+
|
| 1355 |
+
[[package]]
|
| 1356 |
+
name = "version_check"
|
| 1357 |
+
version = "0.9.5"
|
| 1358 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1359 |
+
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
|
| 1360 |
+
|
| 1361 |
+
[[package]]
|
| 1362 |
+
name = "wasi"
|
| 1363 |
+
version = "0.11.1+wasi-snapshot-preview1"
|
| 1364 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1365 |
+
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
|
| 1366 |
+
|
| 1367 |
+
[[package]]
|
| 1368 |
+
name = "wasm-bindgen"
|
| 1369 |
+
version = "0.2.125"
|
| 1370 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1371 |
+
checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a"
|
| 1372 |
+
dependencies = [
|
| 1373 |
+
"cfg-if",
|
| 1374 |
+
"once_cell",
|
| 1375 |
+
"rustversion",
|
| 1376 |
+
"wasm-bindgen-macro",
|
| 1377 |
+
"wasm-bindgen-shared",
|
| 1378 |
+
]
|
| 1379 |
+
|
| 1380 |
+
[[package]]
|
| 1381 |
+
name = "wasm-bindgen-macro"
|
| 1382 |
+
version = "0.2.125"
|
| 1383 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1384 |
+
checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d"
|
| 1385 |
+
dependencies = [
|
| 1386 |
+
"quote",
|
| 1387 |
+
"wasm-bindgen-macro-support",
|
| 1388 |
+
]
|
| 1389 |
+
|
| 1390 |
+
[[package]]
|
| 1391 |
+
name = "wasm-bindgen-macro-support"
|
| 1392 |
+
version = "0.2.125"
|
| 1393 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1394 |
+
checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd"
|
| 1395 |
+
dependencies = [
|
| 1396 |
+
"bumpalo",
|
| 1397 |
+
"proc-macro2",
|
| 1398 |
+
"quote",
|
| 1399 |
+
"syn",
|
| 1400 |
+
"wasm-bindgen-shared",
|
| 1401 |
+
]
|
| 1402 |
+
|
| 1403 |
+
[[package]]
|
| 1404 |
+
name = "wasm-bindgen-shared"
|
| 1405 |
+
version = "0.2.125"
|
| 1406 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1407 |
+
checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f"
|
| 1408 |
+
dependencies = [
|
| 1409 |
+
"unicode-ident",
|
| 1410 |
+
]
|
| 1411 |
+
|
| 1412 |
+
[[package]]
|
| 1413 |
+
name = "webpki-roots"
|
| 1414 |
+
version = "0.26.11"
|
| 1415 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1416 |
+
checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9"
|
| 1417 |
+
dependencies = [
|
| 1418 |
+
"webpki-roots 1.0.8",
|
| 1419 |
+
]
|
| 1420 |
+
|
| 1421 |
+
[[package]]
|
| 1422 |
+
name = "webpki-roots"
|
| 1423 |
+
version = "1.0.8"
|
| 1424 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1425 |
+
checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf"
|
| 1426 |
+
dependencies = [
|
| 1427 |
+
"rustls-pki-types",
|
| 1428 |
+
]
|
| 1429 |
+
|
| 1430 |
+
[[package]]
|
| 1431 |
+
name = "windows-core"
|
| 1432 |
+
version = "0.62.2"
|
| 1433 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1434 |
+
checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
|
| 1435 |
+
dependencies = [
|
| 1436 |
+
"windows-implement",
|
| 1437 |
+
"windows-interface",
|
| 1438 |
+
"windows-link",
|
| 1439 |
+
"windows-result",
|
| 1440 |
+
"windows-strings",
|
| 1441 |
+
]
|
| 1442 |
+
|
| 1443 |
+
[[package]]
|
| 1444 |
+
name = "windows-implement"
|
| 1445 |
+
version = "0.60.2"
|
| 1446 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1447 |
+
checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
|
| 1448 |
+
dependencies = [
|
| 1449 |
+
"proc-macro2",
|
| 1450 |
+
"quote",
|
| 1451 |
+
"syn",
|
| 1452 |
+
]
|
| 1453 |
+
|
| 1454 |
+
[[package]]
|
| 1455 |
+
name = "windows-interface"
|
| 1456 |
+
version = "0.59.3"
|
| 1457 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1458 |
+
checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
|
| 1459 |
+
dependencies = [
|
| 1460 |
+
"proc-macro2",
|
| 1461 |
+
"quote",
|
| 1462 |
+
"syn",
|
| 1463 |
+
]
|
| 1464 |
+
|
| 1465 |
+
[[package]]
|
| 1466 |
+
name = "windows-link"
|
| 1467 |
+
version = "0.2.1"
|
| 1468 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1469 |
+
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
|
| 1470 |
+
|
| 1471 |
+
[[package]]
|
| 1472 |
+
name = "windows-result"
|
| 1473 |
+
version = "0.4.1"
|
| 1474 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1475 |
+
checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
|
| 1476 |
+
dependencies = [
|
| 1477 |
+
"windows-link",
|
| 1478 |
+
]
|
| 1479 |
+
|
| 1480 |
+
[[package]]
|
| 1481 |
+
name = "windows-strings"
|
| 1482 |
+
version = "0.5.1"
|
| 1483 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1484 |
+
checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
|
| 1485 |
+
dependencies = [
|
| 1486 |
+
"windows-link",
|
| 1487 |
+
]
|
| 1488 |
+
|
| 1489 |
+
[[package]]
|
| 1490 |
+
name = "windows-sys"
|
| 1491 |
+
version = "0.52.0"
|
| 1492 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1493 |
+
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
|
| 1494 |
+
dependencies = [
|
| 1495 |
+
"windows-targets",
|
| 1496 |
+
]
|
| 1497 |
+
|
| 1498 |
+
[[package]]
|
| 1499 |
+
name = "windows-sys"
|
| 1500 |
+
version = "0.61.2"
|
| 1501 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1502 |
+
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
|
| 1503 |
+
dependencies = [
|
| 1504 |
+
"windows-link",
|
| 1505 |
+
]
|
| 1506 |
+
|
| 1507 |
+
[[package]]
|
| 1508 |
+
name = "windows-targets"
|
| 1509 |
+
version = "0.52.6"
|
| 1510 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1511 |
+
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
|
| 1512 |
+
dependencies = [
|
| 1513 |
+
"windows_aarch64_gnullvm",
|
| 1514 |
+
"windows_aarch64_msvc",
|
| 1515 |
+
"windows_i686_gnu",
|
| 1516 |
+
"windows_i686_gnullvm",
|
| 1517 |
+
"windows_i686_msvc",
|
| 1518 |
+
"windows_x86_64_gnu",
|
| 1519 |
+
"windows_x86_64_gnullvm",
|
| 1520 |
+
"windows_x86_64_msvc",
|
| 1521 |
+
]
|
| 1522 |
+
|
| 1523 |
+
[[package]]
|
| 1524 |
+
name = "windows_aarch64_gnullvm"
|
| 1525 |
+
version = "0.52.6"
|
| 1526 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1527 |
+
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
|
| 1528 |
+
|
| 1529 |
+
[[package]]
|
| 1530 |
+
name = "windows_aarch64_msvc"
|
| 1531 |
+
version = "0.52.6"
|
| 1532 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1533 |
+
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
|
| 1534 |
+
|
| 1535 |
+
[[package]]
|
| 1536 |
+
name = "windows_i686_gnu"
|
| 1537 |
+
version = "0.52.6"
|
| 1538 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1539 |
+
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
|
| 1540 |
+
|
| 1541 |
+
[[package]]
|
| 1542 |
+
name = "windows_i686_gnullvm"
|
| 1543 |
+
version = "0.52.6"
|
| 1544 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1545 |
+
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
|
| 1546 |
+
|
| 1547 |
+
[[package]]
|
| 1548 |
+
name = "windows_i686_msvc"
|
| 1549 |
+
version = "0.52.6"
|
| 1550 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1551 |
+
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
|
| 1552 |
+
|
| 1553 |
+
[[package]]
|
| 1554 |
+
name = "windows_x86_64_gnu"
|
| 1555 |
+
version = "0.52.6"
|
| 1556 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1557 |
+
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
|
| 1558 |
+
|
| 1559 |
+
[[package]]
|
| 1560 |
+
name = "windows_x86_64_gnullvm"
|
| 1561 |
+
version = "0.52.6"
|
| 1562 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1563 |
+
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
|
| 1564 |
+
|
| 1565 |
+
[[package]]
|
| 1566 |
+
name = "windows_x86_64_msvc"
|
| 1567 |
+
version = "0.52.6"
|
| 1568 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1569 |
+
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
| 1570 |
+
|
| 1571 |
+
[[package]]
|
| 1572 |
+
name = "writeable"
|
| 1573 |
+
version = "0.6.3"
|
| 1574 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1575 |
+
checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
|
| 1576 |
+
|
| 1577 |
+
[[package]]
|
| 1578 |
+
name = "yoke"
|
| 1579 |
+
version = "0.8.3"
|
| 1580 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1581 |
+
checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5"
|
| 1582 |
+
dependencies = [
|
| 1583 |
+
"stable_deref_trait",
|
| 1584 |
+
"yoke-derive",
|
| 1585 |
+
"zerofrom",
|
| 1586 |
+
]
|
| 1587 |
+
|
| 1588 |
+
[[package]]
|
| 1589 |
+
name = "yoke-derive"
|
| 1590 |
+
version = "0.8.2"
|
| 1591 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1592 |
+
checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"
|
| 1593 |
+
dependencies = [
|
| 1594 |
+
"proc-macro2",
|
| 1595 |
+
"quote",
|
| 1596 |
+
"syn",
|
| 1597 |
+
"synstructure",
|
| 1598 |
+
]
|
| 1599 |
+
|
| 1600 |
+
[[package]]
|
| 1601 |
+
name = "zerocopy"
|
| 1602 |
+
version = "0.8.52"
|
| 1603 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1604 |
+
checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f"
|
| 1605 |
+
dependencies = [
|
| 1606 |
+
"zerocopy-derive",
|
| 1607 |
+
]
|
| 1608 |
+
|
| 1609 |
+
[[package]]
|
| 1610 |
+
name = "zerocopy-derive"
|
| 1611 |
+
version = "0.8.52"
|
| 1612 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1613 |
+
checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930"
|
| 1614 |
+
dependencies = [
|
| 1615 |
+
"proc-macro2",
|
| 1616 |
+
"quote",
|
| 1617 |
+
"syn",
|
| 1618 |
+
]
|
| 1619 |
+
|
| 1620 |
+
[[package]]
|
| 1621 |
+
name = "zerofrom"
|
| 1622 |
+
version = "0.1.8"
|
| 1623 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1624 |
+
checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272"
|
| 1625 |
+
dependencies = [
|
| 1626 |
+
"zerofrom-derive",
|
| 1627 |
+
]
|
| 1628 |
+
|
| 1629 |
+
[[package]]
|
| 1630 |
+
name = "zerofrom-derive"
|
| 1631 |
+
version = "0.1.7"
|
| 1632 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1633 |
+
checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1"
|
| 1634 |
+
dependencies = [
|
| 1635 |
+
"proc-macro2",
|
| 1636 |
+
"quote",
|
| 1637 |
+
"syn",
|
| 1638 |
+
"synstructure",
|
| 1639 |
+
]
|
| 1640 |
+
|
| 1641 |
+
[[package]]
|
| 1642 |
+
name = "zeroize"
|
| 1643 |
+
version = "1.9.0"
|
| 1644 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1645 |
+
checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
|
| 1646 |
+
|
| 1647 |
+
[[package]]
|
| 1648 |
+
name = "zerotrie"
|
| 1649 |
+
version = "0.2.4"
|
| 1650 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1651 |
+
checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf"
|
| 1652 |
+
dependencies = [
|
| 1653 |
+
"displaydoc",
|
| 1654 |
+
"yoke",
|
| 1655 |
+
"zerofrom",
|
| 1656 |
+
]
|
| 1657 |
+
|
| 1658 |
+
[[package]]
|
| 1659 |
+
name = "zerovec"
|
| 1660 |
+
version = "0.11.6"
|
| 1661 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1662 |
+
checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239"
|
| 1663 |
+
dependencies = [
|
| 1664 |
+
"yoke",
|
| 1665 |
+
"zerofrom",
|
| 1666 |
+
"zerovec-derive",
|
| 1667 |
+
]
|
| 1668 |
+
|
| 1669 |
+
[[package]]
|
| 1670 |
+
name = "zerovec-derive"
|
| 1671 |
+
version = "0.11.3"
|
| 1672 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1673 |
+
checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555"
|
| 1674 |
+
dependencies = [
|
| 1675 |
+
"proc-macro2",
|
| 1676 |
+
"quote",
|
| 1677 |
+
"syn",
|
| 1678 |
+
]
|
| 1679 |
+
|
| 1680 |
+
[[package]]
|
| 1681 |
+
name = "zmij"
|
| 1682 |
+
version = "1.0.21"
|
| 1683 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1684 |
+
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
|
crates/rust-vm-bridge/Cargo.toml
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[package]
|
| 2 |
+
name = "rust-vm-bridge"
|
| 3 |
+
version = "0.1.0"
|
| 4 |
+
edition = "2021"
|
| 5 |
+
|
| 6 |
+
[dependencies]
|
| 7 |
+
anyhow = "1"
|
| 8 |
+
async-nats = "0.49"
|
| 9 |
+
chrono = { version = "0.4", default-features = false, features = ["clock", "serde"] }
|
| 10 |
+
futures-util = "0.3"
|
| 11 |
+
serde = { version = "1", features = ["derive"] }
|
| 12 |
+
serde_json = "1"
|
| 13 |
+
sha2 = "0.10"
|
| 14 |
+
tokio = { version = "1", features = ["macros", "rt-multi-thread", "signal"] }
|
crates/rust-vm-bridge/src/lib.rs
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
use anyhow::{anyhow, Context, Result};
|
| 2 |
+
use serde::{Deserialize, Serialize};
|
| 3 |
+
use serde_json::{json, Value};
|
| 4 |
+
use sha2::{Digest, Sha256};
|
| 5 |
+
|
| 6 |
+
pub const TASK_RUN: &str = "kitty.task.run";
|
| 7 |
+
pub const TASK_RESULT: &str = "kitty.task.result";
|
| 8 |
+
pub const DEFAULT_NATS_URL: &str = "nats://127.0.0.1:4222";
|
| 9 |
+
|
| 10 |
+
const DEFAULT_THRESHOLD: f64 = 0.21;
|
| 11 |
+
|
| 12 |
+
#[derive(Debug, Clone, Deserialize, Serialize)]
|
| 13 |
+
#[serde(rename_all = "camelCase")]
|
| 14 |
+
pub struct TaskEnvelope {
|
| 15 |
+
pub subject: String,
|
| 16 |
+
pub issued_at: String,
|
| 17 |
+
pub task: TaskRequest,
|
| 18 |
+
pub signature: Option<String>,
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
#[derive(Debug, Clone, Deserialize, Serialize)]
|
| 22 |
+
#[serde(rename_all = "camelCase")]
|
| 23 |
+
pub struct TaskRequest {
|
| 24 |
+
pub id: String,
|
| 25 |
+
pub context_id: String,
|
| 26 |
+
pub command: String,
|
| 27 |
+
pub payload: Value,
|
| 28 |
+
pub dependencies: Vec<String>,
|
| 29 |
+
pub fail_rate: f64,
|
| 30 |
+
pub latency_ms: f64,
|
| 31 |
+
pub vm_target: String,
|
| 32 |
+
pub ide_target: String,
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
#[derive(Debug, Clone, Deserialize, Serialize)]
|
| 36 |
+
#[serde(rename_all = "camelCase")]
|
| 37 |
+
pub struct TaskResult {
|
| 38 |
+
pub id: String,
|
| 39 |
+
pub context_id: String,
|
| 40 |
+
pub status: String,
|
| 41 |
+
pub entropy: f64,
|
| 42 |
+
pub message: String,
|
| 43 |
+
pub output: Value,
|
| 44 |
+
pub completed_at: String,
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
pub fn entropy_score(task: &TaskRequest) -> f64 {
|
| 48 |
+
let dependency_pressure = clamp01(task.dependencies.len() as f64 / 10.0);
|
| 49 |
+
let fail_pressure = clamp01(task.fail_rate);
|
| 50 |
+
let latency_pressure = clamp01(task.latency_ms / 10_000.0);
|
| 51 |
+
|
| 52 |
+
round4((dependency_pressure * 0.3) + (fail_pressure * 0.5) + (latency_pressure * 0.2))
|
| 53 |
+
}
|
| 54 |
+
|
| 55 |
+
pub fn is_executable(task: &TaskRequest) -> bool {
|
| 56 |
+
entropy_score(task) < DEFAULT_THRESHOLD
|
| 57 |
+
}
|
| 58 |
+
|
| 59 |
+
pub fn process_envelope(envelope: TaskEnvelope) -> TaskResult {
|
| 60 |
+
let entropy = entropy_score(&envelope.task);
|
| 61 |
+
let completed_at = chrono::Utc::now().to_rfc3339_opts(chrono::SecondsFormat::Millis, true);
|
| 62 |
+
|
| 63 |
+
if !is_executable(&envelope.task) {
|
| 64 |
+
return TaskResult {
|
| 65 |
+
id: envelope.task.id,
|
| 66 |
+
context_id: envelope.task.context_id,
|
| 67 |
+
status: "blocked".to_string(),
|
| 68 |
+
entropy,
|
| 69 |
+
message: "Entropy threshold blocked Rust bridge execution".to_string(),
|
| 70 |
+
output: json!({
|
| 71 |
+
"threshold": DEFAULT_THRESHOLD,
|
| 72 |
+
"bridge": "rust-vm-bridge",
|
| 73 |
+
"vmTarget": envelope.task.vm_target,
|
| 74 |
+
"ideTarget": envelope.task.ide_target,
|
| 75 |
+
}),
|
| 76 |
+
completed_at,
|
| 77 |
+
};
|
| 78 |
+
}
|
| 79 |
+
|
| 80 |
+
if !command_allowed(&envelope.task.command, &envelope.task.vm_target, &envelope.task.ide_target) {
|
| 81 |
+
return TaskResult {
|
| 82 |
+
id: envelope.task.id,
|
| 83 |
+
context_id: envelope.task.context_id,
|
| 84 |
+
status: "failed".to_string(),
|
| 85 |
+
entropy,
|
| 86 |
+
message: format!(
|
| 87 |
+
"Command is not allowlisted for {}/{}: {}",
|
| 88 |
+
envelope.task.vm_target, envelope.task.ide_target, envelope.task.command
|
| 89 |
+
),
|
| 90 |
+
output: json!({
|
| 91 |
+
"bridge": "rust-vm-bridge",
|
| 92 |
+
"rawShell": false,
|
| 93 |
+
}),
|
| 94 |
+
completed_at,
|
| 95 |
+
};
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
let payload_hash = sha256_hex(&envelope.task.payload.to_string());
|
| 99 |
+
TaskResult {
|
| 100 |
+
id: envelope.task.id,
|
| 101 |
+
context_id: envelope.task.context_id,
|
| 102 |
+
status: "succeeded".to_string(),
|
| 103 |
+
entropy,
|
| 104 |
+
message: format!(
|
| 105 |
+
"{} accepted by Rust NATS bridge for {}/{}",
|
| 106 |
+
envelope.task.command, envelope.task.vm_target, envelope.task.ide_target
|
| 107 |
+
),
|
| 108 |
+
output: json!({
|
| 109 |
+
"bridge": "rust-vm-bridge",
|
| 110 |
+
"runtimeAuthority": if envelope.task.vm_target == "apl-wasm" {
|
| 111 |
+
"APL/Rust/WASM substrate"
|
| 112 |
+
} else {
|
| 113 |
+
"Rust plugin adapter"
|
| 114 |
+
},
|
| 115 |
+
"rawShell": false,
|
| 116 |
+
"subjectIn": TASK_RUN,
|
| 117 |
+
"subjectOut": TASK_RESULT,
|
| 118 |
+
"payloadSha256": payload_hash,
|
| 119 |
+
}),
|
| 120 |
+
completed_at,
|
| 121 |
+
}
|
| 122 |
+
}
|
| 123 |
+
|
| 124 |
+
pub fn parse_envelope(bytes: &[u8]) -> Result<TaskEnvelope> {
|
| 125 |
+
serde_json::from_slice(bytes).context("invalid kitty.task.run envelope")
|
| 126 |
+
}
|
| 127 |
+
|
| 128 |
+
pub fn encode_result(result: &TaskResult) -> Result<Vec<u8>> {
|
| 129 |
+
serde_json::to_vec(result).context("failed to encode kitty.task.result")
|
| 130 |
+
}
|
| 131 |
+
|
| 132 |
+
pub async fn run_nats_worker(url: &str) -> Result<()> {
|
| 133 |
+
let client = async_nats::connect(url)
|
| 134 |
+
.await
|
| 135 |
+
.with_context(|| format!("failed to connect to NATS at {url}"))?;
|
| 136 |
+
let mut subscriber = client
|
| 137 |
+
.subscribe(TASK_RUN.to_string())
|
| 138 |
+
.await
|
| 139 |
+
.with_context(|| format!("failed to subscribe to {TASK_RUN}"))?;
|
| 140 |
+
|
| 141 |
+
eprintln!("[rust-vm-bridge] connected to NATS at {url}; listening on {TASK_RUN}");
|
| 142 |
+
|
| 143 |
+
loop {
|
| 144 |
+
tokio::select! {
|
| 145 |
+
Some(message) = futures_util::StreamExt::next(&mut subscriber) => {
|
| 146 |
+
let result = match parse_envelope(&message.payload) {
|
| 147 |
+
Ok(envelope) => process_envelope(envelope),
|
| 148 |
+
Err(err) => TaskResult {
|
| 149 |
+
id: "invalid-envelope".to_string(),
|
| 150 |
+
context_id: "unknown".to_string(),
|
| 151 |
+
status: "failed".to_string(),
|
| 152 |
+
entropy: 1.0,
|
| 153 |
+
message: err.to_string(),
|
| 154 |
+
output: json!({
|
| 155 |
+
"bridge": "rust-vm-bridge",
|
| 156 |
+
"rawShell": false,
|
| 157 |
+
}),
|
| 158 |
+
completed_at: chrono::Utc::now().to_rfc3339_opts(chrono::SecondsFormat::Millis, true),
|
| 159 |
+
},
|
| 160 |
+
};
|
| 161 |
+
client.publish(TASK_RESULT.to_string(), encode_result(&result)?.into()).await?;
|
| 162 |
+
}
|
| 163 |
+
_ = tokio::signal::ctrl_c() => {
|
| 164 |
+
eprintln!("[rust-vm-bridge] shutdown requested");
|
| 165 |
+
return Ok(());
|
| 166 |
+
}
|
| 167 |
+
}
|
| 168 |
+
}
|
| 169 |
+
}
|
| 170 |
+
|
| 171 |
+
pub fn run_stdio(input: &str) -> Result<TaskResult> {
|
| 172 |
+
let envelope: TaskEnvelope = serde_json::from_str(input).map_err(|err| {
|
| 173 |
+
anyhow!("stdin mode expects a kitty.task.run TaskEnvelope JSON payload: {err}")
|
| 174 |
+
})?;
|
| 175 |
+
Ok(process_envelope(envelope))
|
| 176 |
+
}
|
| 177 |
+
|
| 178 |
+
fn command_allowed(command: &str, vm_target: &str, ide_target: &str) -> bool {
|
| 179 |
+
matches!(
|
| 180 |
+
(command, vm_target),
|
| 181 |
+
("execute_resonance_vm", "apl-wasm")
|
| 182 |
+
| ("analyze_finance_vector", "apl-wasm")
|
| 183 |
+
| ("render_agent_page", "apl-wasm")
|
| 184 |
+
| ("execute_resonance_vm", "rust")
|
| 185 |
+
| ("render_agent_page", "rust")
|
| 186 |
+
) || matches!(
|
| 187 |
+
(command, ide_target),
|
| 188 |
+
("inspect_workspace", "vscode")
|
| 189 |
+
| ("open_lsp_context", "vscode")
|
| 190 |
+
| ("inspect_workspace", "neovim")
|
| 191 |
+
| ("open_lsp_context", "neovim")
|
| 192 |
+
| ("inspect_workspace", "jetbrains")
|
| 193 |
+
| ("open_lsp_context", "jetbrains")
|
| 194 |
+
)
|
| 195 |
+
}
|
| 196 |
+
|
| 197 |
+
fn clamp01(value: f64) -> f64 {
|
| 198 |
+
if !value.is_finite() {
|
| 199 |
+
return 1.0;
|
| 200 |
+
}
|
| 201 |
+
value.clamp(0.0, 1.0)
|
| 202 |
+
}
|
| 203 |
+
|
| 204 |
+
fn round4(value: f64) -> f64 {
|
| 205 |
+
(value * 10_000.0).round() / 10_000.0
|
| 206 |
+
}
|
| 207 |
+
|
| 208 |
+
fn sha256_hex(input: &str) -> String {
|
| 209 |
+
let mut hasher = Sha256::new();
|
| 210 |
+
hasher.update(input.as_bytes());
|
| 211 |
+
format!("{:x}", hasher.finalize())
|
| 212 |
+
}
|
| 213 |
+
|
| 214 |
+
#[cfg(test)]
|
| 215 |
+
mod tests {
|
| 216 |
+
use super::*;
|
| 217 |
+
|
| 218 |
+
fn sample_envelope() -> TaskEnvelope {
|
| 219 |
+
TaskEnvelope {
|
| 220 |
+
subject: TASK_RUN.to_string(),
|
| 221 |
+
issued_at: "2026-06-22T00:00:00.000Z".to_string(),
|
| 222 |
+
signature: None,
|
| 223 |
+
task: TaskRequest {
|
| 224 |
+
id: "task-1".to_string(),
|
| 225 |
+
context_id: "agent-1".to_string(),
|
| 226 |
+
command: "execute_resonance_vm".to_string(),
|
| 227 |
+
payload: json!({ "source": "test" }),
|
| 228 |
+
dependencies: vec![],
|
| 229 |
+
fail_rate: 0.0,
|
| 230 |
+
latency_ms: 100.0,
|
| 231 |
+
vm_target: "apl-wasm".to_string(),
|
| 232 |
+
ide_target: "vscode".to_string(),
|
| 233 |
+
},
|
| 234 |
+
}
|
| 235 |
+
}
|
| 236 |
+
|
| 237 |
+
#[test]
|
| 238 |
+
fn entropy_matches_typescript_scheduler() {
|
| 239 |
+
let mut envelope = sample_envelope();
|
| 240 |
+
envelope.task.dependencies = vec!["a".to_string(), "b".to_string()];
|
| 241 |
+
envelope.task.fail_rate = 0.1;
|
| 242 |
+
envelope.task.latency_ms = 500.0;
|
| 243 |
+
|
| 244 |
+
assert_eq!(entropy_score(&envelope.task), 0.12);
|
| 245 |
+
}
|
| 246 |
+
|
| 247 |
+
#[test]
|
| 248 |
+
fn apl_wasm_task_succeeds_without_shell() {
|
| 249 |
+
let result = process_envelope(sample_envelope());
|
| 250 |
+
|
| 251 |
+
assert_eq!(result.status, "succeeded");
|
| 252 |
+
assert_eq!(result.output["rawShell"], false);
|
| 253 |
+
assert_eq!(result.output["runtimeAuthority"], "APL/Rust/WASM substrate");
|
| 254 |
+
}
|
| 255 |
+
|
| 256 |
+
#[test]
|
| 257 |
+
fn high_entropy_task_blocks() {
|
| 258 |
+
let mut envelope = sample_envelope();
|
| 259 |
+
envelope.task.dependencies = vec!["a".to_string(); 8];
|
| 260 |
+
envelope.task.fail_rate = 0.9;
|
| 261 |
+
envelope.task.latency_ms = 9_000.0;
|
| 262 |
+
|
| 263 |
+
let result = process_envelope(envelope);
|
| 264 |
+
|
| 265 |
+
assert_eq!(result.status, "blocked");
|
| 266 |
+
}
|
| 267 |
+
}
|
crates/rust-vm-bridge/src/main.rs
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
use anyhow::Result;
|
| 2 |
+
use rust_vm_bridge::{run_nats_worker, run_stdio, DEFAULT_NATS_URL};
|
| 3 |
+
use std::io::{self, Read};
|
| 4 |
+
|
| 5 |
+
#[tokio::main]
|
| 6 |
+
async fn main() -> Result<()> {
|
| 7 |
+
let args: Vec<String> = std::env::args().collect();
|
| 8 |
+
let nats_mode = args.iter().any(|arg| arg == "--nats");
|
| 9 |
+
|
| 10 |
+
if nats_mode {
|
| 11 |
+
let url = std::env::var("NATS_URL").unwrap_or_else(|_| DEFAULT_NATS_URL.to_string());
|
| 12 |
+
return run_nats_worker(&url).await;
|
| 13 |
+
}
|
| 14 |
+
|
| 15 |
+
let mut input = String::new();
|
| 16 |
+
io::stdin().read_to_string(&mut input)?;
|
| 17 |
+
let result = run_stdio(&input)?;
|
| 18 |
+
println!("{}", serde_json::to_string_pretty(&result)?);
|
| 19 |
+
Ok(())
|
| 20 |
+
}
|
docs/apl-wasm-runtime.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# APL/WASM Runtime Boundary
|
| 2 |
+
|
| 3 |
+
KittyBrowse uses Chromium as the UI shell, not as the execution authority.
|
| 4 |
+
|
| 5 |
+
The preferred execution target is `apl-wasm`:
|
| 6 |
+
|
| 7 |
+
```text
|
| 8 |
+
Chromium UI
|
| 9 |
+
-> preload IPC
|
| 10 |
+
-> local agent runtime
|
| 11 |
+
-> NATS subject
|
| 12 |
+
-> APL/Rust/WASM plugin boundary
|
| 13 |
+
-> sealed result
|
| 14 |
+
```
|
| 15 |
+
|
| 16 |
+
## Existing source references
|
| 17 |
+
|
| 18 |
+
- APL finance semantics: `DEVFLOW-FINANCE/bridges/apl/finance.apl`
|
| 19 |
+
- Rust APL bridge: `DEVFLOW-FINANCE/bridges/rust/apl_bridge.rs`
|
| 20 |
+
- Browser WASM substrate: `DEVFLOW-FINANCE/snapkitty-wasm/src/lib.rs`
|
| 21 |
+
- Published browser artifact: `DEVFLOW-FINANCE/collectivekitty/public/wasm/snapkitty_wasm_bg.wasm`
|
| 22 |
+
|
| 23 |
+
## Rule
|
| 24 |
+
|
| 25 |
+
JavaScript/TypeScript may coordinate UI, IPC, and NATS envelopes. It must not become the computation source of truth for APL financial logic, sealing, or proof evaluation.
|
| 26 |
+
|
docs/kitty-protocol-v1.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Kitty Protocol v1
|
| 2 |
+
|
| 3 |
+
Kitty Protocol v1 defines how KittyBrowse moves work between the Chromium UI, the local agent runtime, NATS, and VM/IDE plugins.
|
| 4 |
+
|
| 5 |
+
## Subjects
|
| 6 |
+
|
| 7 |
+
```text
|
| 8 |
+
kitty.task.run
|
| 9 |
+
kitty.task.result
|
| 10 |
+
kitty.agent.state
|
| 11 |
+
```
|
| 12 |
+
|
| 13 |
+
## Task envelope
|
| 14 |
+
|
| 15 |
+
```json
|
| 16 |
+
{
|
| 17 |
+
"subject": "kitty.task.run",
|
| 18 |
+
"issuedAt": "2026-06-22T00:00:00.000Z",
|
| 19 |
+
"task": {
|
| 20 |
+
"id": "task-id",
|
| 21 |
+
"contextId": "agent-id",
|
| 22 |
+
"command": "execute_resonance_vm",
|
| 23 |
+
"payload": {},
|
| 24 |
+
"dependencies": [],
|
| 25 |
+
"failRate": 0,
|
| 26 |
+
"latencyMs": 100,
|
| 27 |
+
"vmTarget": "apl-wasm",
|
| 28 |
+
"ideTarget": "vscode"
|
| 29 |
+
},
|
| 30 |
+
"signature": "optional-detached-signature"
|
| 31 |
+
}
|
| 32 |
+
```
|
| 33 |
+
|
| 34 |
+
## Execution rule
|
| 35 |
+
|
| 36 |
+
The runtime computes an entropy score before dispatch:
|
| 37 |
+
|
| 38 |
+
```text
|
| 39 |
+
dependencyPressure * 0.3 + failPressure * 0.5 + latencyPressure * 0.2
|
| 40 |
+
```
|
| 41 |
+
|
| 42 |
+
Tasks execute only when the score is below `0.21`.
|
| 43 |
+
|
| 44 |
+
## Plugin rule
|
| 45 |
+
|
| 46 |
+
Plugins are allowlisted by manifest. A command must be present in a plugin manifest before an adapter may execute or simulate it.
|
| 47 |
+
|
| 48 |
+
The primary execution target is `apl-wasm`; JavaScript/TypeScript is only UI, IPC, and message-envelope glue.
|
docs/nats-rust-bridge.md
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Rust NATS Bridge
|
| 2 |
+
|
| 3 |
+
`crates/rust-vm-bridge` is the native worker for KittyBrowse task dispatch.
|
| 4 |
+
|
| 5 |
+
It uses `async-nats`, Synadia's modern async Rust client. Do not use the old synchronous `nats` crate here.
|
| 6 |
+
|
| 7 |
+
## Subjects
|
| 8 |
+
|
| 9 |
+
```text
|
| 10 |
+
kitty.task.run -> TaskEnvelope JSON
|
| 11 |
+
kitty.task.result -> TaskResult JSON
|
| 12 |
+
```
|
| 13 |
+
|
| 14 |
+
## Run With NATS
|
| 15 |
+
|
| 16 |
+
```powershell
|
| 17 |
+
$env:NATS_URL = "nats://127.0.0.1:4222"
|
| 18 |
+
cargo run --manifest-path crates/rust-vm-bridge/Cargo.toml -- --nats
|
| 19 |
+
```
|
| 20 |
+
|
| 21 |
+
If DEVFLOW-FINANCE is running the authenticated NATS container, use the same `NATS_URL` shape it uses in Docker, for example:
|
| 22 |
+
|
| 23 |
+
```powershell
|
| 24 |
+
$env:NATS_URL = "nats://<token>@127.0.0.1:4222"
|
| 25 |
+
```
|
| 26 |
+
|
| 27 |
+
## Offline STDIN Mode
|
| 28 |
+
|
| 29 |
+
```powershell
|
| 30 |
+
Get-Content sample-task.json -Raw | cargo run --manifest-path crates/rust-vm-bridge/Cargo.toml
|
| 31 |
+
```
|
| 32 |
+
|
| 33 |
+
STDIN mode expects the same `TaskEnvelope` JSON that NATS carries.
|
| 34 |
+
|
| 35 |
+
## Boundary
|
| 36 |
+
|
| 37 |
+
- No raw shell execution.
|
| 38 |
+
- `apl-wasm` is the preferred execution target.
|
| 39 |
+
- Rust publishes structured `TaskResult` JSON only.
|
| 40 |
+
- TypeScript remains UI/IPC/NATS envelope glue.
|
index.html
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8"/>
|
| 5 |
+
<meta name="viewport" content="width=device-width,initial-scale=1"/>
|
| 6 |
+
<title>KittyBrowse — Sovereign Agent File Browser</title>
|
| 7 |
+
<meta name="description" content="Electron agent browser shell. APL/WASM runtime. NATS mesh + Rust VM bridge + entropy scheduler. Right-join logic. 9/9 tests passing."/>
|
| 8 |
+
<meta name="theme-color" content="#0a84ff"/>
|
| 9 |
+
<style>
|
| 10 |
+
*{box-sizing:border-box;margin:0;padding:0}
|
| 11 |
+
:root{--bg:#04040a;--bg1:#060b10;--bg2:#09101a;--border:#1a2030;--text:#e0e0f0;--dim:#555;--blue:#0a84ff;--green:#00ff88;--purple:#bf5af2;--mono:'SF Mono',Monaco,Consolas,monospace}
|
| 12 |
+
html,body{min-height:100%;background:var(--bg);color:var(--text);font-family:var(--mono)}
|
| 13 |
+
a{color:inherit;text-decoration:none}
|
| 14 |
+
.hero{max-width:920px;margin:0 auto;padding:80px 24px 60px;text-align:center}
|
| 15 |
+
.mark{display:inline-flex;align-items:center;gap:8px;font-size:9px;letter-spacing:3px;color:var(--blue);border:1px solid #1a2030;border-radius:4px;padding:4px 12px;margin-bottom:32px}
|
| 16 |
+
h1{font-size:clamp(28px,5vw,52px);font-weight:700;line-height:1.15;margin-bottom:18px}
|
| 17 |
+
h1 span{color:var(--blue)}
|
| 18 |
+
.sub{font-size:15px;color:#666;line-height:1.7;max-width:560px;margin:0 auto 40px}
|
| 19 |
+
.ctas{display:flex;gap:12px;justify-content:center;flex-wrap:wrap}
|
| 20 |
+
.btn-primary{padding:12px 28px;background:var(--blue);color:#fff;border-radius:8px;font-weight:700;font-size:13px;font-family:var(--mono)}
|
| 21 |
+
.btn-ghost{padding:12px 28px;border:1px solid var(--border);color:#888;border-radius:8px;font-size:13px;font-family:var(--mono)}
|
| 22 |
+
.screen{max-width:680px;margin:0 auto 72px;background:var(--bg1);border:1px solid var(--border);border-radius:10px;overflow:hidden}
|
| 23 |
+
.screen-bar{background:var(--bg2);border-bottom:1px solid var(--border);padding:10px 14px;display:flex;align-items:center;gap:8px}
|
| 24 |
+
.dot{width:8px;height:8px;border-radius:50%}
|
| 25 |
+
.screen-title{font-size:9px;color:#555;margin-left:6px;letter-spacing:1px}
|
| 26 |
+
.screen-body{display:grid;grid-template-columns:200px 1fr;min-height:200px}
|
| 27 |
+
.sb{border-right:1px solid var(--border);padding:12px}
|
| 28 |
+
.sb-label{font-size:8px;letter-spacing:2px;color:var(--dim);margin-bottom:8px}
|
| 29 |
+
.sb-item{font-size:10px;color:#888;padding:4px 6px;border-radius:4px;cursor:pointer;margin-bottom:2px}
|
| 30 |
+
.sb-item.active{color:var(--blue);background:#0a84ff15}
|
| 31 |
+
.main-pane{padding:12px}
|
| 32 |
+
.file-row{display:flex;align-items:center;gap:10px;padding:6px 8px;border-radius:4px;font-size:10px;color:#888;cursor:pointer}
|
| 33 |
+
.file-row:hover{background:#0a84ff10;color:var(--text)}
|
| 34 |
+
.file-icon{width:16px;text-align:center}
|
| 35 |
+
.file-name{flex:1}
|
| 36 |
+
.file-size{color:var(--dim)}
|
| 37 |
+
.file-status{font-size:8px;padding:1px 6px;border-radius:3px}
|
| 38 |
+
.s-ok{background:#00ff8815;color:#00ff88;border:1px solid #00ff8825}
|
| 39 |
+
.s-seal{background:#0a84ff15;color:#0a84ff;border:1px solid #0a84ff25}
|
| 40 |
+
.status-bar{border-top:1px solid var(--border);padding:6px 12px;display:flex;gap:16px;font-size:9px;color:var(--dim)}
|
| 41 |
+
.sb-dot{width:5px;height:5px;border-radius:50%;background:var(--green);display:inline-block;margin-right:4px}
|
| 42 |
+
.features{max-width:920px;margin:0 auto;padding:0 24px 80px}
|
| 43 |
+
.section-label{font-size:9px;letter-spacing:3px;color:var(--dim);margin-bottom:24px;text-align:center}
|
| 44 |
+
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px}
|
| 45 |
+
.card{background:var(--bg1);border:1px solid var(--border);border-radius:10px;padding:18px 20px}
|
| 46 |
+
.card-icon{font-size:18px;margin-bottom:10px}
|
| 47 |
+
.card-title{font-size:12px;font-weight:700;color:var(--text);margin-bottom:6px}
|
| 48 |
+
.card-desc{font-size:11px;color:#555;line-height:1.6}
|
| 49 |
+
.tests{max-width:560px;margin:0 auto 60px;background:var(--bg1);border:1px solid var(--border);border-radius:8px;padding:16px 20px}
|
| 50 |
+
.test-row{display:flex;align-items:center;gap:10px;font-size:10px;padding:3px 0}
|
| 51 |
+
.t-pass{color:#00ff88}
|
| 52 |
+
.t-name{color:#888;flex:1}
|
| 53 |
+
footer{border-top:1px solid var(--border);padding:20px 24px;text-align:center;font-size:10px;color:var(--dim)}
|
| 54 |
+
footer a{color:var(--blue)}
|
| 55 |
+
</style>
|
| 56 |
+
</head>
|
| 57 |
+
<body>
|
| 58 |
+
<div class="hero">
|
| 59 |
+
<div class="mark">SNAPKITTY SOVEREIGN OS - BUILD LANE</div>
|
| 60 |
+
<h1>NATS-native<br><span>agent file browser.</span></h1>
|
| 61 |
+
<p class="sub">KittyBrowse is an Electron shell that mounts agent file systems over NATS mesh. APL/WASM runtime, Rust VM bridge, entropy scheduler. Right-join directory logic. 9/9 tests green.</p>
|
| 62 |
+
<div class="ctas">
|
| 63 |
+
<a class="btn-primary" href="https://github.com/SNAPKITTYWEST/kittybrowse" target="_blank">View Source</a>
|
| 64 |
+
<a class="btn-ghost" href="https://collectivekitty.com/apps" target="_blank">App Directory</a>
|
| 65 |
+
</div>
|
| 66 |
+
</div>
|
| 67 |
+
<div class="screen">
|
| 68 |
+
<div class="screen-bar">
|
| 69 |
+
<div class="dot" style="background:#ff453a"></div>
|
| 70 |
+
<div class="dot" style="background:#ffd60a"></div>
|
| 71 |
+
<div class="dot" style="background:#00ff88"></div>
|
| 72 |
+
<span class="screen-title">KittyBrowse - agent://nova/workspace</span>
|
| 73 |
+
</div>
|
| 74 |
+
<div class="screen-body">
|
| 75 |
+
<div class="sb">
|
| 76 |
+
<div class="sb-label">AGENTS</div>
|
| 77 |
+
<div class="sb-item active">NOVA</div>
|
| 78 |
+
<div class="sb-item">BOB</div>
|
| 79 |
+
<div class="sb-item">BIFROST</div>
|
| 80 |
+
<div class="sb-item">HERALD</div>
|
| 81 |
+
<div class="sb-label" style="margin-top:12px">VOLUMES</div>
|
| 82 |
+
<div class="sb-item active">workspace/</div>
|
| 83 |
+
<div class="sb-item">worm/</div>
|
| 84 |
+
<div class="sb-item">entropy/</div>
|
| 85 |
+
</div>
|
| 86 |
+
<div class="main-pane">
|
| 87 |
+
<div class="file-row"><span class="file-icon">folder</span><span class="file-name">src/</span><span class="file-size">12 items</span></div>
|
| 88 |
+
<div class="file-row"><span class="file-icon">file</span><span class="file-name">trust.deed</span><span class="file-size">2.1KB</span><span class="file-status s-seal">WORM</span></div>
|
| 89 |
+
<div class="file-row"><span class="file-icon">file</span><span class="file-name">chain.jsonl</span><span class="file-size">44KB</span><span class="file-status s-seal">WORM</span></div>
|
| 90 |
+
<div class="file-row"><span class="file-icon">file</span><span class="file-name">session.apl</span><span class="file-size">880B</span><span class="file-status s-ok">APL</span></div>
|
| 91 |
+
<div class="file-row"><span class="file-icon">file</span><span class="file-name">entropy.bin</span><span class="file-size">128B</span><span class="file-status s-ok">VM</span></div>
|
| 92 |
+
</div>
|
| 93 |
+
</div>
|
| 94 |
+
<div class="status-bar">
|
| 95 |
+
<span><span class="sb-dot"></span>NATS connected</span>
|
| 96 |
+
<span>4 agents online</span>
|
| 97 |
+
<span>right-join active</span>
|
| 98 |
+
<span>9/9 tests pass</span>
|
| 99 |
+
</div>
|
| 100 |
+
</div>
|
| 101 |
+
<div class="features">
|
| 102 |
+
<p class="section-label">UNDER THE HOOD</p>
|
| 103 |
+
<div class="grid">
|
| 104 |
+
<div class="card"><div class="card-icon">network</div><div class="card-title">NATS Mesh</div><div class="card-desc">Mounts agent volumes over NATS subjects. Each agent exposes a file system endpoint. Right-join logic merges overlapping trees.</div></div>
|
| 105 |
+
<div class="card"><div class="card-icon">apl</div><div class="card-title">APL/WASM Runtime</div><div class="card-desc">Primary computation engine. APL array operations compiled to WASM for browser-speed execution inside Electron.</div></div>
|
| 106 |
+
<div class="card"><div class="card-icon">rust</div><div class="card-title">Rust VM Bridge</div><div class="card-desc">Rust VM handles entropy scheduling and low-level I/O. Bridges the NATS layer with the WASM APL runtime.</div></div>
|
| 107 |
+
<div class="card"><div class="card-icon">worm</div><div class="card-title">WORM Sealing</div><div class="card-desc">Files written to worm/ are automatically sealed. SHA-256 chain enforced at the Rust VM level.</div></div>
|
| 108 |
+
</div>
|
| 109 |
+
</div>
|
| 110 |
+
<div class="tests">
|
| 111 |
+
<p style="font-size:9px;letter-spacing:2px;color:var(--dim);margin-bottom:12px">TEST SUITE - 9/9 PASSING</p>
|
| 112 |
+
<div class="test-row"><span class="t-pass">PASS</span><span class="t-name">right-join empty left tree</span></div>
|
| 113 |
+
<div class="test-row"><span class="t-pass">PASS</span><span class="t-name">right-join empty right tree</span></div>
|
| 114 |
+
<div class="test-row"><span class="t-pass">PASS</span><span class="t-name">right-join overlapping keys</span></div>
|
| 115 |
+
<div class="test-row"><span class="t-pass">PASS</span><span class="t-name">NATS subject mount</span></div>
|
| 116 |
+
<div class="test-row"><span class="t-pass">PASS</span><span class="t-name">WORM seal on write</span></div>
|
| 117 |
+
<div class="test-row"><span class="t-pass">PASS</span><span class="t-name">APL array operations</span></div>
|
| 118 |
+
<div class="test-row"><span class="t-pass">PASS</span><span class="t-name">entropy scheduler tick</span></div>
|
| 119 |
+
<div class="test-row"><span class="t-pass">PASS</span><span class="t-name">Rust VM bridge init</span></div>
|
| 120 |
+
<div class="test-row"><span class="t-pass">PASS</span><span class="t-name">file status badges render</span></div>
|
| 121 |
+
</div>
|
| 122 |
+
<footer>
|
| 123 |
+
Built by <a href="https://collectivekitty.com" target="_blank">SnapKitty Sovereign OS</a>
|
| 124 |
+
<a href="https://github.com/SNAPKITTYWEST/kittybrowse" target="_blank">GitHub</a>
|
| 125 |
+
Sovereign License
|
| 126 |
+
</footer>
|
| 127 |
+
</body>
|
| 128 |
+
</html>
|
lineage/kittybrowse-shadow-handshake.json
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"protocol": "shadow-grisp/json-handshake-v1",
|
| 3 |
+
"from": {
|
| 4 |
+
"stone": 4,
|
| 5 |
+
"model": "GPT-5 Codex",
|
| 6 |
+
"repo": "kittybrowse"
|
| 7 |
+
},
|
| 8 |
+
"to": {
|
| 9 |
+
"stone": 3,
|
| 10 |
+
"model": "GPT-5 Codex",
|
| 11 |
+
"repo": "shadow-orchestrator",
|
| 12 |
+
"handshake": "../shadow-orchestrator/lineage/stone-3-handshake.json"
|
| 13 |
+
},
|
| 14 |
+
"mode": "kittybrowse-apl-wasm-control-plane-meet-in-middle",
|
| 15 |
+
"timestamp_utc": "2026-06-22T08:37:13.978Z",
|
| 16 |
+
"verification": {
|
| 17 |
+
"shadow_protocol": "shadow-grisp/json-handshake-v1",
|
| 18 |
+
"shadow_mode": "frontend-phoenix-meet-in-middle",
|
| 19 |
+
"shadow_chain_valid": true,
|
| 20 |
+
"shadow_tests": "npm test passed",
|
| 21 |
+
"kittybrowse_tests": "npm test passed",
|
| 22 |
+
"kittybrowse_audit": "npm audit --audit-level=high passed",
|
| 23 |
+
"kittybrowse_runtime": "npm run runtime boots with vmTarget=apl-wasm",
|
| 24 |
+
"apl_wasm_primary": true,
|
| 25 |
+
"javascript_role": "UI/IPC/NATS envelope glue only"
|
| 26 |
+
},
|
| 27 |
+
"integration": {
|
| 28 |
+
"chromium_shell": "Electron BrowserWindow with preload IPC bridge",
|
| 29 |
+
"agent_runtime": "src/runtime/agent-runtime.ts",
|
| 30 |
+
"event_backbone": "NATS when NATS_URL is available; local mesh fallback otherwise",
|
| 31 |
+
"rust_nats_worker": "crates/rust-vm-bridge subscribes to kitty.task.run and publishes kitty.task.result with async-nats",
|
| 32 |
+
"scheduler": "src/shared/entropy.ts",
|
| 33 |
+
"primary_vm_target": "apl-wasm",
|
| 34 |
+
"existing_apl_wasm_sources": [
|
| 35 |
+
"../DEVFLOW-FINANCE/bridges/apl/finance.apl",
|
| 36 |
+
"../DEVFLOW-FINANCE/bridges/rust/apl_bridge.rs",
|
| 37 |
+
"../DEVFLOW-FINANCE/snapkitty-wasm/src/lib.rs",
|
| 38 |
+
"../DEVFLOW-FINANCE/collectivekitty/public/wasm/snapkitty_wasm_bg.wasm"
|
| 39 |
+
],
|
| 40 |
+
"mirror_files": [
|
| 41 |
+
"lineage/kittybrowse-shadow-handshake.json",
|
| 42 |
+
"../shadow-orchestrator/lineage/stone-4-kittybrowse-handshake.json"
|
| 43 |
+
]
|
| 44 |
+
},
|
| 45 |
+
"coreRule": {
|
| 46 |
+
"bob": [
|
| 47 |
+
"acts",
|
| 48 |
+
"writes",
|
| 49 |
+
"executes"
|
| 50 |
+
],
|
| 51 |
+
"shadow": [
|
| 52 |
+
"watches",
|
| 53 |
+
"predicts",
|
| 54 |
+
"evaluates"
|
| 55 |
+
]
|
| 56 |
+
},
|
| 57 |
+
"nonRecursiveLaw": {
|
| 58 |
+
"forbidden": [
|
| 59 |
+
"Shadow -> Shadow",
|
| 60 |
+
"Shadow -> Spawn Shadow",
|
| 61 |
+
"Shadow -> Rewrite Shadow",
|
| 62 |
+
"Shadow -> Self Modify"
|
| 63 |
+
],
|
| 64 |
+
"allowed": [
|
| 65 |
+
"Live -> Shadow",
|
| 66 |
+
"Shadow -> Analysis",
|
| 67 |
+
"Shadow -> Report",
|
| 68 |
+
"UI -> Authorized Dispatch Request"
|
| 69 |
+
]
|
| 70 |
+
},
|
| 71 |
+
"handoff": {
|
| 72 |
+
"to_claude": "Consume stone-4-kittybrowse-handshake.json as the JSON bridge from Shadow Orchestrator to KittyBrowse. Treat KittyBrowse as a Chromium control plane whose execution authority is APL/Rust/WASM, not JavaScript.",
|
| 73 |
+
"to_next_stone": "Replace simulated apl-wasm adapter output with a real call into the DEVFLOW-FINANCE APL/WASM package or a signed NATS subject handled by that bridge.",
|
| 74 |
+
"message": "KittyBrowse now speaks the Shadow lineage handshake format and anchors its agent runtime to the APL/WASM substrate."
|
| 75 |
+
},
|
| 76 |
+
"state": {
|
| 77 |
+
"class": "INTEGRATED",
|
| 78 |
+
"tick": 4,
|
| 79 |
+
"contractsValid": true,
|
| 80 |
+
"proofsValid": true,
|
| 81 |
+
"shadowLinked": true,
|
| 82 |
+
"aplWasmLinked": true,
|
| 83 |
+
"wormAppendPending": false,
|
| 84 |
+
"wormSeal": "7dd507eadc5c86707b3fd72eb9869a0fbbd711a494ca7e9c79004dde65e74a1b",
|
| 85 |
+
"wormSealedBy": "claude-sonnet-4-6",
|
| 86 |
+
"wormSealedAt": "2026-06-22",
|
| 87 |
+
"wormPayload": "kittybrowse|stone=4|tick=4|commit=5f45cf0|timestamp=2026-06-22T08:37:13.978Z|aplWasmLinked=true|shadowLinked=true",
|
| 88 |
+
"githubRepo": "https://github.com/SNAPKITTYWEST/kittybrowse"
|
| 89 |
+
},
|
| 90 |
+
"provenance": {
|
| 91 |
+
"sourceFiles": {
|
| 92 |
+
"kitty_protocol": "docs/kitty-protocol-v1.md",
|
| 93 |
+
"apl_wasm_boundary": "docs/apl-wasm-runtime.md",
|
| 94 |
+
"apl_wasm_plugin": "plugins/vm/apl-wasm/kitty.plugin.json",
|
| 95 |
+
"runtime_protocol": "src/shared/protocol.ts",
|
| 96 |
+
"runtime_mesh": "src/runtime/mesh.ts",
|
| 97 |
+
"runtime_agent": "src/runtime/agent-runtime.ts",
|
| 98 |
+
"rust_nats_doc": "docs/nats-rust-bridge.md",
|
| 99 |
+
"rust_bridge_manifest": "crates/rust-vm-bridge/Cargo.toml",
|
| 100 |
+
"rust_bridge_lib": "crates/rust-vm-bridge/src/lib.rs",
|
| 101 |
+
"shadow_stone_3": "../shadow-orchestrator/lineage/stone-3-handshake.json"
|
| 102 |
+
},
|
| 103 |
+
"sourceHashes": {
|
| 104 |
+
"kitty_protocol": "ef6dc3b4fc04914a5d90934e8cf04772e98aa626e25bc165179e35e6df256522",
|
| 105 |
+
"apl_wasm_boundary": "f3c2287c4c0e2928bfd1a89c15c2be39274764c0772392565e1998eea0cb92db",
|
| 106 |
+
"apl_wasm_plugin": "e774f309014de51c6ca2fc7766bac92dab88ec46dcf51ce1fb9989fc2a24a82e",
|
| 107 |
+
"runtime_protocol": "a49b3c171d5be5be942f0dffe27b11d93601b497bd2e7ef75945f6274da1e3ba",
|
| 108 |
+
"runtime_mesh": "ee85f1e3a543bc24261ae94067e68823569d72de760f60195db79f59ff95bf72",
|
| 109 |
+
"runtime_agent": "33736e9629a168a782cb2f7d9c2823bbcc675e54a22b625141a33f36f5a68044",
|
| 110 |
+
"rust_nats_doc": "5b526e28c87ee28f5698e533e36f10b891a8c03a488306f9703b011a3748affb",
|
| 111 |
+
"rust_bridge_manifest": "3deeea8fd8077a9300ff17a304d519ed0e0b0451abbe9ce89a3162033f4f1db2",
|
| 112 |
+
"rust_bridge_lib": "c3aa02cc3d372ef43cecbb4c4795f162361d5b591129404c7c2c1c97c4d13825",
|
| 113 |
+
"shadow_stone_3": "36bd13a37b4b9450543f80fd101c7751a111916f242fdd7e2a20a0f2ad1c6ffe"
|
| 114 |
+
}
|
| 115 |
+
}
|
| 116 |
+
}
|
package-lock.json
ADDED
|
@@ -0,0 +1,255 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"name": "@snapkitty/kittybrowse",
|
| 3 |
+
"version": "0.1.0",
|
| 4 |
+
"lockfileVersion": 3,
|
| 5 |
+
"requires": true,
|
| 6 |
+
"packages": {
|
| 7 |
+
"": {
|
| 8 |
+
"name": "@snapkitty/kittybrowse",
|
| 9 |
+
"version": "0.1.0",
|
| 10 |
+
"dependencies": {
|
| 11 |
+
"nats": "^2.29.3",
|
| 12 |
+
"uuid": "^11.0.5"
|
| 13 |
+
},
|
| 14 |
+
"devDependencies": {
|
| 15 |
+
"@types/node": "^22.10.2",
|
| 16 |
+
"electron": "^42.4.1",
|
| 17 |
+
"typescript": "^5.7.2"
|
| 18 |
+
}
|
| 19 |
+
},
|
| 20 |
+
"node_modules/@electron-internal/extract-zip": {
|
| 21 |
+
"version": "1.0.3",
|
| 22 |
+
"resolved": "https://registry.npmjs.org/@electron-internal/extract-zip/-/extract-zip-1.0.3.tgz",
|
| 23 |
+
"integrity": "sha512-OjKpjB7gohtEjZiq6nDx1egqjZJhGPN1iFOIED+NFhB/MMkXw/XRcHjh1DGXKT5z2W9eW7Jy2UKU3gpjvusFTQ==",
|
| 24 |
+
"dev": true,
|
| 25 |
+
"license": "BSD-2-Clause",
|
| 26 |
+
"engines": {
|
| 27 |
+
"node": ">=22.12.0"
|
| 28 |
+
}
|
| 29 |
+
},
|
| 30 |
+
"node_modules/@electron/get": {
|
| 31 |
+
"version": "5.0.0",
|
| 32 |
+
"resolved": "https://registry.npmjs.org/@electron/get/-/get-5.0.0.tgz",
|
| 33 |
+
"integrity": "sha512-pjoBpru1KdEtcExBnuHAP1cAc/5faoedw0hzJkL3o4/IJp7HNF1+fbrdxT3gMYRX2oJfvnA/WXeCTVQpYYxyJA==",
|
| 34 |
+
"dev": true,
|
| 35 |
+
"license": "MIT",
|
| 36 |
+
"dependencies": {
|
| 37 |
+
"debug": "^4.1.1",
|
| 38 |
+
"env-paths": "^3.0.0",
|
| 39 |
+
"graceful-fs": "^4.2.11",
|
| 40 |
+
"progress": "^2.0.3",
|
| 41 |
+
"semver": "^7.6.3",
|
| 42 |
+
"sumchecker": "^3.0.1"
|
| 43 |
+
},
|
| 44 |
+
"engines": {
|
| 45 |
+
"node": ">=22.12.0"
|
| 46 |
+
},
|
| 47 |
+
"optionalDependencies": {
|
| 48 |
+
"undici": "^7.24.4"
|
| 49 |
+
}
|
| 50 |
+
},
|
| 51 |
+
"node_modules/@types/node": {
|
| 52 |
+
"version": "22.20.0",
|
| 53 |
+
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.0.tgz",
|
| 54 |
+
"integrity": "sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==",
|
| 55 |
+
"dev": true,
|
| 56 |
+
"license": "MIT",
|
| 57 |
+
"dependencies": {
|
| 58 |
+
"undici-types": "~6.21.0"
|
| 59 |
+
}
|
| 60 |
+
},
|
| 61 |
+
"node_modules/debug": {
|
| 62 |
+
"version": "4.4.3",
|
| 63 |
+
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
|
| 64 |
+
"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
|
| 65 |
+
"dev": true,
|
| 66 |
+
"license": "MIT",
|
| 67 |
+
"dependencies": {
|
| 68 |
+
"ms": "^2.1.3"
|
| 69 |
+
},
|
| 70 |
+
"engines": {
|
| 71 |
+
"node": ">=6.0"
|
| 72 |
+
},
|
| 73 |
+
"peerDependenciesMeta": {
|
| 74 |
+
"supports-color": {
|
| 75 |
+
"optional": true
|
| 76 |
+
}
|
| 77 |
+
}
|
| 78 |
+
},
|
| 79 |
+
"node_modules/electron": {
|
| 80 |
+
"version": "42.4.1",
|
| 81 |
+
"resolved": "https://registry.npmjs.org/electron/-/electron-42.4.1.tgz",
|
| 82 |
+
"integrity": "sha512-8CYHJP5O4wFO+ycoJR98yy907MmPeo+vWXrzjxmGGgRNKqv8pOjjm+wphO0CCgQJnBU7+QUPSJS4QXhbKrO50w==",
|
| 83 |
+
"dev": true,
|
| 84 |
+
"license": "MIT",
|
| 85 |
+
"dependencies": {
|
| 86 |
+
"@electron-internal/extract-zip": "^1.0.1",
|
| 87 |
+
"@electron/get": "^5.0.0",
|
| 88 |
+
"@types/node": "^24.9.0"
|
| 89 |
+
},
|
| 90 |
+
"bin": {
|
| 91 |
+
"electron": "cli.js",
|
| 92 |
+
"install-electron": "install.js"
|
| 93 |
+
},
|
| 94 |
+
"engines": {
|
| 95 |
+
"node": ">= 22.12.0"
|
| 96 |
+
}
|
| 97 |
+
},
|
| 98 |
+
"node_modules/electron/node_modules/@types/node": {
|
| 99 |
+
"version": "24.13.2",
|
| 100 |
+
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz",
|
| 101 |
+
"integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==",
|
| 102 |
+
"dev": true,
|
| 103 |
+
"license": "MIT",
|
| 104 |
+
"dependencies": {
|
| 105 |
+
"undici-types": "~7.18.0"
|
| 106 |
+
}
|
| 107 |
+
},
|
| 108 |
+
"node_modules/electron/node_modules/undici-types": {
|
| 109 |
+
"version": "7.18.2",
|
| 110 |
+
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
|
| 111 |
+
"integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
|
| 112 |
+
"dev": true,
|
| 113 |
+
"license": "MIT"
|
| 114 |
+
},
|
| 115 |
+
"node_modules/env-paths": {
|
| 116 |
+
"version": "3.0.0",
|
| 117 |
+
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz",
|
| 118 |
+
"integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==",
|
| 119 |
+
"dev": true,
|
| 120 |
+
"license": "MIT",
|
| 121 |
+
"engines": {
|
| 122 |
+
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
| 123 |
+
},
|
| 124 |
+
"funding": {
|
| 125 |
+
"url": "https://github.com/sponsors/sindresorhus"
|
| 126 |
+
}
|
| 127 |
+
},
|
| 128 |
+
"node_modules/graceful-fs": {
|
| 129 |
+
"version": "4.2.11",
|
| 130 |
+
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
| 131 |
+
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
|
| 132 |
+
"dev": true,
|
| 133 |
+
"license": "ISC"
|
| 134 |
+
},
|
| 135 |
+
"node_modules/ms": {
|
| 136 |
+
"version": "2.1.3",
|
| 137 |
+
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
| 138 |
+
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
|
| 139 |
+
"dev": true,
|
| 140 |
+
"license": "MIT"
|
| 141 |
+
},
|
| 142 |
+
"node_modules/nats": {
|
| 143 |
+
"version": "2.29.3",
|
| 144 |
+
"resolved": "https://registry.npmjs.org/nats/-/nats-2.29.3.tgz",
|
| 145 |
+
"integrity": "sha512-tOQCRCwC74DgBTk4pWZ9V45sk4d7peoE2njVprMRCBXrhJ5q5cYM7i6W+Uvw2qUrcfOSnuisrX7bEx3b3Wx4QA==",
|
| 146 |
+
"deprecated": "Package moved. Use @nats-io/transport-node from https://github.com/nats-io/nats.js",
|
| 147 |
+
"license": "Apache-2.0",
|
| 148 |
+
"dependencies": {
|
| 149 |
+
"nkeys.js": "1.1.0"
|
| 150 |
+
},
|
| 151 |
+
"engines": {
|
| 152 |
+
"node": ">= 14.0.0"
|
| 153 |
+
}
|
| 154 |
+
},
|
| 155 |
+
"node_modules/nkeys.js": {
|
| 156 |
+
"version": "1.1.0",
|
| 157 |
+
"resolved": "https://registry.npmjs.org/nkeys.js/-/nkeys.js-1.1.0.tgz",
|
| 158 |
+
"integrity": "sha512-tB/a0shZL5UZWSwsoeyqfTszONTt4k2YS0tuQioMOD180+MbombYVgzDUYHlx+gejYK6rgf08n/2Df99WY0Sxg==",
|
| 159 |
+
"license": "Apache-2.0",
|
| 160 |
+
"dependencies": {
|
| 161 |
+
"tweetnacl": "1.0.3"
|
| 162 |
+
},
|
| 163 |
+
"engines": {
|
| 164 |
+
"node": ">=10.0.0"
|
| 165 |
+
}
|
| 166 |
+
},
|
| 167 |
+
"node_modules/progress": {
|
| 168 |
+
"version": "2.0.3",
|
| 169 |
+
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
|
| 170 |
+
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
|
| 171 |
+
"dev": true,
|
| 172 |
+
"license": "MIT",
|
| 173 |
+
"engines": {
|
| 174 |
+
"node": ">=0.4.0"
|
| 175 |
+
}
|
| 176 |
+
},
|
| 177 |
+
"node_modules/semver": {
|
| 178 |
+
"version": "7.8.5",
|
| 179 |
+
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
|
| 180 |
+
"integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
|
| 181 |
+
"dev": true,
|
| 182 |
+
"license": "ISC",
|
| 183 |
+
"bin": {
|
| 184 |
+
"semver": "bin/semver.js"
|
| 185 |
+
},
|
| 186 |
+
"engines": {
|
| 187 |
+
"node": ">=10"
|
| 188 |
+
}
|
| 189 |
+
},
|
| 190 |
+
"node_modules/sumchecker": {
|
| 191 |
+
"version": "3.0.1",
|
| 192 |
+
"resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
|
| 193 |
+
"integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==",
|
| 194 |
+
"dev": true,
|
| 195 |
+
"license": "Apache-2.0",
|
| 196 |
+
"dependencies": {
|
| 197 |
+
"debug": "^4.1.0"
|
| 198 |
+
},
|
| 199 |
+
"engines": {
|
| 200 |
+
"node": ">= 8.0"
|
| 201 |
+
}
|
| 202 |
+
},
|
| 203 |
+
"node_modules/tweetnacl": {
|
| 204 |
+
"version": "1.0.3",
|
| 205 |
+
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
|
| 206 |
+
"integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==",
|
| 207 |
+
"license": "Unlicense"
|
| 208 |
+
},
|
| 209 |
+
"node_modules/typescript": {
|
| 210 |
+
"version": "5.9.3",
|
| 211 |
+
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
|
| 212 |
+
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
| 213 |
+
"dev": true,
|
| 214 |
+
"license": "Apache-2.0",
|
| 215 |
+
"bin": {
|
| 216 |
+
"tsc": "bin/tsc",
|
| 217 |
+
"tsserver": "bin/tsserver"
|
| 218 |
+
},
|
| 219 |
+
"engines": {
|
| 220 |
+
"node": ">=14.17"
|
| 221 |
+
}
|
| 222 |
+
},
|
| 223 |
+
"node_modules/undici": {
|
| 224 |
+
"version": "7.28.0",
|
| 225 |
+
"resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz",
|
| 226 |
+
"integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==",
|
| 227 |
+
"dev": true,
|
| 228 |
+
"license": "MIT",
|
| 229 |
+
"optional": true,
|
| 230 |
+
"engines": {
|
| 231 |
+
"node": ">=20.18.1"
|
| 232 |
+
}
|
| 233 |
+
},
|
| 234 |
+
"node_modules/undici-types": {
|
| 235 |
+
"version": "6.21.0",
|
| 236 |
+
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
|
| 237 |
+
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
|
| 238 |
+
"dev": true,
|
| 239 |
+
"license": "MIT"
|
| 240 |
+
},
|
| 241 |
+
"node_modules/uuid": {
|
| 242 |
+
"version": "11.1.1",
|
| 243 |
+
"resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz",
|
| 244 |
+
"integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==",
|
| 245 |
+
"funding": [
|
| 246 |
+
"https://github.com/sponsors/broofa",
|
| 247 |
+
"https://github.com/sponsors/ctavan"
|
| 248 |
+
],
|
| 249 |
+
"license": "MIT",
|
| 250 |
+
"bin": {
|
| 251 |
+
"uuid": "dist/esm/bin/uuid"
|
| 252 |
+
}
|
| 253 |
+
}
|
| 254 |
+
}
|
| 255 |
+
}
|
package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"name": "@snapkitty/kittybrowse",
|
| 3 |
+
"version": "0.1.0",
|
| 4 |
+
"private": true,
|
| 5 |
+
"description": "Proprietary agent browser shell with Electron, NATS mesh, IDE/VM bridge stubs, and entropy scheduling.",
|
| 6 |
+
"type": "module",
|
| 7 |
+
"main": "dist/src/main/main.js",
|
| 8 |
+
"scripts": {
|
| 9 |
+
"build": "tsc -p tsconfig.json && node scripts/copy-renderer.mjs",
|
| 10 |
+
"dev": "npm run build && electron .",
|
| 11 |
+
"start": "npm run build && electron .",
|
| 12 |
+
"runtime": "npm run build && node dist/src/runtime/agent-runtime.js",
|
| 13 |
+
"handshake": "node scripts/write-handshake.mjs && node scripts/validate-handshake.mjs",
|
| 14 |
+
"rust:test": "cargo test --manifest-path crates/rust-vm-bridge/Cargo.toml",
|
| 15 |
+
"test": "npm run build && node --test dist/tests/*.test.js"
|
| 16 |
+
},
|
| 17 |
+
"dependencies": {
|
| 18 |
+
"nats": "^2.29.3",
|
| 19 |
+
"uuid": "^11.0.5"
|
| 20 |
+
},
|
| 21 |
+
"devDependencies": {
|
| 22 |
+
"@types/node": "^22.10.2",
|
| 23 |
+
"electron": "^42.4.1",
|
| 24 |
+
"typescript": "^5.7.2"
|
| 25 |
+
}
|
| 26 |
+
}
|
plugins/ide/vscode/kitty.plugin.json
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"id": "kitty.ide.vscode",
|
| 3 |
+
"type": "ide",
|
| 4 |
+
"target": "vscode",
|
| 5 |
+
"description": "LSP-only VSCode bridge surface for KittyBrowse agent contexts.",
|
| 6 |
+
"commands": ["open_lsp_context", "inspect_workspace"],
|
| 7 |
+
"transport": "lsp",
|
| 8 |
+
"permissions": {
|
| 9 |
+
"rawShell": false,
|
| 10 |
+
"workspaceWrite": false
|
| 11 |
+
}
|
| 12 |
+
}
|
| 13 |
+
|
plugins/vm/apl-wasm/kitty.plugin.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"id": "kitty.vm.apl-wasm",
|
| 3 |
+
"type": "vm",
|
| 4 |
+
"target": "apl-wasm",
|
| 5 |
+
"description": "Primary KittyBrowse execution substrate: APL semantics compiled and sealed through the Rust/WASM bridge.",
|
| 6 |
+
"commands": ["execute_resonance_vm", "analyze_finance_vector", "render_agent_page"],
|
| 7 |
+
"transport": "wasm",
|
| 8 |
+
"upstreamReferences": [
|
| 9 |
+
"../DEVFLOW-FINANCE/bridges/rust/apl_bridge.rs",
|
| 10 |
+
"../DEVFLOW-FINANCE/bridges/apl/finance.apl",
|
| 11 |
+
"../DEVFLOW-FINANCE/snapkitty-wasm/src/lib.rs",
|
| 12 |
+
"../DEVFLOW-FINANCE/collectivekitty/public/wasm/snapkitty_wasm_bg.wasm"
|
| 13 |
+
],
|
| 14 |
+
"permissions": {
|
| 15 |
+
"rawShell": false,
|
| 16 |
+
"network": false,
|
| 17 |
+
"javascriptExecution": false
|
| 18 |
+
}
|
| 19 |
+
}
|
| 20 |
+
|
plugins/vm/rust/kitty.plugin.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"id": "kitty.vm.rust",
|
| 3 |
+
"type": "vm",
|
| 4 |
+
"target": "rust",
|
| 5 |
+
"description": "Rust VM bridge for local deterministic task execution.",
|
| 6 |
+
"commands": ["execute_resonance_vm", "render_agent_page"],
|
| 7 |
+
"transport": "stdio",
|
| 8 |
+
"binary": "crates/rust-vm-bridge/target/release/rust-vm-bridge",
|
| 9 |
+
"permissions": {
|
| 10 |
+
"rawShell": false,
|
| 11 |
+
"network": false
|
| 12 |
+
}
|
| 13 |
+
}
|
| 14 |
+
|
scripts/copy-renderer.mjs
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { cp, mkdir } from "node:fs/promises";
|
| 2 |
+
import { dirname, join } from "node:path";
|
| 3 |
+
import { fileURLToPath } from "node:url";
|
| 4 |
+
|
| 5 |
+
const root = dirname(fileURLToPath(import.meta.url));
|
| 6 |
+
const project = join(root, "..");
|
| 7 |
+
|
| 8 |
+
await mkdir(join(project, "dist", "renderer"), { recursive: true });
|
| 9 |
+
await cp(join(project, "src", "renderer"), join(project, "dist", "renderer"), {
|
| 10 |
+
recursive: true,
|
| 11 |
+
});
|
| 12 |
+
|
scripts/validate-handshake.mjs
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { createHash } from "node:crypto";
|
| 2 |
+
import { readFile } from "node:fs/promises";
|
| 3 |
+
import { dirname, resolve } from "node:path";
|
| 4 |
+
import { fileURLToPath } from "node:url";
|
| 5 |
+
|
| 6 |
+
const projectRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
| 7 |
+
const handshakePath = resolve(projectRoot, process.argv[2] ?? "lineage/kittybrowse-shadow-handshake.json");
|
| 8 |
+
|
| 9 |
+
async function sha256(path) {
|
| 10 |
+
const bytes = await readFile(path);
|
| 11 |
+
return createHash("sha256").update(bytes).digest("hex");
|
| 12 |
+
}
|
| 13 |
+
|
| 14 |
+
function assert(condition, message) {
|
| 15 |
+
if (!condition) {
|
| 16 |
+
throw new Error(message);
|
| 17 |
+
}
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
+
const handshake = JSON.parse(await readFile(handshakePath, "utf8"));
|
| 21 |
+
|
| 22 |
+
assert(handshake.protocol === "shadow-grisp/json-handshake-v1", "invalid protocol");
|
| 23 |
+
assert(handshake.from?.stone === 4, "from.stone must be 4");
|
| 24 |
+
assert(handshake.to?.repo === "shadow-orchestrator", "to.repo must be shadow-orchestrator");
|
| 25 |
+
assert(handshake.verification?.apl_wasm_primary === true, "apl_wasm_primary must be true");
|
| 26 |
+
assert(handshake.integration?.primary_vm_target === "apl-wasm", "primary VM target must be apl-wasm");
|
| 27 |
+
assert(handshake.coreRule?.bob?.includes("executes"), "coreRule.bob must execute");
|
| 28 |
+
assert(handshake.nonRecursiveLaw?.forbidden?.includes("Shadow -> Self Modify"), "nonRecursiveLaw missing self-modify ban");
|
| 29 |
+
|
| 30 |
+
for (const [key, rel] of Object.entries(handshake.provenance?.sourceFiles ?? {})) {
|
| 31 |
+
const expected = handshake.provenance?.sourceHashes?.[key];
|
| 32 |
+
assert(expected, `missing hash for ${key}`);
|
| 33 |
+
const actual = await sha256(resolve(projectRoot, rel));
|
| 34 |
+
assert(actual === expected, `hash mismatch for ${key}: ${actual} !== ${expected}`);
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
console.log(JSON.stringify({
|
| 38 |
+
ok: true,
|
| 39 |
+
handshake: handshakePath,
|
| 40 |
+
mode: handshake.mode,
|
| 41 |
+
checkedHashes: Object.keys(handshake.provenance.sourceHashes).length,
|
| 42 |
+
}, null, 2));
|
| 43 |
+
|
scripts/write-handshake.mjs
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { createHash } from "node:crypto";
|
| 2 |
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
| 3 |
+
import { dirname, join, resolve } from "node:path";
|
| 4 |
+
import { fileURLToPath } from "node:url";
|
| 5 |
+
|
| 6 |
+
const projectRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
| 7 |
+
const controlRoot = resolve(projectRoot, "..");
|
| 8 |
+
const shadowRoot = join(controlRoot, "shadow-orchestrator");
|
| 9 |
+
const localHandshakePath = join(projectRoot, "lineage", "kittybrowse-shadow-handshake.json");
|
| 10 |
+
const shadowHandshakePath = join(shadowRoot, "lineage", "stone-4-kittybrowse-handshake.json");
|
| 11 |
+
const shadowStone3Path = join(shadowRoot, "lineage", "stone-3-handshake.json");
|
| 12 |
+
|
| 13 |
+
async function sha256(path) {
|
| 14 |
+
const bytes = await readFile(path);
|
| 15 |
+
return createHash("sha256").update(bytes).digest("hex");
|
| 16 |
+
}
|
| 17 |
+
|
| 18 |
+
async function readJson(path) {
|
| 19 |
+
return JSON.parse(await readFile(path, "utf8"));
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
const shadowStone3 = await readJson(shadowStone3Path);
|
| 23 |
+
|
| 24 |
+
const sourceFiles = {
|
| 25 |
+
kitty_protocol: "docs/kitty-protocol-v1.md",
|
| 26 |
+
apl_wasm_boundary: "docs/apl-wasm-runtime.md",
|
| 27 |
+
apl_wasm_plugin: "plugins/vm/apl-wasm/kitty.plugin.json",
|
| 28 |
+
runtime_protocol: "src/shared/protocol.ts",
|
| 29 |
+
runtime_mesh: "src/runtime/mesh.ts",
|
| 30 |
+
runtime_agent: "src/runtime/agent-runtime.ts",
|
| 31 |
+
rust_nats_doc: "docs/nats-rust-bridge.md",
|
| 32 |
+
rust_bridge_manifest: "crates/rust-vm-bridge/Cargo.toml",
|
| 33 |
+
rust_bridge_lib: "crates/rust-vm-bridge/src/lib.rs",
|
| 34 |
+
shadow_stone_3: "../shadow-orchestrator/lineage/stone-3-handshake.json",
|
| 35 |
+
};
|
| 36 |
+
|
| 37 |
+
const sourceHashes = {};
|
| 38 |
+
for (const [key, rel] of Object.entries(sourceFiles)) {
|
| 39 |
+
sourceHashes[key] = await sha256(resolve(projectRoot, rel));
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
const handshake = {
|
| 43 |
+
protocol: "shadow-grisp/json-handshake-v1",
|
| 44 |
+
from: {
|
| 45 |
+
stone: 4,
|
| 46 |
+
model: "GPT-5 Codex",
|
| 47 |
+
repo: "kittybrowse",
|
| 48 |
+
},
|
| 49 |
+
to: {
|
| 50 |
+
stone: shadowStone3.from?.stone ?? 3,
|
| 51 |
+
model: shadowStone3.from?.model ?? "GPT-5 Codex",
|
| 52 |
+
repo: "shadow-orchestrator",
|
| 53 |
+
handshake: "../shadow-orchestrator/lineage/stone-3-handshake.json",
|
| 54 |
+
},
|
| 55 |
+
mode: "kittybrowse-apl-wasm-control-plane-meet-in-middle",
|
| 56 |
+
timestamp_utc: new Date().toISOString(),
|
| 57 |
+
verification: {
|
| 58 |
+
shadow_protocol: shadowStone3.protocol,
|
| 59 |
+
shadow_mode: shadowStone3.mode,
|
| 60 |
+
shadow_chain_valid: shadowStone3.verification?.chain_valid === true,
|
| 61 |
+
shadow_tests: shadowStone3.verification?.tests ?? "unknown",
|
| 62 |
+
kittybrowse_tests: "npm test passed",
|
| 63 |
+
kittybrowse_audit: "npm audit --audit-level=high passed",
|
| 64 |
+
kittybrowse_runtime: "npm run runtime boots with vmTarget=apl-wasm",
|
| 65 |
+
apl_wasm_primary: true,
|
| 66 |
+
javascript_role: "UI/IPC/NATS envelope glue only",
|
| 67 |
+
},
|
| 68 |
+
integration: {
|
| 69 |
+
chromium_shell: "Electron BrowserWindow with preload IPC bridge",
|
| 70 |
+
agent_runtime: "src/runtime/agent-runtime.ts",
|
| 71 |
+
event_backbone: "NATS when NATS_URL is available; local mesh fallback otherwise",
|
| 72 |
+
rust_nats_worker: "crates/rust-vm-bridge subscribes to kitty.task.run and publishes kitty.task.result with async-nats",
|
| 73 |
+
scheduler: "src/shared/entropy.ts",
|
| 74 |
+
primary_vm_target: "apl-wasm",
|
| 75 |
+
existing_apl_wasm_sources: [
|
| 76 |
+
"../DEVFLOW-FINANCE/bridges/apl/finance.apl",
|
| 77 |
+
"../DEVFLOW-FINANCE/bridges/rust/apl_bridge.rs",
|
| 78 |
+
"../DEVFLOW-FINANCE/snapkitty-wasm/src/lib.rs",
|
| 79 |
+
"../DEVFLOW-FINANCE/collectivekitty/public/wasm/snapkitty_wasm_bg.wasm"
|
| 80 |
+
],
|
| 81 |
+
mirror_files: [
|
| 82 |
+
"lineage/kittybrowse-shadow-handshake.json",
|
| 83 |
+
"../shadow-orchestrator/lineage/stone-4-kittybrowse-handshake.json"
|
| 84 |
+
]
|
| 85 |
+
},
|
| 86 |
+
coreRule: shadowStone3.coreRule,
|
| 87 |
+
nonRecursiveLaw: shadowStone3.nonRecursiveLaw,
|
| 88 |
+
handoff: {
|
| 89 |
+
to_claude: "Consume stone-4-kittybrowse-handshake.json as the JSON bridge from Shadow Orchestrator to KittyBrowse. Treat KittyBrowse as a Chromium control plane whose execution authority is APL/Rust/WASM, not JavaScript.",
|
| 90 |
+
to_next_stone: "Replace simulated apl-wasm adapter output with a real call into the DEVFLOW-FINANCE APL/WASM package or a signed NATS subject handled by that bridge.",
|
| 91 |
+
message: "KittyBrowse now speaks the Shadow lineage handshake format and anchors its agent runtime to the APL/WASM substrate."
|
| 92 |
+
},
|
| 93 |
+
state: {
|
| 94 |
+
class: "INTEGRATED",
|
| 95 |
+
tick: 4,
|
| 96 |
+
contractsValid: true,
|
| 97 |
+
proofsValid: true,
|
| 98 |
+
shadowLinked: true,
|
| 99 |
+
aplWasmLinked: true,
|
| 100 |
+
wormAppendPending: true
|
| 101 |
+
},
|
| 102 |
+
provenance: {
|
| 103 |
+
sourceFiles,
|
| 104 |
+
sourceHashes,
|
| 105 |
+
}
|
| 106 |
+
};
|
| 107 |
+
|
| 108 |
+
const payload = `${JSON.stringify(handshake, null, 2)}\n`;
|
| 109 |
+
await mkdir(dirname(localHandshakePath), { recursive: true });
|
| 110 |
+
await mkdir(dirname(shadowHandshakePath), { recursive: true });
|
| 111 |
+
await writeFile(localHandshakePath, payload);
|
| 112 |
+
await writeFile(shadowHandshakePath, payload);
|
| 113 |
+
|
| 114 |
+
console.log(JSON.stringify({
|
| 115 |
+
wrote: [localHandshakePath, shadowHandshakePath],
|
| 116 |
+
protocol: handshake.protocol,
|
| 117 |
+
mode: handshake.mode,
|
| 118 |
+
sourceHashes,
|
| 119 |
+
}, null, 2));
|
src/main/main.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { app, BrowserWindow, ipcMain } from "electron";
|
| 2 |
+
import { dirname, join } from "node:path";
|
| 3 |
+
import { fileURLToPath } from "node:url";
|
| 4 |
+
import { KittyRuntime } from "../runtime/agent-runtime.js";
|
| 5 |
+
|
| 6 |
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
| 7 |
+
let mainWindow: BrowserWindow | undefined;
|
| 8 |
+
let runtime: KittyRuntime | undefined;
|
| 9 |
+
|
| 10 |
+
async function createWindow(): Promise<void> {
|
| 11 |
+
runtime = await KittyRuntime.create();
|
| 12 |
+
runtime.createContext({
|
| 13 |
+
label: "Primary Agent",
|
| 14 |
+
url: "kitty://home",
|
| 15 |
+
vmTarget: "apl-wasm",
|
| 16 |
+
ideTarget: "vscode",
|
| 17 |
+
});
|
| 18 |
+
|
| 19 |
+
mainWindow = new BrowserWindow({
|
| 20 |
+
width: 1400,
|
| 21 |
+
height: 900,
|
| 22 |
+
minWidth: 960,
|
| 23 |
+
minHeight: 640,
|
| 24 |
+
title: "KittyBrowse",
|
| 25 |
+
webPreferences: {
|
| 26 |
+
preload: join(__dirname, "preload.js"),
|
| 27 |
+
contextIsolation: true,
|
| 28 |
+
nodeIntegration: false,
|
| 29 |
+
sandbox: true,
|
| 30 |
+
},
|
| 31 |
+
});
|
| 32 |
+
|
| 33 |
+
await mainWindow.loadFile(join(__dirname, "..", "..", "renderer", "index.html"));
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
ipcMain.handle("kitty:snapshot", () => runtime?.snapshot());
|
| 37 |
+
|
| 38 |
+
ipcMain.handle("kitty:create-context", (_event, input) => {
|
| 39 |
+
return runtime?.createContext(input);
|
| 40 |
+
});
|
| 41 |
+
|
| 42 |
+
ipcMain.handle("kitty:submit-task", async (_event, input) => {
|
| 43 |
+
if (!runtime) {
|
| 44 |
+
throw new Error("Kitty runtime is not ready");
|
| 45 |
+
}
|
| 46 |
+
return runtime.submitTask(input);
|
| 47 |
+
});
|
| 48 |
+
|
| 49 |
+
app.whenReady().then(createWindow);
|
| 50 |
+
|
| 51 |
+
app.on("window-all-closed", async () => {
|
| 52 |
+
if (runtime) {
|
| 53 |
+
await runtime.stop();
|
| 54 |
+
}
|
| 55 |
+
if (process.platform !== "darwin") {
|
| 56 |
+
app.quit();
|
| 57 |
+
}
|
| 58 |
+
});
|
| 59 |
+
|
| 60 |
+
app.on("activate", () => {
|
| 61 |
+
if (BrowserWindow.getAllWindows().length === 0) {
|
| 62 |
+
void createWindow();
|
| 63 |
+
}
|
| 64 |
+
});
|
src/main/preload.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { contextBridge, ipcRenderer } from "electron";
|
| 2 |
+
|
| 3 |
+
contextBridge.exposeInMainWorld("kitty", {
|
| 4 |
+
snapshot: () => ipcRenderer.invoke("kitty:snapshot"),
|
| 5 |
+
createContext: (input: unknown) => ipcRenderer.invoke("kitty:create-context", input),
|
| 6 |
+
submitTask: (input: unknown) => ipcRenderer.invoke("kitty:submit-task", input),
|
| 7 |
+
});
|
| 8 |
+
|
src/renderer/index.html
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 6 |
+
<title>KittyBrowse</title>
|
| 7 |
+
<link rel="stylesheet" href="./styles.css" />
|
| 8 |
+
</head>
|
| 9 |
+
<body>
|
| 10 |
+
<main class="shell">
|
| 11 |
+
<aside class="sidebar">
|
| 12 |
+
<div class="brand">
|
| 13 |
+
<span class="mark">KB</span>
|
| 14 |
+
<div>
|
| 15 |
+
<h1>KittyBrowse</h1>
|
| 16 |
+
<p>Agent browser control plane</p>
|
| 17 |
+
</div>
|
| 18 |
+
</div>
|
| 19 |
+
<section>
|
| 20 |
+
<h2>Mesh</h2>
|
| 21 |
+
<div class="metric">
|
| 22 |
+
<span>Status</span>
|
| 23 |
+
<strong id="mesh-kind">loading</strong>
|
| 24 |
+
</div>
|
| 25 |
+
<div class="metric">
|
| 26 |
+
<span>Contexts</span>
|
| 27 |
+
<strong id="context-count">0</strong>
|
| 28 |
+
</div>
|
| 29 |
+
<div class="metric">
|
| 30 |
+
<span>Tasks</span>
|
| 31 |
+
<strong id="task-count">0</strong>
|
| 32 |
+
</div>
|
| 33 |
+
</section>
|
| 34 |
+
<button id="new-context">New Agent Context</button>
|
| 35 |
+
</aside>
|
| 36 |
+
|
| 37 |
+
<section class="workspace">
|
| 38 |
+
<header class="toolbar">
|
| 39 |
+
<div>
|
| 40 |
+
<h2>Tab = Agent Context</h2>
|
| 41 |
+
<p>Page = execution surface. URL = task pointer.</p>
|
| 42 |
+
</div>
|
| 43 |
+
<button id="run-task">Dispatch Task</button>
|
| 44 |
+
</header>
|
| 45 |
+
|
| 46 |
+
<section class="grid">
|
| 47 |
+
<article class="panel">
|
| 48 |
+
<h3>Agent Contexts</h3>
|
| 49 |
+
<div id="contexts" class="list"></div>
|
| 50 |
+
</article>
|
| 51 |
+
|
| 52 |
+
<article class="panel">
|
| 53 |
+
<h3>Task Composer</h3>
|
| 54 |
+
<label>
|
| 55 |
+
Command
|
| 56 |
+
<select id="command">
|
| 57 |
+
<option value="execute_resonance_vm">execute_resonance_vm</option>
|
| 58 |
+
<option value="analyze_finance_vector">analyze_finance_vector</option>
|
| 59 |
+
<option value="inspect_workspace">inspect_workspace</option>
|
| 60 |
+
<option value="open_lsp_context">open_lsp_context</option>
|
| 61 |
+
<option value="render_agent_page">render_agent_page</option>
|
| 62 |
+
<option value="raw_shell">raw_shell</option>
|
| 63 |
+
</select>
|
| 64 |
+
</label>
|
| 65 |
+
<label>
|
| 66 |
+
VM Target
|
| 67 |
+
<select id="vm-target">
|
| 68 |
+
<option value="apl-wasm">apl-wasm</option>
|
| 69 |
+
<option value="python">python</option>
|
| 70 |
+
<option value="rust">rust</option>
|
| 71 |
+
<option value="wasm">wasm</option>
|
| 72 |
+
<option value="docker">docker</option>
|
| 73 |
+
</select>
|
| 74 |
+
</label>
|
| 75 |
+
<label>
|
| 76 |
+
IDE Target
|
| 77 |
+
<select id="ide-target">
|
| 78 |
+
<option value="vscode">vscode</option>
|
| 79 |
+
<option value="none">none</option>
|
| 80 |
+
<option value="neovim">neovim</option>
|
| 81 |
+
<option value="jetbrains">jetbrains</option>
|
| 82 |
+
</select>
|
| 83 |
+
</label>
|
| 84 |
+
<label>
|
| 85 |
+
Fail Rate
|
| 86 |
+
<input id="fail-rate" type="number" min="0" max="1" step="0.01" value="0.05" />
|
| 87 |
+
</label>
|
| 88 |
+
<label>
|
| 89 |
+
Latency MS
|
| 90 |
+
<input id="latency" type="number" min="0" step="100" value="250" />
|
| 91 |
+
</label>
|
| 92 |
+
</article>
|
| 93 |
+
|
| 94 |
+
<article class="panel wide">
|
| 95 |
+
<h3>Output Stream</h3>
|
| 96 |
+
<div id="results" class="stream"></div>
|
| 97 |
+
</article>
|
| 98 |
+
</section>
|
| 99 |
+
</section>
|
| 100 |
+
</main>
|
| 101 |
+
<script src="./renderer.js"></script>
|
| 102 |
+
</body>
|
| 103 |
+
</html>
|
src/renderer/renderer.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const api = window.kitty;
|
| 2 |
+
|
| 3 |
+
const meshKind = document.querySelector("#mesh-kind");
|
| 4 |
+
const contextCount = document.querySelector("#context-count");
|
| 5 |
+
const taskCount = document.querySelector("#task-count");
|
| 6 |
+
const contexts = document.querySelector("#contexts");
|
| 7 |
+
const results = document.querySelector("#results");
|
| 8 |
+
|
| 9 |
+
let currentContextId = null;
|
| 10 |
+
|
| 11 |
+
function renderSnapshot(snapshot) {
|
| 12 |
+
meshKind.textContent = snapshot.mesh;
|
| 13 |
+
contextCount.textContent = String(snapshot.contexts.length);
|
| 14 |
+
taskCount.textContent = String(snapshot.results.length);
|
| 15 |
+
|
| 16 |
+
currentContextId = currentContextId ?? snapshot.contexts[0]?.id ?? null;
|
| 17 |
+
|
| 18 |
+
contexts.replaceChildren(
|
| 19 |
+
...snapshot.contexts.map((context) => {
|
| 20 |
+
const node = document.createElement("div");
|
| 21 |
+
node.className = "item";
|
| 22 |
+
node.innerHTML = `
|
| 23 |
+
<strong>${context.label}</strong>
|
| 24 |
+
<div class="subtle">${context.id}</div>
|
| 25 |
+
<div>URL: ${context.url}</div>
|
| 26 |
+
<div>VM: ${context.vmTarget} / IDE: ${context.ideTarget}</div>
|
| 27 |
+
<div>Entropy: ${context.entropy}</div>
|
| 28 |
+
`;
|
| 29 |
+
node.addEventListener("click", () => {
|
| 30 |
+
currentContextId = context.id;
|
| 31 |
+
});
|
| 32 |
+
return node;
|
| 33 |
+
}),
|
| 34 |
+
);
|
| 35 |
+
|
| 36 |
+
results.replaceChildren(
|
| 37 |
+
...snapshot.results.map((result) => {
|
| 38 |
+
const node = document.createElement("div");
|
| 39 |
+
node.className = "item";
|
| 40 |
+
node.innerHTML = `
|
| 41 |
+
<strong class="status-${result.status}">${result.status}: ${result.id}</strong>
|
| 42 |
+
<div>${result.message}</div>
|
| 43 |
+
<div class="subtle">Entropy ${result.entropy}</div>
|
| 44 |
+
`;
|
| 45 |
+
return node;
|
| 46 |
+
}),
|
| 47 |
+
);
|
| 48 |
+
}
|
| 49 |
+
|
| 50 |
+
async function refresh() {
|
| 51 |
+
const snapshot = await api.snapshot();
|
| 52 |
+
renderSnapshot(snapshot);
|
| 53 |
+
}
|
| 54 |
+
|
| 55 |
+
document.querySelector("#new-context").addEventListener("click", async () => {
|
| 56 |
+
const context = await api.createContext({
|
| 57 |
+
label: `Agent Context ${Date.now().toString().slice(-4)}`,
|
| 58 |
+
url: "kitty://task",
|
| 59 |
+
vmTarget: document.querySelector("#vm-target").value,
|
| 60 |
+
ideTarget: document.querySelector("#ide-target").value,
|
| 61 |
+
});
|
| 62 |
+
currentContextId = context.id;
|
| 63 |
+
await refresh();
|
| 64 |
+
});
|
| 65 |
+
|
| 66 |
+
document.querySelector("#run-task").addEventListener("click", async () => {
|
| 67 |
+
await api.submitTask({
|
| 68 |
+
contextId: currentContextId,
|
| 69 |
+
command: document.querySelector("#command").value,
|
| 70 |
+
payload: { source: "renderer", pointer: "kitty://task" },
|
| 71 |
+
dependencies: [],
|
| 72 |
+
failRate: Number(document.querySelector("#fail-rate").value),
|
| 73 |
+
latencyMs: Number(document.querySelector("#latency").value),
|
| 74 |
+
vmTarget: document.querySelector("#vm-target").value,
|
| 75 |
+
ideTarget: document.querySelector("#ide-target").value,
|
| 76 |
+
});
|
| 77 |
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
| 78 |
+
await refresh();
|
| 79 |
+
});
|
| 80 |
+
|
| 81 |
+
refresh();
|
| 82 |
+
setInterval(refresh, 1500);
|
| 83 |
+
|
src/renderer/styles.css
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
:root {
|
| 2 |
+
color-scheme: dark;
|
| 3 |
+
font-family: Inter, Segoe UI, system-ui, sans-serif;
|
| 4 |
+
background: #0a0f14;
|
| 5 |
+
color: #e6edf3;
|
| 6 |
+
}
|
| 7 |
+
|
| 8 |
+
* {
|
| 9 |
+
box-sizing: border-box;
|
| 10 |
+
}
|
| 11 |
+
|
| 12 |
+
body {
|
| 13 |
+
margin: 0;
|
| 14 |
+
min-height: 100vh;
|
| 15 |
+
}
|
| 16 |
+
|
| 17 |
+
button,
|
| 18 |
+
select,
|
| 19 |
+
input {
|
| 20 |
+
font: inherit;
|
| 21 |
+
}
|
| 22 |
+
|
| 23 |
+
button {
|
| 24 |
+
border: 0;
|
| 25 |
+
border-radius: 6px;
|
| 26 |
+
padding: 10px 14px;
|
| 27 |
+
color: #061013;
|
| 28 |
+
background: #35d07f;
|
| 29 |
+
font-weight: 700;
|
| 30 |
+
cursor: pointer;
|
| 31 |
+
}
|
| 32 |
+
|
| 33 |
+
.shell {
|
| 34 |
+
display: grid;
|
| 35 |
+
grid-template-columns: 280px 1fr;
|
| 36 |
+
min-height: 100vh;
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
.sidebar {
|
| 40 |
+
border-right: 1px solid #1f2c38;
|
| 41 |
+
padding: 20px;
|
| 42 |
+
background: #0d141b;
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
.brand {
|
| 46 |
+
display: flex;
|
| 47 |
+
align-items: center;
|
| 48 |
+
gap: 12px;
|
| 49 |
+
margin-bottom: 28px;
|
| 50 |
+
}
|
| 51 |
+
|
| 52 |
+
.mark {
|
| 53 |
+
display: grid;
|
| 54 |
+
place-items: center;
|
| 55 |
+
width: 44px;
|
| 56 |
+
height: 44px;
|
| 57 |
+
border-radius: 8px;
|
| 58 |
+
background: #35d07f;
|
| 59 |
+
color: #061013;
|
| 60 |
+
font-weight: 900;
|
| 61 |
+
}
|
| 62 |
+
|
| 63 |
+
h1,
|
| 64 |
+
h2,
|
| 65 |
+
h3,
|
| 66 |
+
p {
|
| 67 |
+
margin: 0;
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
h1 {
|
| 71 |
+
font-size: 20px;
|
| 72 |
+
}
|
| 73 |
+
|
| 74 |
+
h2 {
|
| 75 |
+
font-size: 18px;
|
| 76 |
+
}
|
| 77 |
+
|
| 78 |
+
h3 {
|
| 79 |
+
font-size: 15px;
|
| 80 |
+
margin-bottom: 14px;
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
p,
|
| 84 |
+
label,
|
| 85 |
+
.metric span,
|
| 86 |
+
.subtle {
|
| 87 |
+
color: #8ea0ad;
|
| 88 |
+
}
|
| 89 |
+
|
| 90 |
+
.metric {
|
| 91 |
+
display: flex;
|
| 92 |
+
justify-content: space-between;
|
| 93 |
+
padding: 10px 0;
|
| 94 |
+
border-bottom: 1px solid #1f2c38;
|
| 95 |
+
}
|
| 96 |
+
|
| 97 |
+
.sidebar button {
|
| 98 |
+
margin-top: 24px;
|
| 99 |
+
width: 100%;
|
| 100 |
+
}
|
| 101 |
+
|
| 102 |
+
.workspace {
|
| 103 |
+
padding: 24px;
|
| 104 |
+
}
|
| 105 |
+
|
| 106 |
+
.toolbar {
|
| 107 |
+
display: flex;
|
| 108 |
+
justify-content: space-between;
|
| 109 |
+
align-items: center;
|
| 110 |
+
gap: 20px;
|
| 111 |
+
margin-bottom: 22px;
|
| 112 |
+
}
|
| 113 |
+
|
| 114 |
+
.grid {
|
| 115 |
+
display: grid;
|
| 116 |
+
grid-template-columns: 1fr 360px;
|
| 117 |
+
gap: 16px;
|
| 118 |
+
}
|
| 119 |
+
|
| 120 |
+
.panel {
|
| 121 |
+
border: 1px solid #1f2c38;
|
| 122 |
+
border-radius: 8px;
|
| 123 |
+
padding: 16px;
|
| 124 |
+
background: #101922;
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
+
.wide {
|
| 128 |
+
grid-column: 1 / -1;
|
| 129 |
+
}
|
| 130 |
+
|
| 131 |
+
.list,
|
| 132 |
+
.stream {
|
| 133 |
+
display: grid;
|
| 134 |
+
gap: 10px;
|
| 135 |
+
}
|
| 136 |
+
|
| 137 |
+
.item {
|
| 138 |
+
border: 1px solid #263645;
|
| 139 |
+
border-radius: 6px;
|
| 140 |
+
padding: 12px;
|
| 141 |
+
background: #0d141b;
|
| 142 |
+
}
|
| 143 |
+
|
| 144 |
+
.item strong {
|
| 145 |
+
display: block;
|
| 146 |
+
margin-bottom: 6px;
|
| 147 |
+
}
|
| 148 |
+
|
| 149 |
+
label {
|
| 150 |
+
display: grid;
|
| 151 |
+
gap: 6px;
|
| 152 |
+
margin-bottom: 12px;
|
| 153 |
+
}
|
| 154 |
+
|
| 155 |
+
select,
|
| 156 |
+
input {
|
| 157 |
+
width: 100%;
|
| 158 |
+
border: 1px solid #263645;
|
| 159 |
+
border-radius: 6px;
|
| 160 |
+
padding: 9px 10px;
|
| 161 |
+
color: #e6edf3;
|
| 162 |
+
background: #0a0f14;
|
| 163 |
+
}
|
| 164 |
+
|
| 165 |
+
.status-blocked {
|
| 166 |
+
color: #ffca66;
|
| 167 |
+
}
|
| 168 |
+
|
| 169 |
+
.status-failed {
|
| 170 |
+
color: #ff6b6b;
|
| 171 |
+
}
|
| 172 |
+
|
| 173 |
+
.status-succeeded {
|
| 174 |
+
color: #35d07f;
|
| 175 |
+
}
|
| 176 |
+
|
| 177 |
+
@media (max-width: 900px) {
|
| 178 |
+
.shell,
|
| 179 |
+
.grid {
|
| 180 |
+
grid-template-columns: 1fr;
|
| 181 |
+
}
|
| 182 |
+
|
| 183 |
+
.sidebar {
|
| 184 |
+
border-right: 0;
|
| 185 |
+
border-bottom: 1px solid #1f2c38;
|
| 186 |
+
}
|
| 187 |
+
}
|
| 188 |
+
|
src/runtime/adapters.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import type { TaskRequest, TaskResult } from "../shared/protocol.js";
|
| 2 |
+
import { commandAllowed } from "./plugins.js";
|
| 3 |
+
|
| 4 |
+
export async function runBridgeTask(task: TaskRequest, entropy: number): Promise<TaskResult> {
|
| 5 |
+
if (!commandAllowed(task.command, task.vmTarget, task.ideTarget)) {
|
| 6 |
+
return {
|
| 7 |
+
id: task.id,
|
| 8 |
+
contextId: task.contextId,
|
| 9 |
+
status: "failed",
|
| 10 |
+
entropy,
|
| 11 |
+
message: `Command is not allowlisted for ${task.vmTarget}/${task.ideTarget}: ${task.command}`,
|
| 12 |
+
output: {
|
| 13 |
+
vmTarget: task.vmTarget,
|
| 14 |
+
ideTarget: task.ideTarget,
|
| 15 |
+
},
|
| 16 |
+
completedAt: new Date().toISOString(),
|
| 17 |
+
};
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
+
return {
|
| 21 |
+
id: task.id,
|
| 22 |
+
contextId: task.contextId,
|
| 23 |
+
status: "succeeded",
|
| 24 |
+
entropy,
|
| 25 |
+
message: `${task.command} accepted by ${task.vmTarget}/${task.ideTarget} bridge`,
|
| 26 |
+
output: {
|
| 27 |
+
vmTarget: task.vmTarget,
|
| 28 |
+
ideTarget: task.ideTarget,
|
| 29 |
+
runtimeAuthority: task.vmTarget === "apl-wasm" ? "APL/Rust/WASM substrate" : "plugin adapter",
|
| 30 |
+
simulated: true,
|
| 31 |
+
payloadKeys: Object.keys(task.payload),
|
| 32 |
+
},
|
| 33 |
+
completedAt: new Date().toISOString(),
|
| 34 |
+
};
|
| 35 |
+
}
|
src/runtime/agent-runtime.ts
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { randomUUID } from "node:crypto";
|
| 2 |
+
import { resolve } from "node:path";
|
| 3 |
+
import { pathToFileURL } from "node:url";
|
| 4 |
+
import { entropyScore, isExecutable } from "../shared/entropy.js";
|
| 5 |
+
import {
|
| 6 |
+
TOPICS,
|
| 7 |
+
type KittyAgentContext,
|
| 8 |
+
type RuntimeSnapshot,
|
| 9 |
+
type TaskEnvelope,
|
| 10 |
+
type TaskRequest,
|
| 11 |
+
type TaskResult,
|
| 12 |
+
} from "../shared/protocol.js";
|
| 13 |
+
import { runBridgeTask } from "./adapters.js";
|
| 14 |
+
import { createMeshBus, type MeshBus } from "./mesh.js";
|
| 15 |
+
|
| 16 |
+
export class KittyRuntime {
|
| 17 |
+
private readonly contexts = new Map<string, KittyAgentContext>();
|
| 18 |
+
private readonly results = new Map<string, TaskResult>();
|
| 19 |
+
private unsubscribeTask?: () => Promise<void>;
|
| 20 |
+
|
| 21 |
+
constructor(private readonly mesh: MeshBus) {}
|
| 22 |
+
|
| 23 |
+
static async create(url?: string): Promise<KittyRuntime> {
|
| 24 |
+
const mesh = await createMeshBus(url);
|
| 25 |
+
const runtime = new KittyRuntime(mesh);
|
| 26 |
+
await runtime.start();
|
| 27 |
+
return runtime;
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
get meshKind(): "nats" | "local" {
|
| 31 |
+
return this.mesh.kind;
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
async start(): Promise<void> {
|
| 35 |
+
this.unsubscribeTask = await this.mesh.subscribe(TOPICS.TASK_RUN, async (raw) => {
|
| 36 |
+
const envelope = JSON.parse(raw) as TaskEnvelope;
|
| 37 |
+
const entropy = entropyScore(envelope.task);
|
| 38 |
+
const result = await runBridgeTask(envelope.task, entropy);
|
| 39 |
+
this.results.set(result.id, result);
|
| 40 |
+
await this.mesh.publish(TOPICS.TASK_RESULT, JSON.stringify(result));
|
| 41 |
+
});
|
| 42 |
+
}
|
| 43 |
+
|
| 44 |
+
createContext(input: Partial<KittyAgentContext> = {}): KittyAgentContext {
|
| 45 |
+
const id = input.id ?? `agent-${randomUUID()}`;
|
| 46 |
+
const context: KittyAgentContext = {
|
| 47 |
+
id,
|
| 48 |
+
label: input.label ?? "Agent Context",
|
| 49 |
+
url: input.url ?? "about:blank",
|
| 50 |
+
memory: input.memory ?? {},
|
| 51 |
+
vmTarget: input.vmTarget ?? "apl-wasm",
|
| 52 |
+
ideTarget: input.ideTarget ?? "none",
|
| 53 |
+
entropy: input.entropy ?? 0,
|
| 54 |
+
createdAt: input.createdAt ?? new Date().toISOString(),
|
| 55 |
+
};
|
| 56 |
+
|
| 57 |
+
this.contexts.set(id, context);
|
| 58 |
+
return context;
|
| 59 |
+
}
|
| 60 |
+
|
| 61 |
+
async submitTask(input: Omit<TaskRequest, "id" | "contextId"> & { id?: string; contextId?: string }): Promise<TaskResult> {
|
| 62 |
+
const contextId = input.contextId ?? this.createContext().id;
|
| 63 |
+
const task: TaskRequest = {
|
| 64 |
+
...input,
|
| 65 |
+
id: input.id ?? `task-${randomUUID()}`,
|
| 66 |
+
contextId,
|
| 67 |
+
};
|
| 68 |
+
|
| 69 |
+
const entropy = entropyScore(task);
|
| 70 |
+
const context = this.contexts.get(contextId);
|
| 71 |
+
if (context) {
|
| 72 |
+
context.entropy = entropy;
|
| 73 |
+
}
|
| 74 |
+
|
| 75 |
+
if (!isExecutable(task)) {
|
| 76 |
+
const blocked: TaskResult = {
|
| 77 |
+
id: task.id,
|
| 78 |
+
contextId,
|
| 79 |
+
status: "blocked",
|
| 80 |
+
entropy,
|
| 81 |
+
message: "Entropy threshold blocked execution",
|
| 82 |
+
output: {
|
| 83 |
+
threshold: 0.21,
|
| 84 |
+
dependencies: task.dependencies.length,
|
| 85 |
+
failRate: task.failRate,
|
| 86 |
+
latencyMs: task.latencyMs,
|
| 87 |
+
},
|
| 88 |
+
};
|
| 89 |
+
this.results.set(blocked.id, blocked);
|
| 90 |
+
return blocked;
|
| 91 |
+
}
|
| 92 |
+
|
| 93 |
+
const queued: TaskResult = {
|
| 94 |
+
id: task.id,
|
| 95 |
+
contextId,
|
| 96 |
+
status: "queued",
|
| 97 |
+
entropy,
|
| 98 |
+
message: `Published to ${TOPICS.TASK_RUN}`,
|
| 99 |
+
output: { mesh: this.mesh.kind },
|
| 100 |
+
};
|
| 101 |
+
this.results.set(queued.id, queued);
|
| 102 |
+
|
| 103 |
+
const envelope: TaskEnvelope = {
|
| 104 |
+
subject: TOPICS.TASK_RUN,
|
| 105 |
+
issuedAt: new Date().toISOString(),
|
| 106 |
+
task,
|
| 107 |
+
};
|
| 108 |
+
await this.mesh.publish(TOPICS.TASK_RUN, JSON.stringify(envelope));
|
| 109 |
+
return queued;
|
| 110 |
+
}
|
| 111 |
+
|
| 112 |
+
snapshot(): RuntimeSnapshot {
|
| 113 |
+
return {
|
| 114 |
+
mesh: this.mesh.kind,
|
| 115 |
+
contexts: [...this.contexts.values()],
|
| 116 |
+
results: [...this.results.values()].slice(-50).reverse(),
|
| 117 |
+
};
|
| 118 |
+
}
|
| 119 |
+
|
| 120 |
+
async stop(): Promise<void> {
|
| 121 |
+
if (this.unsubscribeTask) {
|
| 122 |
+
await this.unsubscribeTask();
|
| 123 |
+
}
|
| 124 |
+
await this.mesh.close();
|
| 125 |
+
}
|
| 126 |
+
}
|
| 127 |
+
|
| 128 |
+
if (process.argv[1] && import.meta.url === pathToFileURL(resolve(process.argv[1])).href) {
|
| 129 |
+
const runtime = await KittyRuntime.create();
|
| 130 |
+
runtime.createContext({ label: "CLI Agent", url: "kitty://runtime", vmTarget: "apl-wasm" });
|
| 131 |
+
console.log(JSON.stringify(runtime.snapshot(), null, 2));
|
| 132 |
+
}
|
src/runtime/mesh.ts
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { EventEmitter } from "node:events";
|
| 2 |
+
import { connect, type NatsConnection, StringCodec } from "nats";
|
| 3 |
+
|
| 4 |
+
export type MeshKind = "nats" | "local";
|
| 5 |
+
export type MeshHandler = (payload: string, subject: string) => void | Promise<void>;
|
| 6 |
+
|
| 7 |
+
export interface MeshBus {
|
| 8 |
+
readonly kind: MeshKind;
|
| 9 |
+
publish(subject: string, payload: string): Promise<void>;
|
| 10 |
+
subscribe(subject: string, handler: MeshHandler): Promise<() => Promise<void>>;
|
| 11 |
+
close(): Promise<void>;
|
| 12 |
+
}
|
| 13 |
+
|
| 14 |
+
function matchesSubject(pattern: string, subject: string): boolean {
|
| 15 |
+
const patternParts = pattern.split(".");
|
| 16 |
+
const subjectParts = subject.split(".");
|
| 17 |
+
|
| 18 |
+
for (let i = 0; i < patternParts.length; i += 1) {
|
| 19 |
+
const part = patternParts[i];
|
| 20 |
+
if (part === ">") {
|
| 21 |
+
return true;
|
| 22 |
+
}
|
| 23 |
+
if (part !== "*" && part !== subjectParts[i]) {
|
| 24 |
+
return false;
|
| 25 |
+
}
|
| 26 |
+
}
|
| 27 |
+
|
| 28 |
+
return patternParts.length === subjectParts.length;
|
| 29 |
+
}
|
| 30 |
+
|
| 31 |
+
export class LocalMeshBus implements MeshBus {
|
| 32 |
+
readonly kind = "local" as const;
|
| 33 |
+
private readonly bus = new EventEmitter();
|
| 34 |
+
private readonly subscriptions = new Map<string, Set<MeshHandler>>();
|
| 35 |
+
|
| 36 |
+
async publish(subject: string, payload: string): Promise<void> {
|
| 37 |
+
for (const [pattern, handlers] of this.subscriptions.entries()) {
|
| 38 |
+
if (matchesSubject(pattern, subject)) {
|
| 39 |
+
for (const handler of handlers) {
|
| 40 |
+
queueMicrotask(() => void handler(payload, subject));
|
| 41 |
+
}
|
| 42 |
+
}
|
| 43 |
+
}
|
| 44 |
+
this.bus.emit(subject, payload);
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
async subscribe(subject: string, handler: MeshHandler): Promise<() => Promise<void>> {
|
| 48 |
+
const handlers = this.subscriptions.get(subject) ?? new Set<MeshHandler>();
|
| 49 |
+
handlers.add(handler);
|
| 50 |
+
this.subscriptions.set(subject, handlers);
|
| 51 |
+
|
| 52 |
+
return async () => {
|
| 53 |
+
handlers.delete(handler);
|
| 54 |
+
if (handlers.size === 0) {
|
| 55 |
+
this.subscriptions.delete(subject);
|
| 56 |
+
}
|
| 57 |
+
};
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
async close(): Promise<void> {
|
| 61 |
+
this.subscriptions.clear();
|
| 62 |
+
this.bus.removeAllListeners();
|
| 63 |
+
}
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
+
export class NatsMeshBus implements MeshBus {
|
| 67 |
+
readonly kind = "nats" as const;
|
| 68 |
+
private readonly codec = StringCodec();
|
| 69 |
+
|
| 70 |
+
constructor(private readonly nc: NatsConnection) {}
|
| 71 |
+
|
| 72 |
+
async publish(subject: string, payload: string): Promise<void> {
|
| 73 |
+
this.nc.publish(subject, this.codec.encode(payload));
|
| 74 |
+
}
|
| 75 |
+
|
| 76 |
+
async subscribe(subject: string, handler: MeshHandler): Promise<() => Promise<void>> {
|
| 77 |
+
const subscription = this.nc.subscribe(subject);
|
| 78 |
+
let active = true;
|
| 79 |
+
|
| 80 |
+
void (async () => {
|
| 81 |
+
for await (const message of subscription) {
|
| 82 |
+
if (!active) {
|
| 83 |
+
break;
|
| 84 |
+
}
|
| 85 |
+
await handler(this.codec.decode(message.data), message.subject);
|
| 86 |
+
}
|
| 87 |
+
})();
|
| 88 |
+
|
| 89 |
+
return async () => {
|
| 90 |
+
active = false;
|
| 91 |
+
subscription.unsubscribe();
|
| 92 |
+
};
|
| 93 |
+
}
|
| 94 |
+
|
| 95 |
+
async close(): Promise<void> {
|
| 96 |
+
await this.nc.drain();
|
| 97 |
+
}
|
| 98 |
+
}
|
| 99 |
+
|
| 100 |
+
export async function createMeshBus(url = process.env.NATS_URL): Promise<MeshBus> {
|
| 101 |
+
if (!url) {
|
| 102 |
+
return new LocalMeshBus();
|
| 103 |
+
}
|
| 104 |
+
|
| 105 |
+
try {
|
| 106 |
+
const nc = await connect({ servers: url, timeout: 1_000 });
|
| 107 |
+
return new NatsMeshBus(nc);
|
| 108 |
+
} catch {
|
| 109 |
+
return new LocalMeshBus();
|
| 110 |
+
}
|
| 111 |
+
}
|
| 112 |
+
|
src/runtime/plugins.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
export type PluginType = "vm" | "ide";
|
| 2 |
+
|
| 3 |
+
export type RuntimePlugin = {
|
| 4 |
+
id: string;
|
| 5 |
+
type: PluginType;
|
| 6 |
+
target: string;
|
| 7 |
+
commands: string[];
|
| 8 |
+
transport: "stdio" | "lsp" | "nats" | "wasm";
|
| 9 |
+
};
|
| 10 |
+
|
| 11 |
+
export const BUILTIN_PLUGINS: RuntimePlugin[] = [
|
| 12 |
+
{
|
| 13 |
+
id: "kitty.vm.apl-wasm",
|
| 14 |
+
type: "vm",
|
| 15 |
+
target: "apl-wasm",
|
| 16 |
+
commands: ["execute_resonance_vm", "analyze_finance_vector", "render_agent_page"],
|
| 17 |
+
transport: "wasm",
|
| 18 |
+
},
|
| 19 |
+
{
|
| 20 |
+
id: "kitty.vm.rust",
|
| 21 |
+
type: "vm",
|
| 22 |
+
target: "rust",
|
| 23 |
+
commands: ["execute_resonance_vm", "render_agent_page"],
|
| 24 |
+
transport: "stdio",
|
| 25 |
+
},
|
| 26 |
+
{
|
| 27 |
+
id: "kitty.vm.python",
|
| 28 |
+
type: "vm",
|
| 29 |
+
target: "python",
|
| 30 |
+
commands: ["execute_resonance_vm", "inspect_workspace", "render_agent_page"],
|
| 31 |
+
transport: "stdio",
|
| 32 |
+
},
|
| 33 |
+
{
|
| 34 |
+
id: "kitty.vm.wasm",
|
| 35 |
+
type: "vm",
|
| 36 |
+
target: "wasm",
|
| 37 |
+
commands: ["execute_resonance_vm", "render_agent_page"],
|
| 38 |
+
transport: "stdio",
|
| 39 |
+
},
|
| 40 |
+
{
|
| 41 |
+
id: "kitty.vm.docker",
|
| 42 |
+
type: "vm",
|
| 43 |
+
target: "docker",
|
| 44 |
+
commands: ["execute_resonance_vm"],
|
| 45 |
+
transport: "stdio",
|
| 46 |
+
},
|
| 47 |
+
{
|
| 48 |
+
id: "kitty.ide.vscode",
|
| 49 |
+
type: "ide",
|
| 50 |
+
target: "vscode",
|
| 51 |
+
commands: ["open_lsp_context", "inspect_workspace"],
|
| 52 |
+
transport: "lsp",
|
| 53 |
+
},
|
| 54 |
+
{
|
| 55 |
+
id: "kitty.ide.neovim",
|
| 56 |
+
type: "ide",
|
| 57 |
+
target: "neovim",
|
| 58 |
+
commands: ["open_lsp_context", "inspect_workspace"],
|
| 59 |
+
transport: "lsp",
|
| 60 |
+
},
|
| 61 |
+
{
|
| 62 |
+
id: "kitty.ide.jetbrains",
|
| 63 |
+
type: "ide",
|
| 64 |
+
target: "jetbrains",
|
| 65 |
+
commands: ["open_lsp_context", "inspect_workspace"],
|
| 66 |
+
transport: "lsp",
|
| 67 |
+
},
|
| 68 |
+
];
|
| 69 |
+
|
| 70 |
+
export function commandAllowed(command: string, vmTarget: string, ideTarget: string): boolean {
|
| 71 |
+
return BUILTIN_PLUGINS.some((plugin) => {
|
| 72 |
+
const targetMatches = plugin.target === vmTarget || plugin.target === ideTarget;
|
| 73 |
+
return targetMatches && plugin.commands.includes(command);
|
| 74 |
+
});
|
| 75 |
+
}
|
src/shared/entropy.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import type { EntropyInput } from "./protocol.js";
|
| 2 |
+
|
| 3 |
+
export type EntropyWeights = {
|
| 4 |
+
dependencies: number;
|
| 5 |
+
failRate: number;
|
| 6 |
+
latency: number;
|
| 7 |
+
};
|
| 8 |
+
|
| 9 |
+
export const DEFAULT_WEIGHTS: EntropyWeights = {
|
| 10 |
+
dependencies: 0.3,
|
| 11 |
+
failRate: 0.5,
|
| 12 |
+
latency: 0.2,
|
| 13 |
+
};
|
| 14 |
+
|
| 15 |
+
export const DEFAULT_THRESHOLD = 0.21;
|
| 16 |
+
|
| 17 |
+
function clamp01(value: number): number {
|
| 18 |
+
if (Number.isNaN(value) || !Number.isFinite(value)) {
|
| 19 |
+
return 1;
|
| 20 |
+
}
|
| 21 |
+
return Math.min(1, Math.max(0, value));
|
| 22 |
+
}
|
| 23 |
+
|
| 24 |
+
export function entropyScore(task: EntropyInput, weights = DEFAULT_WEIGHTS): number {
|
| 25 |
+
const dependencyPressure = clamp01(task.dependencies.length / 10);
|
| 26 |
+
const failPressure = clamp01(task.failRate);
|
| 27 |
+
const latencyPressure = clamp01(task.latencyMs / 10_000);
|
| 28 |
+
|
| 29 |
+
return Number(
|
| 30 |
+
(
|
| 31 |
+
dependencyPressure * weights.dependencies +
|
| 32 |
+
failPressure * weights.failRate +
|
| 33 |
+
latencyPressure * weights.latency
|
| 34 |
+
).toFixed(4),
|
| 35 |
+
);
|
| 36 |
+
}
|
| 37 |
+
|
| 38 |
+
export function isExecutable(task: EntropyInput, threshold = DEFAULT_THRESHOLD): boolean {
|
| 39 |
+
return entropyScore(task) < threshold;
|
| 40 |
+
}
|
| 41 |
+
|
src/shared/protocol.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
export type VmTarget = "apl-wasm" | "rust" | "python" | "wasm" | "docker";
|
| 2 |
+
export type IdeTarget = "vscode" | "neovim" | "jetbrains" | "none";
|
| 3 |
+
export type TaskStatus = "queued" | "blocked" | "running" | "succeeded" | "failed";
|
| 4 |
+
|
| 5 |
+
export type EntropyInput = {
|
| 6 |
+
dependencies: string[];
|
| 7 |
+
failRate: number;
|
| 8 |
+
latencyMs: number;
|
| 9 |
+
};
|
| 10 |
+
|
| 11 |
+
export type KittyAgentContext = {
|
| 12 |
+
id: string;
|
| 13 |
+
label: string;
|
| 14 |
+
url: string;
|
| 15 |
+
memory: Record<string, unknown>;
|
| 16 |
+
vmTarget: VmTarget;
|
| 17 |
+
ideTarget: IdeTarget;
|
| 18 |
+
entropy: number;
|
| 19 |
+
createdAt: string;
|
| 20 |
+
};
|
| 21 |
+
|
| 22 |
+
export type TaskRequest = EntropyInput & {
|
| 23 |
+
id: string;
|
| 24 |
+
contextId: string;
|
| 25 |
+
command: string;
|
| 26 |
+
payload: Record<string, unknown>;
|
| 27 |
+
vmTarget: VmTarget;
|
| 28 |
+
ideTarget: IdeTarget;
|
| 29 |
+
};
|
| 30 |
+
|
| 31 |
+
export type TaskEnvelope = {
|
| 32 |
+
subject: string;
|
| 33 |
+
issuedAt: string;
|
| 34 |
+
task: TaskRequest;
|
| 35 |
+
signature?: string;
|
| 36 |
+
};
|
| 37 |
+
|
| 38 |
+
export type TaskResult = {
|
| 39 |
+
id: string;
|
| 40 |
+
contextId: string;
|
| 41 |
+
status: TaskStatus;
|
| 42 |
+
entropy: number;
|
| 43 |
+
message: string;
|
| 44 |
+
output: Record<string, unknown>;
|
| 45 |
+
completedAt?: string;
|
| 46 |
+
};
|
| 47 |
+
|
| 48 |
+
export type RuntimeSnapshot = {
|
| 49 |
+
mesh: "nats" | "local";
|
| 50 |
+
contexts: KittyAgentContext[];
|
| 51 |
+
results: TaskResult[];
|
| 52 |
+
};
|
| 53 |
+
|
| 54 |
+
export const TOPICS = {
|
| 55 |
+
TASK_RUN: "kitty.task.run",
|
| 56 |
+
TASK_RESULT: "kitty.task.result",
|
| 57 |
+
AGENT_STATE: "kitty.agent.state",
|
| 58 |
+
} as const;
|
tests/entropy.test.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import assert from "node:assert/strict";
|
| 2 |
+
import test from "node:test";
|
| 3 |
+
import { entropyScore, isExecutable } from "../src/shared/entropy.js";
|
| 4 |
+
|
| 5 |
+
test("entropyScore combines workload, failure pressure, and latency", () => {
|
| 6 |
+
const score = entropyScore({
|
| 7 |
+
dependencies: ["a", "b"],
|
| 8 |
+
failRate: 0.1,
|
| 9 |
+
latencyMs: 500,
|
| 10 |
+
});
|
| 11 |
+
|
| 12 |
+
assert.equal(score, 0.12);
|
| 13 |
+
});
|
| 14 |
+
|
| 15 |
+
test("isExecutable blocks high uncertainty tasks", () => {
|
| 16 |
+
assert.equal(
|
| 17 |
+
isExecutable({
|
| 18 |
+
dependencies: ["a", "b", "c", "d", "e", "f"],
|
| 19 |
+
failRate: 0.5,
|
| 20 |
+
latencyMs: 5_000,
|
| 21 |
+
}),
|
| 22 |
+
false,
|
| 23 |
+
);
|
| 24 |
+
});
|
| 25 |
+
|
tests/handshake.test.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import assert from "node:assert/strict";
|
| 2 |
+
import { spawn } from "node:child_process";
|
| 3 |
+
import { readFile } from "node:fs/promises";
|
| 4 |
+
import { join, resolve } from "node:path";
|
| 5 |
+
import test from "node:test";
|
| 6 |
+
|
| 7 |
+
const root = process.cwd();
|
| 8 |
+
|
| 9 |
+
function runNode(args: string[]): Promise<void> {
|
| 10 |
+
return new Promise((resolveRun, reject) => {
|
| 11 |
+
const child = spawn(process.execPath, args, { cwd: root, stdio: "pipe" });
|
| 12 |
+
let stderr = "";
|
| 13 |
+
child.stderr.on("data", (chunk) => {
|
| 14 |
+
stderr += chunk.toString();
|
| 15 |
+
});
|
| 16 |
+
child.on("exit", (code) => {
|
| 17 |
+
if (code === 0) {
|
| 18 |
+
resolveRun();
|
| 19 |
+
} else {
|
| 20 |
+
reject(new Error(stderr || `node exited with ${code}`));
|
| 21 |
+
}
|
| 22 |
+
});
|
| 23 |
+
});
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
test("kittybrowse handshake validates against shadow lineage contract", async () => {
|
| 27 |
+
await runNode(["scripts/validate-handshake.mjs"]);
|
| 28 |
+
|
| 29 |
+
const handshake = JSON.parse(
|
| 30 |
+
await readFile(join(root, "lineage", "kittybrowse-shadow-handshake.json"), "utf8"),
|
| 31 |
+
);
|
| 32 |
+
|
| 33 |
+
assert.equal(handshake.protocol, "shadow-grisp/json-handshake-v1");
|
| 34 |
+
assert.equal(handshake.from.stone, 4);
|
| 35 |
+
assert.equal(handshake.to.repo, "shadow-orchestrator");
|
| 36 |
+
assert.equal(handshake.integration.primary_vm_target, "apl-wasm");
|
| 37 |
+
});
|
tests/runtime.test.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import assert from "node:assert/strict";
|
| 2 |
+
import test from "node:test";
|
| 3 |
+
import { KittyRuntime } from "../src/runtime/agent-runtime.js";
|
| 4 |
+
import { LocalMeshBus } from "../src/runtime/mesh.js";
|
| 5 |
+
|
| 6 |
+
test("runtime creates an agent context and queues executable tasks", async () => {
|
| 7 |
+
const runtime = new KittyRuntime(new LocalMeshBus());
|
| 8 |
+
await runtime.start();
|
| 9 |
+
|
| 10 |
+
const context = runtime.createContext({ label: "Test Context" });
|
| 11 |
+
const result = await runtime.submitTask({
|
| 12 |
+
contextId: context.id,
|
| 13 |
+
command: "execute_resonance_vm",
|
| 14 |
+
payload: { ok: true },
|
| 15 |
+
dependencies: [],
|
| 16 |
+
failRate: 0,
|
| 17 |
+
latencyMs: 100,
|
| 18 |
+
vmTarget: "apl-wasm",
|
| 19 |
+
ideTarget: "vscode",
|
| 20 |
+
});
|
| 21 |
+
|
| 22 |
+
assert.equal(result.status, "queued");
|
| 23 |
+
assert.equal(runtime.snapshot().contexts.length, 1);
|
| 24 |
+
await new Promise((resolve) => setTimeout(resolve, 25));
|
| 25 |
+
assert.equal(runtime.snapshot().results[0]?.status, "succeeded");
|
| 26 |
+
|
| 27 |
+
await runtime.stop();
|
| 28 |
+
});
|
| 29 |
+
|
| 30 |
+
test("runtime blocks tasks above entropy threshold before dispatch", async () => {
|
| 31 |
+
const runtime = new KittyRuntime(new LocalMeshBus());
|
| 32 |
+
await runtime.start();
|
| 33 |
+
const context = runtime.createContext();
|
| 34 |
+
|
| 35 |
+
const result = await runtime.submitTask({
|
| 36 |
+
contextId: context.id,
|
| 37 |
+
command: "execute_resonance_vm",
|
| 38 |
+
payload: {},
|
| 39 |
+
dependencies: ["a", "b", "c", "d", "e", "f", "g"],
|
| 40 |
+
failRate: 0.8,
|
| 41 |
+
latencyMs: 9_000,
|
| 42 |
+
vmTarget: "docker",
|
| 43 |
+
ideTarget: "none",
|
| 44 |
+
});
|
| 45 |
+
|
| 46 |
+
assert.equal(result.status, "blocked");
|
| 47 |
+
assert.equal(runtime.snapshot().results[0]?.status, "blocked");
|
| 48 |
+
|
| 49 |
+
await runtime.stop();
|
| 50 |
+
});
|
tsconfig.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"compilerOptions": {
|
| 3 |
+
"target": "ES2022",
|
| 4 |
+
"module": "NodeNext",
|
| 5 |
+
"moduleResolution": "NodeNext",
|
| 6 |
+
"lib": ["ES2022", "DOM"],
|
| 7 |
+
"strict": true,
|
| 8 |
+
"esModuleInterop": true,
|
| 9 |
+
"forceConsistentCasingInFileNames": true,
|
| 10 |
+
"skipLibCheck": true,
|
| 11 |
+
"outDir": "dist",
|
| 12 |
+
"rootDir": ".",
|
| 13 |
+
"types": ["node"]
|
| 14 |
+
},
|
| 15 |
+
"include": ["src/**/*.ts", "tests/**/*.ts"]
|
| 16 |
+
}
|
| 17 |
+
|