@yefengr/remote-pi 0.7.9 → 0.7.11

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yefengr/remote-pi",
3
- "version": "0.7.9",
3
+ "version": "0.7.11",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -70,6 +70,7 @@
70
70
  ]
71
71
  },
72
72
  "devDependencies": {
73
+ "@earendil-works/pi-coding-agent": "0.84.4",
73
74
  "@types/node": "^25.8.0",
74
75
  "@types/ws": "^8.18.1",
75
76
  "tsx": "^4.22.0",
@@ -77,9 +78,10 @@
77
78
  "vite": "^8.0.16",
78
79
  "vitest": "^4.1.6"
79
80
  },
81
+ "peerDependencies": {
82
+ "@earendil-works/pi-coding-agent": "*"
83
+ },
80
84
  "dependencies": {
81
- "@earendil-works/pi-coding-agent": "^0.79.10",
82
- "@earendil-works/pi-tui": "^0.79.10",
83
85
  "@napi-rs/keyring": "^1.3.0",
84
86
  "@noble/ed25519": "^3.1.0",
85
87
  "croner": "^10.0.1",
@@ -1,51 +0,0 @@
1
- import { type AgentSessionRuntimeDiagnostic, type Extension } from "@earendil-works/pi-coding-agent";
2
- export type PreflightBlockedCode = "remote_pi_extension_missing" | "duplicate_remote_pi_extension" | "extension_diagnostic" | "preflight_failed";
3
- export type DaemonPreflightResult = {
4
- ok: true;
5
- } | {
6
- ok: false;
7
- code: PreflightBlockedCode;
8
- message: string;
9
- /** Safe package identities only; never raw paths, URLs, or diagnostics. */
10
- sources?: string[];
11
- };
12
- export interface PreflightServices {
13
- diagnostics: readonly AgentSessionRuntimeDiagnostic[];
14
- resourceLoader: {
15
- getExtensions(): {
16
- extensions: readonly Extension[];
17
- errors: readonly {
18
- path: string;
19
- error: string;
20
- }[];
21
- };
22
- };
23
- settingsManager?: {
24
- drainErrors(): readonly unknown[];
25
- };
26
- modelRegistry?: {
27
- getError(): string | undefined;
28
- };
29
- }
30
- export interface DaemonPreflightOptions {
31
- cwd: string;
32
- agentDir?: string;
33
- /** Tests inject discovery; production always uses Pi's SDK service factory. */
34
- discover?: (options: {
35
- cwd: string;
36
- agentDir: string;
37
- }) => Promise<PreflightServices>;
38
- /** Tests may substitute the installed Remote Pi package root. */
39
- packageRoot?: string;
40
- }
41
- /**
42
- * Classifies already-discovered Pi services. Kept pure with injected service
43
- * data so source identity and blocked-state rules have deterministic tests.
44
- */
45
- export declare function evaluateDaemonPreflight(services: PreflightServices, packageRoot?: string): DaemonPreflightResult;
46
- /**
47
- * Runs the same SettingsManager/package/resource discovery Pi performs before
48
- * RPC startup. It creates services only: no AgentSession or model runtime is
49
- * created, and the SDK exposes no service-level dispose operation to call.
50
- */
51
- export declare function runDaemonPreflight(options: DaemonPreflightOptions): Promise<DaemonPreflightResult>;
@@ -1,136 +0,0 @@
1
- import { existsSync, readFileSync, statSync } from "node:fs";
2
- import { dirname, relative, resolve } from "node:path";
3
- import { fileURLToPath } from "node:url";
4
- import { createAgentSessionServices, getAgentDir, } from "@earendil-works/pi-coding-agent";
5
- const REMOTE_PI_PACKAGE = "@yefengr/remote-pi";
6
- let offlineDiscoveryDepth = 0;
7
- let previousOfflineValue;
8
- /**
9
- * Pi 0.79's resource loader can install missing configured packages unless
10
- * PI_OFFLINE is set. The guard is reference-counted because supervisors can
11
- * preflight separate entries concurrently. Discovery remains local-only.
12
- */
13
- async function withOfflineDiscovery(action) {
14
- if (offlineDiscoveryDepth === 0) {
15
- previousOfflineValue = process.env["PI_OFFLINE"];
16
- process.env["PI_OFFLINE"] = "1";
17
- }
18
- offlineDiscoveryDepth += 1;
19
- try {
20
- return await action();
21
- }
22
- finally {
23
- offlineDiscoveryDepth -= 1;
24
- if (offlineDiscoveryDepth === 0) {
25
- if (previousOfflineValue === undefined)
26
- delete process.env["PI_OFFLINE"];
27
- else
28
- process.env["PI_OFFLINE"] = previousOfflineValue;
29
- previousOfflineValue = undefined;
30
- }
31
- }
32
- }
33
- function packageNameAt(path) {
34
- let current = path;
35
- try {
36
- if (!statSync(current).isDirectory())
37
- current = dirname(current);
38
- }
39
- catch {
40
- current = dirname(current);
41
- }
42
- while (true) {
43
- const manifest = resolve(current, "package.json");
44
- if (existsSync(manifest)) {
45
- try {
46
- const parsed = JSON.parse(readFileSync(manifest, "utf8"));
47
- return typeof parsed.name === "string" ? parsed.name : undefined;
48
- }
49
- catch {
50
- return undefined;
51
- }
52
- }
53
- const parent = dirname(current);
54
- if (parent === current)
55
- return undefined;
56
- current = parent;
57
- }
58
- }
59
- function isRemotePiPackageSource(source) {
60
- if (!source)
61
- return false;
62
- const spec = source.startsWith("npm:") ? source.slice("npm:".length) : source;
63
- return spec === REMOTE_PI_PACKAGE || spec.startsWith(`${REMOTE_PI_PACKAGE}@`);
64
- }
65
- function isPathWithin(path, root) {
66
- const child = resolve(path);
67
- const parent = resolve(root);
68
- const remainder = relative(parent, child);
69
- return remainder === "" || (!remainder.startsWith("..") && !remainder.includes("../"));
70
- }
71
- function installedPackageRoot() {
72
- return resolve(dirname(fileURLToPath(import.meta.url)), "../..");
73
- }
74
- function isRemotePiExtension(extension, packageRoot) {
75
- if (isRemotePiPackageSource(extension.sourceInfo.source))
76
- return true;
77
- if (extension.sourceInfo.baseDir && packageNameAt(extension.sourceInfo.baseDir) === REMOTE_PI_PACKAGE)
78
- return true;
79
- if (packageNameAt(extension.resolvedPath) === REMOTE_PI_PACKAGE)
80
- return true;
81
- return isPathWithin(extension.resolvedPath, packageRoot) && packageNameAt(packageRoot) === REMOTE_PI_PACKAGE;
82
- }
83
- function safeSource(extension) {
84
- const scope = extension.sourceInfo.scope === "project" || extension.sourceInfo.scope === "user"
85
- ? extension.sourceInfo.scope
86
- : "temporary";
87
- return `${scope}:package:${REMOTE_PI_PACKAGE}`;
88
- }
89
- /**
90
- * Classifies already-discovered Pi services. Kept pure with injected service
91
- * data so source identity and blocked-state rules have deterministic tests.
92
- */
93
- export function evaluateDaemonPreflight(services, packageRoot = installedPackageRoot()) {
94
- const extensions = services.resourceLoader.getExtensions();
95
- const diagnosticErrors = services.diagnostics.filter((diagnostic) => diagnostic.type === "error");
96
- if (extensions.errors.length > 0 || diagnosticErrors.length > 0) {
97
- return {
98
- ok: false,
99
- code: "extension_diagnostic",
100
- message: `Pi reported ${extensions.errors.length + diagnosticErrors.length} extension diagnostic error(s)`,
101
- };
102
- }
103
- if ((services.settingsManager?.drainErrors().length ?? 0) > 0 || services.modelRegistry?.getError()) {
104
- return { ok: false, code: "preflight_failed", message: "Pi settings or model configuration is invalid" };
105
- }
106
- const remoteExtensions = extensions.extensions.filter((extension) => isRemotePiExtension(extension, packageRoot));
107
- if (remoteExtensions.length === 0) {
108
- return { ok: false, code: "remote_pi_extension_missing", message: "No configured Remote Pi Extension was discovered" };
109
- }
110
- if (remoteExtensions.length > 1) {
111
- return {
112
- ok: false,
113
- code: "duplicate_remote_pi_extension",
114
- message: `Found ${remoteExtensions.length} configured Remote Pi Extension sources`,
115
- sources: remoteExtensions.map(safeSource),
116
- };
117
- }
118
- return { ok: true };
119
- }
120
- /**
121
- * Runs the same SettingsManager/package/resource discovery Pi performs before
122
- * RPC startup. It creates services only: no AgentSession or model runtime is
123
- * created, and the SDK exposes no service-level dispose operation to call.
124
- */
125
- export async function runDaemonPreflight(options) {
126
- try {
127
- const agentDir = options.agentDir ?? getAgentDir();
128
- const discover = options.discover ?? (async ({ cwd, agentDir: resolvedAgentDir }) => createAgentSessionServices({ cwd, agentDir: resolvedAgentDir }));
129
- const services = await withOfflineDiscovery(() => discover({ cwd: options.cwd, agentDir }));
130
- return evaluateDaemonPreflight(services, options.packageRoot);
131
- }
132
- catch {
133
- return { ok: false, code: "preflight_failed", message: "Pi SDK resource discovery failed" };
134
- }
135
- }
136
- //# sourceMappingURL=preflight.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/daemon/preflight.ts"],"names":[],"mappings":"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"}