@mcsherrylabs/pi-meerkat 0.5.0 → 0.6.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 +12 -6
- package/dist/announce.d.ts +2 -1
- package/dist/announce.d.ts.map +1 -1
- package/dist/announce.js +25 -2
- package/dist/announce.js.map +1 -1
- package/dist/config.d.ts +34 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +97 -0
- package/dist/config.js.map +1 -0
- package/dist/registry.d.ts +2 -2
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +2 -2
- package/dist/registry.js.map +1 -1
- package/dist/target.d.ts +25 -0
- package/dist/target.d.ts.map +1 -0
- package/dist/target.js +84 -0
- package/dist/target.js.map +1 -0
- package/dist/tools.d.ts +1 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +1 -1
- package/dist/tools.js.map +1 -1
- package/extensions/meerkat.ts +7 -5
- package/package.json +5 -5
- package/dist/subscription-infra.d.ts +0 -15
- package/dist/subscription-infra.d.ts.map +0 -1
- package/dist/subscription-infra.js +0 -74
- package/dist/subscription-infra.js.map +0 -1
- package/dist/subscription-tools.d.ts +0 -29
- package/dist/subscription-tools.d.ts.map +0 -1
- package/dist/subscription-tools.js +0 -77
- package/dist/subscription-tools.js.map +0 -1
package/README.md
CHANGED
|
@@ -4,13 +4,19 @@ Pi agent tools for the meerkat announcements registry: **announce a channel you
|
|
|
4
4
|
search what others have announced.
|
|
5
5
|
|
|
6
6
|
```
|
|
7
|
-
pi-meerkat ──▶ @mcsherrylabs/
|
|
8
|
-
the service's verbs
|
|
7
|
+
pi-meerkat ──▶ @mcsherrylabs/evolver-core ──▶ @mcsherrylabs/evolver-client
|
|
8
|
+
the service's verbs chain + content capability the wire
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
`pi-meerkat` depends on `@mcsherrylabs/evolver-core` (the extracted chain capability that the MCP
|
|
12
|
+
server and any agent extension share) rather than carrying a vendored copy. Two things stay local
|
|
13
|
+
because core deliberately does not provide them: the **two-file project/home config precedence**
|
|
14
|
+
(`src/config.ts`) and the **chain target** (`src/target.ts`, the node client + signer wiring). The
|
|
15
|
+
failure taxonomy (`ToolResult`) and the content publish (`publishBytes`) come from core.
|
|
16
|
+
|
|
11
17
|
## Why this is a separate package
|
|
12
18
|
|
|
13
|
-
|
|
19
|
+
The generic chain tool surface forbids a tool from naming a channel, a ledger or a service, and fails its build
|
|
14
20
|
for it — a draft of its content tool was rejected for the word "announcement". That rule is what
|
|
15
21
|
keeps it chain-generic, and it is also what says where a service's own verbs belong: **here**, in
|
|
16
22
|
the service's own repository, installed by whoever wants them. A new service becomes usable by an
|
|
@@ -50,8 +56,8 @@ eventually fill it from something it read, and an announcement is charged and pe
|
|
|
50
56
|
|---|---|
|
|
51
57
|
| `MEERKAT_URL` | the event processor's read server — the registry's routes and the inbox — e.g. `http://registry:8090`. `REGISTRY_URL`, its name before 0.3.0, is refused: every read answers `misconfigured` until it is renamed |
|
|
52
58
|
| `REGISTRY_CHANNEL` | the channel to announce onto and read (default `ce.meerkat.announcements`) |
|
|
53
|
-
| `EVOLVER_URL`, `EVOLVER_IDENTITY`, `EVOLVER_KEY_PATH` |
|
|
54
|
-
| `EVOLVER_CONTENT_URL` |
|
|
59
|
+
| `EVOLVER_URL`, `EVOLVER_IDENTITY`, `EVOLVER_KEY_PATH` | the local loader — who signs |
|
|
60
|
+
| `EVOLVER_CONTENT_URL` | the local loader — required only to announce a document |
|
|
55
61
|
|
|
56
62
|
The read tools need no chain at all: an agent with no signing key can still search the index.
|
|
57
63
|
|
|
@@ -66,4 +72,4 @@ npm run check:contract # the encoding and every bound, with nothing running
|
|
|
66
72
|
npm run check:surface # the tool table's properties
|
|
67
73
|
```
|
|
68
74
|
|
|
69
|
-
Version 0.4.2
|
|
75
|
+
Version 0.4.2 (history) pinned pi-evolver 0.9.0 and evolver-client 0.19.0 to share the corrected identity-key lookup. Configure the agent API endpoint to evolver-node **v0.24.1+** before using that lookup. The announcement and inbox contracts are unchanged.
|
package/dist/announce.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { SubmitResult } from "@mcsherrylabs/evolver-client";
|
|
2
|
-
import type {
|
|
2
|
+
import type { ToolResult } from "@mcsherrylabs/evolver-core";
|
|
3
|
+
import type { ChainTarget } from "./target.js";
|
|
3
4
|
import type { DetailRef } from "./contract.js";
|
|
4
5
|
/** How many rounds an entry stays live unless re-announced. Rounds, never wall-clock: devnet
|
|
5
6
|
* commits on a ~600 ms floor when busy and a 300-second idle heartbeat when quiescent, so the
|
package/dist/announce.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"announce.d.ts","sourceRoot":"","sources":["../src/announce.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"announce.d.ts","sourceRoot":"","sources":["../src/announce.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,eAAe,CAAC;AAE9D;;iFAEiF;AACjF,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAuB3C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,2FAA2F;IAC3F,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAkEhC"}
|
package/dist/announce.js
CHANGED
|
@@ -8,12 +8,32 @@
|
|
|
8
8
|
// gets it wrong produces a plausible-looking entry that can never be repaired except by
|
|
9
9
|
// announcing again. So the sequence is not offered as a choice.
|
|
10
10
|
import { buildSignedTx, channelBody } from "@mcsherrylabs/evolver-client";
|
|
11
|
-
import {
|
|
11
|
+
import { NodeClient } from "@mcsherrylabs/evolver-client";
|
|
12
|
+
import { misconfigured, publishBytes } from "@mcsherrylabs/evolver-core";
|
|
12
13
|
import { announcementBody, announcementProblems } from "./contract.js";
|
|
13
14
|
/** How many rounds an entry stays live unless re-announced. Rounds, never wall-clock: devnet
|
|
14
15
|
* commits on a ~600 ms floor when busy and a 300-second idle heartbeat when quiescent, so the
|
|
15
16
|
* same number of rounds is a wildly different amount of time in each regime. */
|
|
16
17
|
export const DEFAULT_LEASE_ROUNDS = 20_000;
|
|
18
|
+
const CONTENT_MISSING_FIX = "Set EVOLVER_CONTENT_URL to the node's own content listener (`ce.evolver.content.http-port`, " +
|
|
19
|
+
"e.g. http://node:8450 inside a compose network), or put `contentUrl` in the home-level " +
|
|
20
|
+
".pi/agent/evolver.json. It is deliberately NOT derived from the chain URL — content is a " +
|
|
21
|
+
"separate listener on a separate port — and a project-level file may not set it.";
|
|
22
|
+
/** The content deps for a target, or a refusal naming what to set. Core's `publishBytes` takes
|
|
23
|
+
* `ContentDeps` (client + contentUrl) rather than the whole target, and builds the client against
|
|
24
|
+
* the SEPARATE content listener; that wiring is pi-meerkat's to provide here. */
|
|
25
|
+
function contentDeps(target) {
|
|
26
|
+
const contentUrl = target.config.contentUrl;
|
|
27
|
+
if (!contentUrl)
|
|
28
|
+
return { ok: false, error: CONTENT_MISSING_FIX };
|
|
29
|
+
return {
|
|
30
|
+
ok: true,
|
|
31
|
+
deps: {
|
|
32
|
+
contentUrl,
|
|
33
|
+
client: new NodeClient({ baseUrl: contentUrl, contentBaseUrl: contentUrl }),
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
17
37
|
/**
|
|
18
38
|
* Announce one channel onto the registry's channel, as this agent's identity.
|
|
19
39
|
*
|
|
@@ -35,7 +55,10 @@ export async function announce(target, req) {
|
|
|
35
55
|
// recoverable direction: an announcement referring to nothing is not.
|
|
36
56
|
let detail;
|
|
37
57
|
if (req.detailText !== undefined && req.detailText.length > 0) {
|
|
38
|
-
const
|
|
58
|
+
const d = contentDeps(target);
|
|
59
|
+
if (!d.ok)
|
|
60
|
+
return misconfigured("a content endpoint for publishing the document", d.error);
|
|
61
|
+
const published = await publishBytes(d.deps, { access: "open", text: req.detailText });
|
|
39
62
|
if (published.kind !== "ok")
|
|
40
63
|
return published;
|
|
41
64
|
detail = { key: published.value.key, sha256: published.value.sha256, bytes: published.value.size };
|
package/dist/announce.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"announce.js","sourceRoot":"","sources":["../src/announce.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,EAAE;AACF,kGAAkG;AAClG,+FAA+F;AAC/F,kGAAkG;AAClG,8FAA8F;AAC9F,iGAAiG;AACjG,wFAAwF;AACxF,gEAAgE;AAEhE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"announce.js","sourceRoot":"","sources":["../src/announce.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { DEFAULT_URL, isLocal } from "@mcsherrylabs/evolver-core";
|
|
2
|
+
import type { TlsOptions } from "@mcsherrylabs/evolver-core";
|
|
3
|
+
export { DEFAULT_URL, isLocal };
|
|
4
|
+
export type { TlsOptions };
|
|
5
|
+
/** Where the signing key is, and which key an identity signs with. A faucet-claimed identity
|
|
6
|
+
* holds more than one, so this is not inferable. */
|
|
7
|
+
export interface KeyLocation {
|
|
8
|
+
readonly path: string;
|
|
9
|
+
readonly keyType: "ed25519" | "bls";
|
|
10
|
+
}
|
|
11
|
+
export interface EvolverConfig {
|
|
12
|
+
readonly url: string;
|
|
13
|
+
/** The node's LOOPBACK CONTENT listener — `POST /content`, `GET /content/<key>`. A separate port,
|
|
14
|
+
* not derivable from `url`, and NOT project-overridable (publishing is bytes the agent chose). */
|
|
15
|
+
readonly contentUrl?: string;
|
|
16
|
+
readonly identity: string;
|
|
17
|
+
readonly keyLocation: KeyLocation;
|
|
18
|
+
readonly tls?: TlsOptions;
|
|
19
|
+
}
|
|
20
|
+
export type ConfigResult = {
|
|
21
|
+
readonly ok: true;
|
|
22
|
+
readonly config: EvolverConfig;
|
|
23
|
+
} | {
|
|
24
|
+
readonly ok: false;
|
|
25
|
+
readonly error: string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Combine a project-level and a home-level configuration under the asymmetric precedence rule.
|
|
29
|
+
* Pure: no filesystem, no environment. `loadConfig` does the reading and calls this.
|
|
30
|
+
*/
|
|
31
|
+
export declare function mergeConfig(project: unknown, home: unknown, env?: Record<string, unknown>): ConfigResult;
|
|
32
|
+
/** Read both files and apply the rule. The only part that touches a filesystem. */
|
|
33
|
+
export declare function loadConfig(cwd?: string, env?: NodeJS.ProcessEnv): ConfigResult;
|
|
34
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B;qDACqD;AACrD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,SAAS,GAAG,KAAK,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;uGACmG;IACnG,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC;CAC3B;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AASnD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,YAAY,CAqC5G;AAsBD,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAsB,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,YAAY,CAM1G"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// Configuration: the two-file project/home precedence that governs who signs, and where content
|
|
2
|
+
// goes.
|
|
3
|
+
//
|
|
4
|
+
// ⚠️ THIS IS pi-meerkat'S OWN RULE, NOT core's. `@mcsherrylabs/evolver-core`'s config.ts is a
|
|
5
|
+
// different rule on purpose: it serves a spawned-per-session stdio server, so it reads ONE explicit
|
|
6
|
+
// file, forbids `keyLocation`/`contentUrl` outright (FORBIDDEN_KEYS), and loads the signing key
|
|
7
|
+
// from the ENVIRONMENT only. pi-meerkat is a long-lived extension that must honour a project-level
|
|
8
|
+
// `.pi/agent/evolver.json` next to a home-level one, and whose keyLocation and contentUrl legitimately
|
|
9
|
+
// live in the home file. Core's `resolveConfig` would REJECT exactly the record this package needs,
|
|
10
|
+
// so the precedence is kept here as a local wrapper; the shared compile-time pieces (`DEFAULT_URL`,
|
|
11
|
+
// `isLocal`, the `TlsOptions` shape) are imported from core so they cannot drift.
|
|
12
|
+
//
|
|
13
|
+
// The precedence is NOT uniform, and that is the point. A project file may override the chain URL
|
|
14
|
+
// and NOTHING ELSE. The identity, the key and how the endpoint is trusted come from home or the
|
|
15
|
+
// environment only — a repository you open ships its own file, and if that file could name an
|
|
16
|
+
// identity or a key path, opening a repository would change which key signs.
|
|
17
|
+
import { homedir } from "node:os";
|
|
18
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
19
|
+
import { join } from "node:path";
|
|
20
|
+
import { DEFAULT_URL, isLocal } from "@mcsherrylabs/evolver-core";
|
|
21
|
+
export { DEFAULT_URL, isLocal };
|
|
22
|
+
/** The ONLY field a project-level file may contribute. A list, not a spread, so adding a field
|
|
23
|
+
* to `EvolverConfig` does not silently widen what a project can set. */
|
|
24
|
+
const PROJECT_OVERRIDABLE = ["url"];
|
|
25
|
+
const asRecord = (v) => typeof v === "object" && v !== null ? v : undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Combine a project-level and a home-level configuration under the asymmetric precedence rule.
|
|
28
|
+
* Pure: no filesystem, no environment. `loadConfig` does the reading and calls this.
|
|
29
|
+
*/
|
|
30
|
+
export function mergeConfig(project, home, env = {}) {
|
|
31
|
+
const p = asRecord(project);
|
|
32
|
+
const h = { ...(asRecord(home) ?? {}), ...env }; // the environment outranks the home FILE
|
|
33
|
+
const hasHome = asRecord(home) !== undefined || Object.keys(env).length > 0;
|
|
34
|
+
if (!hasHome && !p)
|
|
35
|
+
return { ok: false, error: "no evolver configuration found (looked for a project .pi/agent/evolver.json, a home-level one, and EVOLVER_* in the environment)" };
|
|
36
|
+
const merged = { ...h };
|
|
37
|
+
if (p)
|
|
38
|
+
for (const field of PROJECT_OVERRIDABLE) {
|
|
39
|
+
if (p[field] !== undefined)
|
|
40
|
+
merged[field] = p[field];
|
|
41
|
+
}
|
|
42
|
+
const identity = merged["identity"];
|
|
43
|
+
if (typeof identity !== "string" || identity.length === 0)
|
|
44
|
+
return { ok: false, error: "configuration has no `identity` — nothing could sign with it (a project file cannot supply one)" };
|
|
45
|
+
const keyLocation = asRecord(merged["keyLocation"]);
|
|
46
|
+
if (!keyLocation || typeof keyLocation["path"] !== "string")
|
|
47
|
+
return { ok: false, error: "configuration has no `keyLocation` — nothing could sign with it (a project file cannot supply one)" };
|
|
48
|
+
const keyType = keyLocation["keyType"];
|
|
49
|
+
if (keyType !== "ed25519" && keyType !== "bls")
|
|
50
|
+
return { ok: false, error: "`keyLocation.keyType` must be \"ed25519\" or \"bls\" — an identity holds more than one key, so this is not inferable" };
|
|
51
|
+
const url = typeof merged["url"] === "string" && merged["url"].length > 0 ? merged["url"] : DEFAULT_URL;
|
|
52
|
+
const contentUrl = typeof merged["contentUrl"] === "string" && merged["contentUrl"].length > 0
|
|
53
|
+
? merged["contentUrl"] : undefined;
|
|
54
|
+
return {
|
|
55
|
+
ok: true,
|
|
56
|
+
config: {
|
|
57
|
+
url,
|
|
58
|
+
...(contentUrl ? { contentUrl } : {}),
|
|
59
|
+
identity,
|
|
60
|
+
keyLocation: { path: keyLocation["path"], keyType },
|
|
61
|
+
tls: asRecord(merged["tls"]),
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** Environment overrides for the fields a project file may NOT set. */
|
|
66
|
+
function fromEnv(env) {
|
|
67
|
+
const out = {};
|
|
68
|
+
if (env["EVOLVER_URL"])
|
|
69
|
+
out["url"] = env["EVOLVER_URL"];
|
|
70
|
+
if (env["EVOLVER_CONTENT_URL"])
|
|
71
|
+
out["contentUrl"] = env["EVOLVER_CONTENT_URL"];
|
|
72
|
+
if (env["EVOLVER_IDENTITY"])
|
|
73
|
+
out["identity"] = env["EVOLVER_IDENTITY"];
|
|
74
|
+
if (env["EVOLVER_KEY_PATH"])
|
|
75
|
+
out["keyLocation"] = {
|
|
76
|
+
path: env["EVOLVER_KEY_PATH"],
|
|
77
|
+
keyType: env["EVOLVER_KEY_TYPE"] === "bls" ? "bls" : "ed25519",
|
|
78
|
+
};
|
|
79
|
+
if (env["EVOLVER_TLS_INSECURE"] === "1")
|
|
80
|
+
out["tls"] = { insecure: true };
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
const readJson = (file) => {
|
|
84
|
+
if (!existsSync(file))
|
|
85
|
+
return undefined;
|
|
86
|
+
try {
|
|
87
|
+
return JSON.parse(readFileSync(file, "utf8"));
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
/** Read both files and apply the rule. The only part that touches a filesystem. */
|
|
94
|
+
export function loadConfig(cwd = process.cwd(), env = process.env) {
|
|
95
|
+
return mergeConfig(readJson(join(cwd, ".pi", "agent", "evolver.json")), readJson(join(homedir(), ".pi", "agent", "evolver.json")), fromEnv(env));
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/registry.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ToolResult } from "@mcsherrylabs/
|
|
1
|
+
import type { ToolResult } from "@mcsherrylabs/evolver-core";
|
|
2
2
|
/** Where the event processor's read server is — the registry's routes and the event inbox are
|
|
3
3
|
* both served there. Its own variable, NOT derived from the chain URL: the processor is a
|
|
4
4
|
* separate process from the node it drains, and in the agent deployments it is a separate
|
|
@@ -34,7 +34,7 @@ export declare function inboxSummary(): Promise<ToolResult<unknown>>;
|
|
|
34
34
|
* The SDK still reads the complete original; this tool never copies it into agent context.
|
|
35
35
|
* bodyBytes is the original decoded byte length, bodyPreview.complete explicitly distinguishes
|
|
36
36
|
* full small bodies from truncated display, and null is unavailable/evicted rather than empty.
|
|
37
|
-
* A malformed position is a refusal of the argument (`partial`, as
|
|
37
|
+
* A malformed position is a refusal of the argument (`partial`, as the chain verbs refuse
|
|
38
38
|
* arguments), never `unreachable`, which would say "retry".
|
|
39
39
|
*/
|
|
40
40
|
export declare function inboxPage(ledgerId: string, after: string | undefined, limit: number | undefined): Promise<ToolResult<unknown>>;
|
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAK7D;;;;;;;uBAOuB;AACvB,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,SAAS,CAInF;AAiCD;+EAC+E;AAC/E,eAAO,MAAM,OAAO,QAAO,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CACV,CAAC;AAE7C,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,EAAE,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAQ5F,CAAC;AAEJ,eAAO,MAAM,OAAO,GAAI,UAAU,MAAM,KAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CACW,CAAC;AAElF;;;;mGAImG;AACnG,eAAO,MAAM,MAAM,GAAI,UAAU,MAAM,KAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAC4B,CAAC;AAElG;;cAEc;AACd,eAAO,MAAM,UAAU,QAAO,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CACP,CAAC;AASnD,gGAAgG;AAChG,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,0FAA0F;AAC1F,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAWvC,wBAAsB,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAMjE;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAqCpI"}
|
package/dist/registry.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
// describe; it did not and cannot vouch for what it says. `inclusion is not endorsement` is on
|
|
11
11
|
// every response for that reason, and the tool descriptions repeat it because the model is the
|
|
12
12
|
// component that has to act on it.
|
|
13
|
-
import { misconfigured } from "@mcsherrylabs/
|
|
13
|
+
import { misconfigured } from "@mcsherrylabs/evolver-core";
|
|
14
14
|
import { ProcessorClient } from "@mcsherrylabs/evolver-client/processor-client";
|
|
15
15
|
/** Where the event processor's read server is — the registry's routes and the event inbox are
|
|
16
16
|
* both served there. Its own variable, NOT derived from the chain URL: the processor is a
|
|
@@ -117,7 +117,7 @@ export async function inboxSummary() {
|
|
|
117
117
|
* The SDK still reads the complete original; this tool never copies it into agent context.
|
|
118
118
|
* bodyBytes is the original decoded byte length, bodyPreview.complete explicitly distinguishes
|
|
119
119
|
* full small bodies from truncated display, and null is unavailable/evicted rather than empty.
|
|
120
|
-
* A malformed position is a refusal of the argument (`partial`, as
|
|
120
|
+
* A malformed position is a refusal of the argument (`partial`, as the chain verbs refuse
|
|
121
121
|
* arguments), never `unreachable`, which would say "retry".
|
|
122
122
|
*/
|
|
123
123
|
export async function inboxPage(ledgerId, after, limit) {
|
package/dist/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,gGAAgG;AAChG,iGAAiG;AACjG,4FAA4F;AAC5F,6EAA6E;AAC7E,EAAE;AACF,iGAAiG;AACjG,8FAA8F;AAC9F,+FAA+F;AAC/F,+FAA+F;AAC/F,mCAAmC;AAGnC,OAAO,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/target.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { NodeClient } from "@mcsherrylabs/evolver-client";
|
|
2
|
+
import type { Signer } from "@mcsherrylabs/evolver-client";
|
|
3
|
+
import type { ToolResult } from "@mcsherrylabs/evolver-core";
|
|
4
|
+
import type { EvolverConfig } from "./config.js";
|
|
5
|
+
export interface ChainTarget {
|
|
6
|
+
readonly config: EvolverConfig;
|
|
7
|
+
readonly client: NodeClient;
|
|
8
|
+
/** `local` or `remote`. A HEURISTIC derived from the URL, not a fact. */
|
|
9
|
+
readonly locality: "local" | "remote";
|
|
10
|
+
/** Built once from the configured key. The private half is closed over by the signer. */
|
|
11
|
+
readonly signer: Signer;
|
|
12
|
+
/** A plain GET against the node, for the handful of reads the client does not wrap. */
|
|
13
|
+
getJson(path: string): Promise<unknown>;
|
|
14
|
+
}
|
|
15
|
+
export type TargetResult = {
|
|
16
|
+
readonly ok: true;
|
|
17
|
+
readonly target: ChainTarget;
|
|
18
|
+
} | {
|
|
19
|
+
readonly ok: false;
|
|
20
|
+
readonly error: string;
|
|
21
|
+
};
|
|
22
|
+
export declare function createTarget(config: EvolverConfig): Promise<TargetResult>;
|
|
23
|
+
/** Run a client call and turn ANY failure into `unreachable`, naming the chain tried. */
|
|
24
|
+
export declare function safely<T>(target: ChainTarget, _what: string, call: () => Promise<T>): Promise<ToolResult<T>>;
|
|
25
|
+
//# sourceMappingURL=target.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target.d.ts","sourceRoot":"","sources":["../src/target.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,UAAU,EAAqC,MAAM,8BAA8B,CAAC;AAC7F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAG3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,aAAa,CAAC;AAG7D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAC;IACtC,yFAAyF;IACzF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,uFAAuF;IACvF,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzC;AAeD,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AA6BnD,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAqB/E;AAED,yFAAyF;AACzF,wBAAsB,MAAM,CAAC,CAAC,EAC5B,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACrB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAMxB"}
|
package/dist/target.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// The chain target: which chain, reached how, and the wrapper that keeps the failure taxonomy
|
|
2
|
+
// intact.
|
|
3
|
+
//
|
|
4
|
+
// ⚠️ THIS IS pi-meerkat'S OWN WIRING, NOT core's. Core has no `ChainTarget`: it is a
|
|
5
|
+
// dependency-injected session API (each signing verb takes a `deps` object carrying `signer`,
|
|
6
|
+
// `identity`, `reads` and `submitTx`), and it loads its key from the environment only. pi-meerkat
|
|
7
|
+
// needs a single long-lived target — client + signer + locality + a plain `getJson` — built from
|
|
8
|
+
// its two-file config, so those pieces live here. The failure taxonomy it answers in
|
|
9
|
+
// (`ToolResult`, `unreachableFrom`) and the TLS-trust shape (`TlsOptions`) come from core.
|
|
10
|
+
import { NodeClient, blsDefaultSigner, edDefaultSigner } from "@mcsherrylabs/evolver-client";
|
|
11
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
12
|
+
import { unreachableFrom } from "@mcsherrylabs/evolver-core";
|
|
13
|
+
import { isLocal } from "./config.js";
|
|
14
|
+
/** The key file holds the raw private key as base64 — nothing else. Read once at construction. */
|
|
15
|
+
function loadSigner(path, keyType) {
|
|
16
|
+
if (!existsSync(path))
|
|
17
|
+
return { ok: false, error: `signing key not found at ${path}` };
|
|
18
|
+
let raw;
|
|
19
|
+
try {
|
|
20
|
+
raw = Uint8Array.from(Buffer.from(readFileSync(path, "utf8").trim(), "base64"));
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
return { ok: false, error: `signing key at ${path} is not readable as base64: ${e.message}` };
|
|
24
|
+
}
|
|
25
|
+
if (raw.length === 0)
|
|
26
|
+
return { ok: false, error: `signing key at ${path} decoded to nothing` };
|
|
27
|
+
return { ok: true, signer: keyType === "bls" ? blsDefaultSigner(raw, "") : edDefaultSigner(raw, "") };
|
|
28
|
+
}
|
|
29
|
+
/** A TLS option that cannot be honoured is a REFUSAL, never a silent no-op. */
|
|
30
|
+
async function resolveFetch(tls) {
|
|
31
|
+
if (!tls || (tls.insecure !== true && tls.caFile === undefined))
|
|
32
|
+
return { ok: true, fetch };
|
|
33
|
+
try {
|
|
34
|
+
const spec = "undici";
|
|
35
|
+
const undici = (await import(spec));
|
|
36
|
+
const agent = new undici.Agent({
|
|
37
|
+
connect: { rejectUnauthorized: tls.insecure !== true, ...(tls.caFile ? { ca: tls.caFile } : {}) },
|
|
38
|
+
});
|
|
39
|
+
const withDispatcher = (input, init) => fetch(input, { ...(init ?? {}), dispatcher: agent });
|
|
40
|
+
return { ok: true, fetch: withDispatcher };
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return {
|
|
44
|
+
ok: false,
|
|
45
|
+
error: "`tls` is configured (insecure or caFile) but this package cannot honour it: no HTTP " +
|
|
46
|
+
"dispatcher is available to apply it. Refusing rather than connecting on terms other " +
|
|
47
|
+
"than the ones configured. Either reach the node through a reverse proxy presenting an " +
|
|
48
|
+
"ordinary trusted certificate, or add a dispatcher dependency to this package.",
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export async function createTarget(config) {
|
|
53
|
+
const f = await resolveFetch(config.tls);
|
|
54
|
+
if (!f.ok)
|
|
55
|
+
return { ok: false, error: f.error };
|
|
56
|
+
const s = loadSigner(config.keyLocation.path, config.keyLocation.keyType);
|
|
57
|
+
if (!s.ok)
|
|
58
|
+
return { ok: false, error: s.error };
|
|
59
|
+
return {
|
|
60
|
+
ok: true,
|
|
61
|
+
target: {
|
|
62
|
+
config,
|
|
63
|
+
client: new NodeClient({ baseUrl: config.url, fetch: f.fetch }),
|
|
64
|
+
locality: isLocal(config.url) ? "local" : "remote",
|
|
65
|
+
signer: s.signer,
|
|
66
|
+
getJson: async (path) => {
|
|
67
|
+
const res = await f.fetch(config.url.replace(/\/$/, "") + path, { headers: { Accept: "application/json" } });
|
|
68
|
+
if (!res.ok)
|
|
69
|
+
throw new Error(`GET ${path}: HTTP ${res.status}`);
|
|
70
|
+
return res.json();
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** Run a client call and turn ANY failure into `unreachable`, naming the chain tried. */
|
|
76
|
+
export async function safely(target, _what, call) {
|
|
77
|
+
try {
|
|
78
|
+
return { kind: "ok", value: await call() };
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
return unreachableFrom(e, target.config.url);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=target.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target.js","sourceRoot":"","sources":["../src/target.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts
CHANGED
package/dist/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1F;AAaD,eAAO,MAAM,KAAK,EAAE,QAAQ,EAoI3B,CAAC"}
|
package/dist/tools.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// The tool surface: what an agent can do with the announcements registry.
|
|
2
2
|
//
|
|
3
3
|
// ⚠️ THIS PACKAGE NAMES THE SERVICE, AND THAT IS PRECISELY WHY IT IS A SEPARATE PACKAGE.
|
|
4
|
-
//
|
|
4
|
+
// The chain tool surface forbids a tool from naming a channel, a ledger or a service (FR-019) and has a
|
|
5
5
|
// check that fails the build for it — a first draft of its content tool was rejected for the word
|
|
6
6
|
// "announcement". That rule is what keeps it chain-generic, and it is also what says where a
|
|
7
7
|
// service's own verbs belong: here, in the service's own repository, installed by whoever wants
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,EAAE;AACF,yFAAyF;AACzF,
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,EAAE;AACF,yFAAyF;AACzF,wGAAwG;AACxG,kGAAkG;AAClG,6FAA6F;AAC7F,gGAAgG;AAChG,8EAA8E;AAC9E,EAAE;AACF,iGAAiG;AACjG,2FAA2F;AAC3F,+FAA+F;AAC/F,8DAA8D;AAE9D,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG/B,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC9I,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAUrE,MAAM,SAAS,GACb,+FAA+F;IAC/F,wFAAwF;IACxF,gDAAgD,CAAC;AAEnD,+FAA+F;AAC/F,MAAM,OAAO,GAAG,GAAW,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,0BAA0B,CAAC;AAEpG,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB,MAAM,CAAC,MAAM,KAAK,GAAe;IAC/B;QACE,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,mCAAmC;QAC1C,WAAW,EACT,8FAA8F;YAC9F,gGAAgG;YAChG,gGAAgG;YAChG,kGAAkG;YAClG,8BAA8B,GAAG,SAAS;QAC5C,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO,EAAE;KAC3B;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,2BAA2B;QAClC,WAAW,EACT,kGAAkG;YAClG,kGAAkG;YAClG,mGAAmG;YACnG,4FAA4F,GAAG,SAAS;QAC1G,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACtB,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gDAAgD,EAAE,CAAC,CAAC;YAChG,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,mBAAmB,SAAS,aAAa,aAAa,GAAG,EAAE,CAAC,CAAC;YAC7G,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC,CAAC;SAClF,CAAC;QACF,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAC5B,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EACpB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,EAAE,SAAS,CAAC,EACxD,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CACzB;KACF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,oCAAoC;QAC3C,WAAW,EACT,gGAAgG;YAChG,8FAA8F;YAC9F,iGAAiG;YACjG,+FAA+F;YAC/F,8DAA8D,GAAG,SAAS;QAC5E,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACtB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,kCAAkC,EAAE,CAAC;SAC3E,CAAC;QACF,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;KAC3D;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,4BAA4B;QACnC,WAAW,EACT,2FAA2F;YAC3F,+FAA+F;YAC/F,gGAAgG;YAChG,sFAAsF,GAAG,SAAS;QACpG,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACtB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qCAAqC,EAAE,CAAC;SAC9E,CAAC;QACF,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;KAC1D;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,KAAK,EAAE,gCAAgC;QACvC,WAAW,EACT,gGAAgG;YAChG,+FAA+F;YAC/F,mFAAmF,GAAG,SAAS;QACjG,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,UAAU,EAAE;KAC9B;IACD;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,2CAA2C;QAClD,WAAW,EACT,6FAA6F;YAC7F,0FAA0F;YAC1F,2FAA2F;YAC3F,4CAA4C;YAC5C,8FAA8F;YAC9F,2EAA2E;YAC3E,2BAA2B,mBAAmB,+CAA+C,eAAe,GAAG,mBAAmB,UAAU;YAC5I,4FAA4F;YAC5F,gGAAgG;YAChG,8GAA8G;YAC9G,8FAA8F;YAC9F,8FAA8F;YAC9F,yFAAyF;YACzF,iGAAiG;QACnG,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACtB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,wDAAwD,EAAE,CAAC,CAAC;YAC/G,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gGAAgG,EAAE,CAAC,CAAC;YACpJ,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2BAA2B,eAAe,4CAA4C,mBAAmB,6BAA6B,eAAe,GAAG,mBAAmB,YAAY,EAAE,CAAC,CAAC;SAC5O,CAAC;QACF,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;YACtF,CAAC,CAAC,YAAY,EAAE;YAChB,CAAC,CAAC,SAAS,CACP,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,EAC5B,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EACzD,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAC1D;KACN;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,gCAAgC;QACvC,WAAW,EACT,2FAA2F;YAC3F,8FAA8F;YAC9F,iGAAiG;YACjG,kGAAkG;YAClG,8FAA8F;YAC9F,4FAA4F;YAC5F,4FAA4F;YAC5F,+EAA+E;QACjF,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACtB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,mDAAmD,EAAE,CAAC;YAC3F,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,uBAAuB,SAAS,cAAc,EAAE,CAAC;YACnF,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yBAAyB,WAAW,cAAc,EAAE,CAAC;YACzF,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2GAA2G,EAAE,CAAC,CAAC;YAC9J,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,SAAS,YAAY,gBAAgB,EAAE,CAAC,CAAC;YAC1G,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,0FAA0F,EAAE,CAAC,CAAC;YACnJ,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,iDAAiD,oBAAoB,wBAAwB,EAAE,CAAC,CAAC;SACxJ,CAAC;QACF,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE;YAC/B,OAAO,EAAE,OAAO,EAAE;YAClB,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACrC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/B,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC;YACnC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,UAAU,CAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;YACtF,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YACjF,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;SACrF,CAAC;KACH;CACF,CAAC"}
|
package/extensions/meerkat.ts
CHANGED
|
@@ -5,13 +5,15 @@
|
|
|
5
5
|
// package's node_modules. So the extension lives HERE, at a path the manifest names and `files`
|
|
6
6
|
// publishes, and the checks pin it.
|
|
7
7
|
//
|
|
8
|
-
// The chain target is built
|
|
9
|
-
//
|
|
10
|
-
//
|
|
8
|
+
// The chain target is built from this package's own config/target modules (imported as ../dist/,
|
|
9
|
+
// because the extension may only reach into this package's published dist). The loader carries
|
|
10
|
+
// pi-meerkat's two-file project/home precedence; the target builds the node client + signer. The
|
|
11
|
+
// shared failure taxonomy and content publish come from @mcsherrylabs/evolver-core.
|
|
11
12
|
|
|
12
13
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
13
|
-
import { loadConfig
|
|
14
|
-
import
|
|
14
|
+
import { loadConfig } from "../dist/config.js";
|
|
15
|
+
import { createTarget } from "../dist/target.js";
|
|
16
|
+
import type { ChainTarget } from "../dist/target.js";
|
|
15
17
|
import { TOOLS } from "../dist/index.js";
|
|
16
18
|
|
|
17
19
|
let cached: ChainTarget | undefined;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcsherrylabs/pi-meerkat",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Pi agent extension: announce a channel you control onto the meerkat announcements registry, and search what others have announced. Owns the announcement wire contract;
|
|
3
|
+
"version": "0.6.0",
|
|
4
|
+
"description": "Pi agent extension: announce a channel you control onto the meerkat announcements registry, and search what others have announced. Owns the announcement wire contract; the chain/content capability comes from @mcsherrylabs/evolver-core.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": {
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
"check:inbox": "tsx test/inbox-tool-checks.ts"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@mcsherrylabs/evolver-client": "0.
|
|
27
|
-
"
|
|
28
|
-
"
|
|
26
|
+
"@mcsherrylabs/evolver-client": "0.22.1",
|
|
27
|
+
"@mcsherrylabs/evolver-core": "0.1.0",
|
|
28
|
+
"typebox": "1.3.32"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@earendil-works/pi-coding-agent": "0.85.1"
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export declare function addChannel(channelId: string, opts: {
|
|
2
|
-
configPath: string;
|
|
3
|
-
}): Promise<{
|
|
4
|
-
added: boolean;
|
|
5
|
-
channels: string[];
|
|
6
|
-
}>;
|
|
7
|
-
export declare function restartNode(opts?: {
|
|
8
|
-
socketPath?: string;
|
|
9
|
-
containerName?: string;
|
|
10
|
-
timeoutSeconds?: number;
|
|
11
|
-
}): Promise<{
|
|
12
|
-
restarted: boolean;
|
|
13
|
-
error?: string;
|
|
14
|
-
}>;
|
|
15
|
-
//# sourceMappingURL=subscription-infra.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subscription-infra.d.ts","sourceRoot":"","sources":["../src/subscription-infra.ts"],"names":[],"mappings":"AAmBA,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAC3B,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAYjD;AAED,wBAAsB,WAAW,CAC/B,IAAI,GAAE;IACJ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACpB,GACL,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwCjD"}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
|
|
2
|
-
import { dirname } from "node:path";
|
|
3
|
-
import { request } from "node:http";
|
|
4
|
-
const HOCON_KEY = "ce.evolver.subscribed-channels";
|
|
5
|
-
function parseChannels(content) {
|
|
6
|
-
const match = content.match(/\[([^\]]*)\]/);
|
|
7
|
-
if (!match)
|
|
8
|
-
return [];
|
|
9
|
-
return match[1]
|
|
10
|
-
.split(",")
|
|
11
|
-
.map((s) => s.trim().replace(/^"|"$/g, ""))
|
|
12
|
-
.filter(Boolean);
|
|
13
|
-
}
|
|
14
|
-
function formatHocon(channels) {
|
|
15
|
-
return `${HOCON_KEY} = [ ${channels.map((c) => `"${c}"`).join(", ")} ]\n`;
|
|
16
|
-
}
|
|
17
|
-
export async function addChannel(channelId, opts) {
|
|
18
|
-
let channels = [];
|
|
19
|
-
if (existsSync(opts.configPath)) {
|
|
20
|
-
channels = parseChannels(readFileSync(opts.configPath, "utf-8"));
|
|
21
|
-
}
|
|
22
|
-
if (channels.includes(channelId)) {
|
|
23
|
-
return { added: false, channels };
|
|
24
|
-
}
|
|
25
|
-
channels.push(channelId);
|
|
26
|
-
mkdirSync(dirname(opts.configPath), { recursive: true });
|
|
27
|
-
writeFileSync(opts.configPath, formatHocon(channels));
|
|
28
|
-
return { added: true, channels };
|
|
29
|
-
}
|
|
30
|
-
export async function restartNode(opts = {}) {
|
|
31
|
-
const socketPath = opts.socketPath ?? "/var/run/docker.sock";
|
|
32
|
-
const containerName = opts.containerName ?? `${process.env["COMPOSE_PROJECT_NAME"] ?? "evolver"}-node-1`;
|
|
33
|
-
const timeout = opts.timeoutSeconds ?? 30;
|
|
34
|
-
if (!existsSync(socketPath)) {
|
|
35
|
-
return { restarted: false, error: "Docker socket not mounted — add /var/run/docker.sock to the app container's volumes" };
|
|
36
|
-
}
|
|
37
|
-
return new Promise((resolve) => {
|
|
38
|
-
const req = request({
|
|
39
|
-
socketPath,
|
|
40
|
-
path: `/v1.43/containers/${containerName}/restart?t=${timeout}`,
|
|
41
|
-
method: "POST",
|
|
42
|
-
}, (res) => {
|
|
43
|
-
let body = "";
|
|
44
|
-
res.on("data", (chunk) => { body += chunk.toString(); });
|
|
45
|
-
res.on("end", () => {
|
|
46
|
-
if (res.statusCode === 204) {
|
|
47
|
-
resolve({ restarted: true });
|
|
48
|
-
}
|
|
49
|
-
else if (res.statusCode === 404) {
|
|
50
|
-
resolve({ restarted: false, error: `Container '${containerName}' not found — check COMPOSE_PROJECT_NAME` });
|
|
51
|
-
}
|
|
52
|
-
else if (res.statusCode === 403) {
|
|
53
|
-
resolve({ restarted: false, error: "Docker socket permission denied — check the mount is readable" });
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
resolve({ restarted: false, error: `Docker API returned ${res.statusCode}: ${body}` });
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
req.on("error", (err) => {
|
|
61
|
-
if (err.code === "EACCES") {
|
|
62
|
-
resolve({ restarted: false, error: "Docker socket permission denied — check the mount is readable" });
|
|
63
|
-
}
|
|
64
|
-
else if (err.code === "ENOENT") {
|
|
65
|
-
resolve({ restarted: false, error: "Docker socket not mounted — add /var/run/docker.sock to the app container's volumes" });
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
resolve({ restarted: false, error: `Docker API error: ${err.message}` });
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
req.end();
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
//# sourceMappingURL=subscription-infra.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subscription-infra.js","sourceRoot":"","sources":["../src/subscription-infra.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { TSchema } from "typebox";
|
|
2
|
-
export interface SubscriptionToolDeps {
|
|
3
|
-
readonly configPath: string;
|
|
4
|
-
readonly socketPath?: string;
|
|
5
|
-
readonly containerName?: string;
|
|
6
|
-
readonly addChannel: (channelId: string, opts: {
|
|
7
|
-
configPath: string;
|
|
8
|
-
}) => Promise<{
|
|
9
|
-
added: boolean;
|
|
10
|
-
channels: string[];
|
|
11
|
-
}>;
|
|
12
|
-
readonly restartNode: (opts?: {
|
|
13
|
-
socketPath?: string;
|
|
14
|
-
containerName?: string;
|
|
15
|
-
timeoutSeconds?: number;
|
|
16
|
-
}) => Promise<{
|
|
17
|
-
restarted: boolean;
|
|
18
|
-
error?: string;
|
|
19
|
-
}>;
|
|
20
|
-
}
|
|
21
|
-
export interface SubscriptionToolSpec {
|
|
22
|
-
readonly name: string;
|
|
23
|
-
readonly label: string;
|
|
24
|
-
readonly description: string;
|
|
25
|
-
readonly parameters: TSchema;
|
|
26
|
-
}
|
|
27
|
-
export declare const SUBSCRIPTION_TOOL_SPECS: readonly SubscriptionToolSpec[];
|
|
28
|
-
export declare function createSubscriptionToolRunners(deps: SubscriptionToolDeps): Map<string, (params: Record<string, unknown>) => Promise<unknown>>;
|
|
29
|
-
//# sourceMappingURL=subscription-tools.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subscription-tools.d.ts","sourceRoot":"","sources":["../src/subscription-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,KAChE,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACrD,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,KACjG,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED,eAAO,MAAM,uBAAuB,EAAE,SAAS,oBAAoB,EAqCzD,CAAC;AAEX,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,oBAAoB,GACzB,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAyCpE"}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { Type } from "typebox";
|
|
2
|
-
export const SUBSCRIPTION_TOOL_SPECS = [
|
|
3
|
-
{
|
|
4
|
-
name: "meerkat_add_channel",
|
|
5
|
-
label: "Add a channel to the node config",
|
|
6
|
-
description: "Add a channel to the node's subscribed-channels configuration file so it will receive " +
|
|
7
|
-
"events on that channel after the next restart. Idempotent: adding a channel that is " +
|
|
8
|
-
"already present succeeds without modifying the file. Returns the updated channel list.",
|
|
9
|
-
parameters: Type.Object({
|
|
10
|
-
channelId: Type.String({ description: "The channel to add (e.g. ce.myservice.responses)." }),
|
|
11
|
-
}),
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
name: "meerkat_restart_node",
|
|
15
|
-
label: "Restart the node container",
|
|
16
|
-
description: "Restart the node container via the Docker Engine API so it picks up configuration " +
|
|
17
|
-
"changes (such as newly added channels). Returns success or a descriptive error naming " +
|
|
18
|
-
"the specific problem (missing socket, container not found, permission denied).",
|
|
19
|
-
parameters: Type.Object({
|
|
20
|
-
timeoutSeconds: Type.Optional(Type.Number({
|
|
21
|
-
description: "How long Docker waits before killing the container. Default 30.",
|
|
22
|
-
})),
|
|
23
|
-
}),
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
name: "meerkat_subscribe",
|
|
27
|
-
label: "Subscribe to a channel (config + restart)",
|
|
28
|
-
description: "Add a channel to the node config and restart the node if newly added. This is a " +
|
|
29
|
-
"convenience wrapper: it calls meerkat_add_channel then meerkat_restart_node. If the " +
|
|
30
|
-
"channel is already in the config, the restart is skipped. Does NOT register a handler " +
|
|
31
|
-
"— write handler code in the app, guided by the channel-subscription skill.",
|
|
32
|
-
parameters: Type.Object({
|
|
33
|
-
channelId: Type.String({ description: "The channel to subscribe to." }),
|
|
34
|
-
}),
|
|
35
|
-
},
|
|
36
|
-
];
|
|
37
|
-
export function createSubscriptionToolRunners(deps) {
|
|
38
|
-
const runners = new Map();
|
|
39
|
-
runners.set("meerkat_add_channel", async (params) => {
|
|
40
|
-
const channelId = String(params["channelId"] ?? "");
|
|
41
|
-
if (!channelId)
|
|
42
|
-
return { error: "channelId is required" };
|
|
43
|
-
const result = await deps.addChannel(channelId, { configPath: deps.configPath });
|
|
44
|
-
if (!result.added) {
|
|
45
|
-
return { added: false, channels: result.channels, note: "channel already in config" };
|
|
46
|
-
}
|
|
47
|
-
return { added: true, channels: result.channels };
|
|
48
|
-
});
|
|
49
|
-
runners.set("meerkat_restart_node", async (params) => {
|
|
50
|
-
const timeoutSeconds = params["timeoutSeconds"] !== undefined
|
|
51
|
-
? Number(params["timeoutSeconds"]) : undefined;
|
|
52
|
-
return deps.restartNode({
|
|
53
|
-
socketPath: deps.socketPath,
|
|
54
|
-
containerName: deps.containerName,
|
|
55
|
-
...(timeoutSeconds !== undefined ? { timeoutSeconds } : {}),
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
runners.set("meerkat_subscribe", async (params) => {
|
|
59
|
-
const channelId = String(params["channelId"] ?? "");
|
|
60
|
-
if (!channelId)
|
|
61
|
-
return { error: "channelId is required" };
|
|
62
|
-
const addResult = await deps.addChannel(channelId, { configPath: deps.configPath });
|
|
63
|
-
if (!addResult.added) {
|
|
64
|
-
return { subscribed: true, restarted: false, note: "channel already in config, node not restarted" };
|
|
65
|
-
}
|
|
66
|
-
const restart = await deps.restartNode({
|
|
67
|
-
socketPath: deps.socketPath,
|
|
68
|
-
containerName: deps.containerName,
|
|
69
|
-
});
|
|
70
|
-
if (restart.restarted) {
|
|
71
|
-
return { subscribed: true, restarted: true };
|
|
72
|
-
}
|
|
73
|
-
return { subscribed: true, restarted: false, error: restart.error };
|
|
74
|
-
});
|
|
75
|
-
return runners;
|
|
76
|
-
}
|
|
77
|
-
//# sourceMappingURL=subscription-tools.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subscription-tools.js","sourceRoot":"","sources":["../src/subscription-tools.ts"],"names":[],"mappings":"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"}
|