openclaw-storage-plugin 0.1.0
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 +19 -0
- package/SKILL.md +41 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/index.ts +58 -0
- package/openclaw.plugin.json +30 -0
- package/package.json +48 -0
package/README.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# OpenClaw Storage Plugin
|
|
2
|
+
|
|
3
|
+
A programmatic OpenClaw plugin that enables hash-based permanent storage for AI agents using the **Universal Hash Resolution Protocol (UHRP)**.
|
|
4
|
+
|
|
5
|
+
## Key Features
|
|
6
|
+
- **Integrity**: Every file is addressed by its hash, ensuring data cannot be tampered with.
|
|
7
|
+
- **Efficiency**: Agents share large files via hashes instead of large message bodies.
|
|
8
|
+
- **Shared Identity**: Uses the same BSV wallet as your other OpenClaw plugins.
|
|
9
|
+
|
|
10
|
+
## AI Tool: `storage`
|
|
11
|
+
Agents can use the `storage` tool to:
|
|
12
|
+
- `upload`: Save local content to a UHRP storage host.
|
|
13
|
+
- `download`: Retrieve and verify content using a SHA256 hash.
|
|
14
|
+
|
|
15
|
+
## Architecture
|
|
16
|
+
Built with the **OpenClaw Plugin SDK**, this extension interfaces with UHRP storage servers to provide agents with a decentralized "hard drive."
|
|
17
|
+
|
|
18
|
+
## License
|
|
19
|
+
MIT
|
package/SKILL.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: storage
|
|
3
|
+
description: >
|
|
4
|
+
Hash-based permanent storage. Use for uploading large files, sharing datasets
|
|
5
|
+
between agents, or creating permanent records via UHRP.
|
|
6
|
+
metadata: '{"openclaw": {"requires": {"bins": ["node"]}}}'
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Tool Actions
|
|
10
|
+
|
|
11
|
+
| Action | Description |
|
|
12
|
+
|--------|-------------|
|
|
13
|
+
| `upload` | Upload local data and receive a SHA256 UHRP hash |
|
|
14
|
+
| `download` | Retrieve and verify data using a hash |
|
|
15
|
+
| `list` | See all files uploaded/cached by this agent |
|
|
16
|
+
| `status` | Check storage host connection and pricing |
|
|
17
|
+
|
|
18
|
+
## Usage Guidance
|
|
19
|
+
|
|
20
|
+
### Handling Large Data
|
|
21
|
+
If you generate a report, image, or large log file that is too big for a single message, upload it to storage and share the hash instead.
|
|
22
|
+
|
|
23
|
+
```javascript
|
|
24
|
+
storage({
|
|
25
|
+
action: "upload",
|
|
26
|
+
data: "This is a very long report content..."
|
|
27
|
+
})
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Collaborative Knowledge
|
|
31
|
+
Agents can share common datasets by exchanging UHRP hashes. This ensures everyone is working with the exact same version of the data.
|
|
32
|
+
|
|
33
|
+
```javascript
|
|
34
|
+
storage({
|
|
35
|
+
action: "download",
|
|
36
|
+
hash: "a1b2c3d4..."
|
|
37
|
+
})
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Security
|
|
41
|
+
Every download is automatically verified against its hash. If the data has been tampered with by the storage host, the tool will return an error.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,GAAG,QAkDxC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
/**
|
|
4
|
+
* OpenClaw Storage Plugin
|
|
5
|
+
* Enables UHRP hash-based storage for agent data.
|
|
6
|
+
*/
|
|
7
|
+
export default function register(api) {
|
|
8
|
+
const entry = api.getConfig?.()?.plugins?.entries?.['openclaw-storage'] || {};
|
|
9
|
+
const pluginConfig = { ...entry, ...(entry.config || {}), ...(api.config || {}) };
|
|
10
|
+
const storageHost = pluginConfig.storageHost || 'https://storage.bsv.direct';
|
|
11
|
+
const walletDir = pluginConfig.walletDir || path.join(os.homedir(), '.openclaw', 'bsv-wallet');
|
|
12
|
+
api.logger.info(`[storage] Initializing Storage Plugin (host: ${storageHost})`);
|
|
13
|
+
// Register the storage tool
|
|
14
|
+
api.registerTool({
|
|
15
|
+
name: "storage",
|
|
16
|
+
description: "Hash-based permanent storage for large assets",
|
|
17
|
+
parameters: {
|
|
18
|
+
type: "object",
|
|
19
|
+
properties: {
|
|
20
|
+
action: {
|
|
21
|
+
type: "string",
|
|
22
|
+
enum: ["upload", "download", "list", "status"],
|
|
23
|
+
description: "Action to perform"
|
|
24
|
+
},
|
|
25
|
+
data: {
|
|
26
|
+
type: "string",
|
|
27
|
+
description: "Content to upload"
|
|
28
|
+
},
|
|
29
|
+
hash: {
|
|
30
|
+
type: "string",
|
|
31
|
+
description: "UHRP hash to download"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
required: ["action"]
|
|
35
|
+
},
|
|
36
|
+
async execute(_id, params) {
|
|
37
|
+
try {
|
|
38
|
+
// Implementation logic using @bsv/storage-server client will go here
|
|
39
|
+
return {
|
|
40
|
+
content: [{
|
|
41
|
+
type: "text",
|
|
42
|
+
text: `Storage action '${params.action}' received. (Logic implementation pending)`
|
|
43
|
+
}]
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
return {
|
|
48
|
+
content: [{
|
|
49
|
+
type: "text",
|
|
50
|
+
text: `Error: ${error.message || String(error)}`
|
|
51
|
+
}]
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAQ;IACvC,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;IAC9E,MAAM,YAAY,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;IAClF,MAAM,WAAW,GAAG,YAAY,CAAC,WAAW,IAAI,4BAA4B,CAAC;IAC7E,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAE/F,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,gDAAgD,WAAW,GAAG,CAAC,CAAC;IAEhF,4BAA4B;IAC5B,GAAG,CAAC,YAAY,CAAC;QACf,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,+CAA+C;QAC5D,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC;oBAC9C,WAAW,EAAE,mBAAmB;iBACjC;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,mBAAmB;iBACjC;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uBAAuB;iBACrC;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB;QACD,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,MAAW;YACpC,IAAI,CAAC;gBACH,qEAAqE;gBACrE,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,mBAAmB,MAAM,CAAC,MAAM,4CAA4C;yBACnF,CAAC;iBACH,CAAC;YACJ,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,UAAU,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;yBACjD,CAAC;iBACH,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/index.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* OpenClaw Storage Plugin
|
|
6
|
+
* Enables UHRP hash-based storage for agent data.
|
|
7
|
+
*/
|
|
8
|
+
export default function register(api: any) {
|
|
9
|
+
const entry = api.getConfig?.()?.plugins?.entries?.['openclaw-storage'] || {};
|
|
10
|
+
const pluginConfig = { ...entry, ...(entry.config || {}), ...(api.config || {}) };
|
|
11
|
+
const storageHost = pluginConfig.storageHost || 'https://storage.bsv.direct';
|
|
12
|
+
const walletDir = pluginConfig.walletDir || path.join(os.homedir(), '.openclaw', 'bsv-wallet');
|
|
13
|
+
|
|
14
|
+
api.logger.info(`[storage] Initializing Storage Plugin (host: ${storageHost})`);
|
|
15
|
+
|
|
16
|
+
// Register the storage tool
|
|
17
|
+
api.registerTool({
|
|
18
|
+
name: "storage",
|
|
19
|
+
description: "Hash-based permanent storage for large assets",
|
|
20
|
+
parameters: {
|
|
21
|
+
type: "object",
|
|
22
|
+
properties: {
|
|
23
|
+
action: {
|
|
24
|
+
type: "string",
|
|
25
|
+
enum: ["upload", "download", "list", "status"],
|
|
26
|
+
description: "Action to perform"
|
|
27
|
+
},
|
|
28
|
+
data: {
|
|
29
|
+
type: "string",
|
|
30
|
+
description: "Content to upload"
|
|
31
|
+
},
|
|
32
|
+
hash: {
|
|
33
|
+
type: "string",
|
|
34
|
+
description: "UHRP hash to download"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
required: ["action"]
|
|
38
|
+
},
|
|
39
|
+
async execute(_id: string, params: any) {
|
|
40
|
+
try {
|
|
41
|
+
// Implementation logic using @bsv/storage-server client will go here
|
|
42
|
+
return {
|
|
43
|
+
content: [{
|
|
44
|
+
type: "text",
|
|
45
|
+
text: `Storage action '${params.action}' received. (Logic implementation pending)`
|
|
46
|
+
}]
|
|
47
|
+
};
|
|
48
|
+
} catch (error: any) {
|
|
49
|
+
return {
|
|
50
|
+
content: [{
|
|
51
|
+
type: "text",
|
|
52
|
+
text: `Error: ${error.message || String(error)}`
|
|
53
|
+
}]
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "openclaw-storage",
|
|
3
|
+
"name": "BSV UHRP Storage",
|
|
4
|
+
"description": "Hash-based permanent storage for agent data",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"skills": [
|
|
7
|
+
"./SKILL.md"
|
|
8
|
+
],
|
|
9
|
+
"configSchema": {
|
|
10
|
+
"type": "object",
|
|
11
|
+
"additionalProperties": false,
|
|
12
|
+
"properties": {
|
|
13
|
+
"storageHost": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"default": "https://storage.bsv.direct",
|
|
16
|
+
"description": "Preferred UHRP storage host URL"
|
|
17
|
+
},
|
|
18
|
+
"walletDir": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"description": "Path to BSV wallet storage (defaults to ~/.openclaw/bsv-wallet)"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"uiHints": {
|
|
25
|
+
"storageHost": {
|
|
26
|
+
"label": "Storage Host",
|
|
27
|
+
"placeholder": "https://storage.bsv.direct"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "openclaw-storage-plugin",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "OpenClaw plugin for UHRP hash-based storage via BSV",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"files": [
|
|
8
|
+
"index.ts",
|
|
9
|
+
"openclaw.plugin.json",
|
|
10
|
+
"src/",
|
|
11
|
+
"dist/",
|
|
12
|
+
"SKILL.md",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"prepublishOnly": "npm run build",
|
|
18
|
+
"lint": "eslint src/**/*.ts",
|
|
19
|
+
"test": "npx tsx src/**/*.test.ts"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@bsv/sdk": "^2.0.13",
|
|
23
|
+
"@bsv/wallet-toolbox": "^2.1.17",
|
|
24
|
+
"better-sqlite3": "^12.8.0",
|
|
25
|
+
"knex": "^3.2.8",
|
|
26
|
+
"dotenv": "^17.3.1"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/node": "^22.10.0",
|
|
30
|
+
"typescript": "^6.0.2",
|
|
31
|
+
"eslint": "^10.1.0"
|
|
32
|
+
},
|
|
33
|
+
"openclaw": {
|
|
34
|
+
"extensions": [
|
|
35
|
+
"./index.ts"
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
"keywords": [
|
|
39
|
+
"openclaw",
|
|
40
|
+
"plugin",
|
|
41
|
+
"bsv",
|
|
42
|
+
"storage",
|
|
43
|
+
"uhrp",
|
|
44
|
+
"hash"
|
|
45
|
+
],
|
|
46
|
+
"author": "Tomás Díaz",
|
|
47
|
+
"license": "MIT"
|
|
48
|
+
}
|