@seekrit/openclaw-plugin 0.2.1 → 0.3.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.
Files changed (3) hide show
  1. package/README.md +13 -4
  2. package/index.js +60 -0
  3. package/package.json +5 -1
package/README.md CHANGED
@@ -20,16 +20,25 @@ Full guide: **<https://seekrit.dev/docs/guides/ai-agents/openclaw>**
20
20
 
21
21
  ## What this package is
22
22
 
23
- A manifest and a resolver — no runtime code, no tools, no channels, and no
24
- capability prompts at install time. OpenClaw reads
25
- `secretProviderIntegrations` out of `openclaw.plugin.json` without executing
26
- anything, and spawns `seekrit-secret-ref-resolver.js` when it needs values.
23
+ A manifest and a resolver — no tools, no channels, and no capability prompts at
24
+ install time. OpenClaw reads `secretProviderIntegrations` out of
25
+ `openclaw.plugin.json` and spawns `seekrit-secret-ref-resolver.js` when it needs
26
+ values.
27
27
 
28
28
  The resolver is a stdio bridge onto `seekrit openclaw resolve`, so the protocol
29
29
  has exactly one implementation. Decryption happens in a short-lived child
30
30
  process that exits when the batch is answered: the gateway never holds a token,
31
31
  a data key, or a plaintext, and the seekrit API never sees one either.
32
32
 
33
+ `index.js` is a runtime entrypoint that **registers nothing**. It exists only
34
+ because ClawHub classifies any package carrying an `openclaw.plugin.json` as a
35
+ *code plugin* and won't publish one without an `openclaw.extensions` entry — a
36
+ manifest-only plugin has no category in the registry today. The gateway
37
+ therefore imports one inert module of ours at startup. That doesn't move the
38
+ boundary that matters, since decryption still happens in the child process, but
39
+ it does mean "OpenClaw executes none of our code in-process" is no longer
40
+ strictly true, and it seemed better to say so than to drop the claim quietly.
41
+
33
42
  ## Ids
34
43
 
35
44
  Two shapes, mirroring `op://vault/item/field`:
package/index.js ADDED
@@ -0,0 +1,60 @@
1
+ /**
2
+ * The plugin's runtime entrypoint.
3
+ *
4
+ * It registers nothing, and that is deliberate. Everything this plugin does
5
+ * lives in `openclaw.plugin.json`: OpenClaw reads `secretProviderIntegrations`
6
+ * out of the manifest without executing anything, and spawns
7
+ * `seekrit-secret-ref-resolver.js` as a short-lived child process when it needs
8
+ * values. There is no in-process work to do.
9
+ *
10
+ * This file exists because ClawHub classifies any package carrying an
11
+ * `openclaw.plugin.json` (and no `.claude-plugin`/`.codex-plugin`/`.cursor-plugin`
12
+ * bundle marker) as a *code plugin*, and refuses to publish one that doesn't
13
+ * declare `openclaw.extensions` — a manifest-only plugin has no category in the
14
+ * registry today. See `extractCodePluginArtifacts` in
15
+ * openclaw/clawhub `convex/lib/packageRegistry.ts`.
16
+ *
17
+ * The trade that makes: the gateway now imports this module at startup, where
18
+ * before it imported nothing of ours. The boundary that actually matters is
19
+ * unchanged — decryption still happens in a child process that exits when the
20
+ * batch is answered, so the gateway still never holds a token, a data key, or a
21
+ * plaintext. But "OpenClaw runs none of our code in-process" is no longer true,
22
+ * and the README says so rather than quietly dropping the claim.
23
+ *
24
+ * Keep `register` empty. Anything added here runs inside the gateway with the
25
+ * gateway's privileges, which is the thing this design was avoiding. If a CLI
26
+ * surface is ever wanted, weigh it against that.
27
+ *
28
+ * Written as plain JS with no imports on purpose: `definePluginEntry` from
29
+ * `openclaw/plugin-sdk/plugin-entry` is a shaping helper that returns exactly
30
+ * this object literal, and importing it would put a dependency on the host
31
+ * runtime into a package that currently has none.
32
+ */
33
+
34
+ /** Mirrors `emptyPluginConfigSchema()` — this plugin accepts no config keys. */
35
+ function emptyConfigSchema() {
36
+ return {
37
+ safeParse(value) {
38
+ if (value === undefined) return { success: true, data: undefined };
39
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
40
+ return { success: false, error: { issues: [{ message: "expected config object" }] } };
41
+ }
42
+ if (Object.keys(value).length > 0) {
43
+ return { success: false, error: { issues: [{ message: "config must be empty" }] } };
44
+ }
45
+ return { success: true, data: value };
46
+ },
47
+ jsonSchema: { type: "object", additionalProperties: false, properties: {} },
48
+ };
49
+ }
50
+
51
+ export default {
52
+ id: "seekrit",
53
+ name: "seekrit",
54
+ description:
55
+ "Resolve OpenClaw exec SecretRefs from seekrit — end-to-end encrypted secrets, decrypted locally by a short-lived child process.",
56
+ configSchema: emptyConfigSchema(),
57
+ register() {
58
+ // Intentionally empty — see the note above.
59
+ },
60
+ };
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@seekrit/openclaw-plugin",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "seekrit for OpenClaw — resolve exec SecretRefs from end-to-end encrypted secrets, so the gateway config holds no plaintext and the seekrit API never sees one.",
5
5
  "type": "module",
6
6
  "publishConfig": {
7
7
  "access": "public"
8
8
  },
9
9
  "files": [
10
+ "index.js",
10
11
  "openclaw.plugin.json",
11
12
  "seekrit-secret-ref-resolver.js",
12
13
  "README.md"
@@ -25,6 +26,9 @@
25
26
  ],
26
27
  "homepage": "https://seekrit.dev/docs/guides/ai-agents/openclaw",
27
28
  "openclaw": {
29
+ "extensions": [
30
+ "./index.js"
31
+ ],
28
32
  "compat": {
29
33
  "pluginApi": ">=2026.5.28"
30
34
  },