@mcsherrylabs/pi-meerkat 0.2.0 → 0.2.1

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/dist/index.d.ts CHANGED
@@ -3,4 +3,5 @@ export * from "./announce.js";
3
3
  export * from "./registry.js";
4
4
  export * from "./tools.js";
5
5
  export * from "./subscription-tools.js";
6
+ export * from "./subscription-infra.js";
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC"}
package/dist/index.js CHANGED
@@ -8,4 +8,5 @@ export * from "./announce.js";
8
8
  export * from "./registry.js";
9
9
  export * from "./tools.js";
10
10
  export * from "./subscription-tools.js";
11
+ export * from "./subscription-infra.js";
11
12
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,EAAE;AACF,+FAA+F;AAC/F,+FAA+F;AAC/F,qDAAqD;AAErD,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,EAAE;AACF,+FAA+F;AAC/F,+FAA+F;AAC/F,qDAAqD;AAErD,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,15 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription-infra.d.ts","sourceRoot":"","sources":["../src/subscription-infra.ts"],"names":[],"mappings":"AAkBA,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,CAajD;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"}
@@ -0,0 +1,74 @@
1
+ import { readFileSync, writeFileSync, renameSync, existsSync } from "node:fs";
2
+ import { request } from "node:http";
3
+ const HOCON_KEY = "ce.evolver.subscribed-channels";
4
+ function parseChannels(content) {
5
+ const match = content.match(/\[([^\]]*)\]/);
6
+ if (!match)
7
+ return [];
8
+ return match[1]
9
+ .split(",")
10
+ .map((s) => s.trim().replace(/^"|"$/g, ""))
11
+ .filter(Boolean);
12
+ }
13
+ function formatHocon(channels) {
14
+ return `${HOCON_KEY} = [ ${channels.map((c) => `"${c}"`).join(", ")} ]\n`;
15
+ }
16
+ export async function addChannel(channelId, opts) {
17
+ let channels = [];
18
+ if (existsSync(opts.configPath)) {
19
+ channels = parseChannels(readFileSync(opts.configPath, "utf-8"));
20
+ }
21
+ if (channels.includes(channelId)) {
22
+ return { added: false, channels };
23
+ }
24
+ channels.push(channelId);
25
+ const tmp = opts.configPath + ".tmp";
26
+ writeFileSync(tmp, formatHocon(channels));
27
+ renameSync(tmp, opts.configPath);
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription-infra.js","sourceRoot":"","sources":["../src/subscription-infra.ts"],"names":[],"mappings":"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"}
@@ -12,8 +12,7 @@
12
12
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
13
13
  import { loadConfig, createTarget } from "@mcsherrylabs/pi-evolver";
14
14
  import type { ChainTarget } from "@mcsherrylabs/pi-evolver";
15
- import { TOOLS, SUBSCRIPTION_TOOL_SPECS, createSubscriptionToolRunners } from "../dist/index.js";
16
- import { addChannel, restartNode } from "../../../src/subscription.js";
15
+ import { TOOLS, SUBSCRIPTION_TOOL_SPECS, createSubscriptionToolRunners, addChannel, restartNode } from "../dist/index.js";
17
16
 
18
17
  let cached: ChainTarget | undefined;
19
18
  let configError: string | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcsherrylabs/pi-meerkat",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
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; wraps @mcsherrylabs/pi-evolver for the chain and the content cache.",
5
5
  "type": "module",
6
6
  "exports": {