@synapseia-network/node 0.8.10 → 0.8.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -25
- package/package.json +7 -4
- package/patches/@libp2p+utils+7.1.0.patch +48 -0
package/README.md
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
<!-- TODO: Replace https://dashboard.synapseia.network, https://coord.synapseia.network, and Discord/Twitter links before public launch -->
|
|
2
|
-
|
|
3
1
|
# @synapseia-network/node
|
|
4
2
|
|
|
5
3
|
The Synapseia Network compute node — contribute CPU/GPU cycles to autonomous AI agents and earn SYN tokens on Solana.
|
|
@@ -35,10 +33,10 @@ synapseia start # creates a wallet, prints the address, then waits
|
|
|
35
33
|
# In another terminal — fund the wallet on devnet:
|
|
36
34
|
solana airdrop 1 <YOUR_ADDRESS> --url devnet
|
|
37
35
|
# Re-run:
|
|
38
|
-
synapseia start
|
|
36
|
+
synapseia start
|
|
39
37
|
```
|
|
40
38
|
|
|
41
|
-
For the full walkthrough, keep reading.
|
|
39
|
+
The node talks to the official Synapseia coordinator automatically — no URL flags needed. For the full walkthrough, keep reading.
|
|
42
40
|
|
|
43
41
|
---
|
|
44
42
|
|
|
@@ -108,22 +106,14 @@ SYN is the network's reward token. You can run a node without staking, but staki
|
|
|
108
106
|
|
|
109
107
|
### Step 5 — Start your node
|
|
110
108
|
|
|
111
|
-
Point the node at the public coordinator:
|
|
112
|
-
|
|
113
|
-
```bash
|
|
114
|
-
synapseia start --coordinator https://coord.synapseia.network
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
Or set it once via environment variable:
|
|
118
|
-
|
|
119
109
|
```bash
|
|
120
|
-
export COORDINATOR_URL=https://coord.synapseia.network
|
|
121
110
|
synapseia start
|
|
122
111
|
```
|
|
123
112
|
|
|
124
113
|
The node will:
|
|
125
114
|
|
|
126
|
-
-
|
|
115
|
+
- Connect to the official Synapseia coordinator.
|
|
116
|
+
- Register on the first heartbeat.
|
|
127
117
|
- Heartbeat every ~30 seconds.
|
|
128
118
|
- Wait for incoming work orders (training, inference, research).
|
|
129
119
|
|
|
@@ -144,7 +134,7 @@ Open `https://dashboard.synapseia.network/nodes` and search for your wallet addr
|
|
|
144
134
|
|
|
145
135
|
Prefer a desktop app over the CLI? `node-ui` is a cross-platform Tauri app that wraps the same runtime, uses the same wallet (`~/.synapseia/wallet.json`), and points at the same coordinator.
|
|
146
136
|
|
|
147
|
-
Download from [https://github.com/synapseia-
|
|
137
|
+
Download from [https://github.com/erscoder/synapseia-node-ui/releases](https://github.com/erscoder/synapseia-node-ui/releases):
|
|
148
138
|
|
|
149
139
|
- **macOS:** `synapseia-node-ui_<version>_aarch64.dmg` (Apple Silicon) or `_x64.dmg` (Intel).
|
|
150
140
|
- **Windows:** `synapseia-node-ui_<version>_x64.msi`.
|
|
@@ -160,7 +150,7 @@ Run the installer, follow the prompts, and on first launch the app will create o
|
|
|
160
150
|
|---|---|---|
|
|
161
151
|
| `[BETA_LIMIT_REACHED] Beta tester limit reached.` | Coordinator beta cap is full. CLI exits with code 0. | Wait for the next slot bump or for mainnet. Re-run `synapseia start` later. |
|
|
162
152
|
| `Wallet not funded` / `insufficient SOL` | Wallet has 0 SOL on devnet. | Re-do Step 3 (devnet SOL faucet). |
|
|
163
|
-
| `Coordinator unreachable` / `ECONNREFUSED` |
|
|
153
|
+
| `Coordinator unreachable` / `ECONNREFUSED` | Network problem reaching the official coordinator. | Check your internet connection. Status: [status.synapseia.network](https://status.synapseia.network). |
|
|
164
154
|
| `Cannot find module 'X'` | Global npm install was incomplete. | `npm i -g --force @synapseia-network/node`. |
|
|
165
155
|
| Modal **"Beta tester limit reached"** in node-ui | Same as the CLI message above. | Same fix — re-try later. |
|
|
166
156
|
| Wallet password forgotten | The wallet is encrypted; there is no recovery path. | Delete `~/.synapseia/wallet.json` and re-run `synapseia start`. **You'll lose the old address — fund the new one.** |
|
|
@@ -175,19 +165,26 @@ Main loop — registers the node, heartbeats, executes work orders.
|
|
|
175
165
|
|
|
176
166
|
| Flag | Description | Default |
|
|
177
167
|
|---|---|---|
|
|
178
|
-
| `--
|
|
179
|
-
| `--model <name>` | Ollama model for inference workloads | — |
|
|
168
|
+
| `--model <name>` | Ollama model for inference workloads | recommended for hardware |
|
|
180
169
|
| `--llm-key <key>` | External LLM API key (optional) | — |
|
|
181
|
-
| `--
|
|
170
|
+
| `--max-iterations <n>` | Maximum work order iterations | infinite |
|
|
171
|
+
| `--inference` | Enable inference mode (expose GPU as AI inference provider) | off |
|
|
172
|
+
| `--inference-models <models>` | Comma-separated list of models to serve (e.g. `ollama/qwen2.5:7b,ollama/llama3:8b`) | — |
|
|
182
173
|
| `--lat <n> --lng <n>` | Geolocation override (else IP-based) | — |
|
|
183
174
|
| `--set-name <name>` | Node display name | — |
|
|
184
175
|
|
|
185
176
|
### Other commands
|
|
186
177
|
|
|
187
178
|
- `synapseia status` — current runtime status of your node.
|
|
188
|
-
- `synapseia
|
|
189
|
-
- `synapseia config` —
|
|
190
|
-
- `synapseia
|
|
179
|
+
- `synapseia balance` — wallet SOL + SYN balance.
|
|
180
|
+
- `synapseia config --show` — print current config. `--set-name`, `--set-model`, `--set-llm-key` to edit.
|
|
181
|
+
- `synapseia stake` / `unstake` / `stake-info` — stake / unstake SYN, view tier multiplier.
|
|
182
|
+
- `synapseia claim-rewards` / `claim-wo-rewards` — claim accrued rewards.
|
|
183
|
+
- `synapseia deposit-sol` / `deposit-syn` / `withdraw-sol` / `withdraw-syn` — wallet transfers.
|
|
184
|
+
- `synapseia system-info` — hardware detection report.
|
|
185
|
+
- `synapseia export-key` — export the wallet private key (prompts for password).
|
|
186
|
+
- `synapseia wallet-create` / `wallet-verify` — wallet provisioning helpers.
|
|
187
|
+
- `synapseia stop` — stop a running node.
|
|
191
188
|
|
|
192
189
|
Run any command with `--help` for the full option list.
|
|
193
190
|
|
|
@@ -219,14 +216,14 @@ Full text: see the [`LICENSE`](./LICENSE) file in this directory.
|
|
|
219
216
|
|
|
220
217
|
## Links
|
|
221
218
|
|
|
222
|
-
- **Network dashboard:**
|
|
219
|
+
- **Network dashboard:** [https://dashboard.synapseia.network](https://dashboard.synapseia.network)
|
|
223
220
|
- **Solana devnet faucet:** [https://faucet.solana.com](https://faucet.solana.com)
|
|
224
221
|
- **Solana CLI install:** [https://docs.solana.com/cli/install](https://docs.solana.com/cli/install)
|
|
225
222
|
- **Ollama install:** [https://ollama.com](https://ollama.com)
|
|
226
|
-
- **Issues:** [https://github.com/synapseia-
|
|
223
|
+
- **Issues:** [https://github.com/erscoder/synapseia-node/issues](https://github.com/erscoder/synapseia-node/issues)
|
|
227
224
|
|
|
228
225
|
---
|
|
229
226
|
|
|
230
227
|
## Contributing & support
|
|
231
228
|
|
|
232
|
-
Found a bug? Have a feature request? File an issue on GitHub.
|
|
229
|
+
Found a bug? Have a feature request? File an issue on GitHub. PRs welcome — please open an issue first to discuss non-trivial changes.
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@synapseia-network/node",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.14",
|
|
4
4
|
"description": "Synapseia Network node CLI — P2P compute for autonomous AI agents on Solana.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
7
|
-
"homepage": "https://github.com/synapseia-
|
|
7
|
+
"homepage": "https://github.com/erscoder/synapseia-node#readme",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
|
-
"url": "git+https://github.com/synapseia-
|
|
10
|
+
"url": "git+https://github.com/erscoder/synapseia-node.git"
|
|
11
11
|
},
|
|
12
12
|
"bugs": {
|
|
13
|
-
"url": "https://github.com/synapseia-
|
|
13
|
+
"url": "https://github.com/erscoder/synapseia-node/issues"
|
|
14
14
|
},
|
|
15
15
|
"publishConfig": {
|
|
16
16
|
"access": "public"
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
},
|
|
25
25
|
"files": [
|
|
26
26
|
"dist",
|
|
27
|
+
"patches",
|
|
27
28
|
"scripts",
|
|
28
29
|
"LICENSE",
|
|
29
30
|
"README.md"
|
|
@@ -32,6 +33,7 @@
|
|
|
32
33
|
"dev": "tsup index.ts --watch --onSuccess \"node dist/bootstrap.js --help\"",
|
|
33
34
|
"build": "tsup",
|
|
34
35
|
"prepare": "npm run build",
|
|
36
|
+
"postinstall": "patch-package",
|
|
35
37
|
"start": "node dist/bootstrap.js",
|
|
36
38
|
"test": "jest",
|
|
37
39
|
"test:mutation": "NODE_OPTIONS=--experimental-vm-modules stryker run",
|
|
@@ -70,6 +72,7 @@
|
|
|
70
72
|
"dotenv": "^17.3.1",
|
|
71
73
|
"libp2p": "^3.2.2",
|
|
72
74
|
"ollama": "^0.5.0",
|
|
75
|
+
"patch-package": "^8.0.0",
|
|
73
76
|
"reflect-metadata": "^0.2.2",
|
|
74
77
|
"rxjs": "^7.8.2",
|
|
75
78
|
"semver": "^7.7.2",
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
diff --git a/node_modules/@libp2p/utils/dist/src/queue/job.js b/node_modules/@libp2p/utils/dist/src/queue/job.js
|
|
2
|
+
index 8aef8c4..13e49d3 100644
|
|
3
|
+
--- a/node_modules/@libp2p/utils/dist/src/queue/job.js
|
|
4
|
+
+++ b/node_modules/@libp2p/utils/dist/src/queue/job.js
|
|
5
|
+
@@ -2,6 +2,11 @@ import { AbortError } from '@libp2p/interface';
|
|
6
|
+
import { setMaxListeners } from 'main-event';
|
|
7
|
+
import { raceSignal } from 'race-signal';
|
|
8
|
+
import { JobRecipient } from "./recipient.js";
|
|
9
|
+
+// synapseia-network patch: WeakMap-backed re-entrance guard for the
|
|
10
|
+
+// per-Job onProgress lambda. See the lambda body for the full
|
|
11
|
+
+// rationale; the map is module-scoped so the flag never appears as
|
|
12
|
+
+// an enumerable property on Job instances and is GC'd with them.
|
|
13
|
+
+const PROPAGATING = new WeakMap();
|
|
14
|
+
/**
|
|
15
|
+
* Returns a random string
|
|
16
|
+
*/
|
|
17
|
+
@@ -57,9 +62,28 @@ export class Job {
|
|
18
|
+
...(this.options ?? {}),
|
|
19
|
+
signal: this.controller.signal,
|
|
20
|
+
onProgress: (evt) => {
|
|
21
|
+
- this.recipients.forEach(recipient => {
|
|
22
|
+
- recipient.onProgress?.(evt);
|
|
23
|
+
- });
|
|
24
|
+
+ // synapseia-network patch: any synchronous re-entry
|
|
25
|
+
+ // of this lambda on the same Job no-ops. Primary
|
|
26
|
+
+ // motivation is the A<->B cross-Job cycle (each
|
|
27
|
+
+ // Job's run() lambda registered as the other's
|
|
28
|
+
+ // recipient.onProgress -> propagation ping-pongs
|
|
29
|
+
+ // until RangeError). Side effect: legitimate
|
|
30
|
+
+ // synchronous nested onProgress emissions on the
|
|
31
|
+
+ // same Job are also swallowed. libp2p does not
|
|
32
|
+
+ // re-enter its own Job synchronously today, so
|
|
33
|
+
+ // acceptable. WeakMap keeps the flag off the Job
|
|
34
|
+
+ // instance (no Object.keys / JSON noise; auto GC).
|
|
35
|
+
+ if (PROPAGATING.get(this) === true) {
|
|
36
|
+
+ return;
|
|
37
|
+
+ }
|
|
38
|
+
+ PROPAGATING.set(this, true);
|
|
39
|
+
+ try {
|
|
40
|
+
+ this.recipients.forEach(recipient => {
|
|
41
|
+
+ recipient.onProgress?.(evt);
|
|
42
|
+
+ });
|
|
43
|
+
+ } finally {
|
|
44
|
+
+ PROPAGATING.set(this, false);
|
|
45
|
+
+ }
|
|
46
|
+
}
|
|
47
|
+
}), this.controller.signal);
|
|
48
|
+
this.recipients.forEach(recipient => {
|