@ryukin-dev/pi-featherless-kali 1.1.2 → 1.1.3

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.1.3
4
+
5
+ - Extension wird jetzt über `pi install npm:@ryukin-dev/pi-featherless-kali` als Pi-Paket geladen.
6
+ - Behebt das Problem, dass der Featherless-Provider nicht unter `/login` → API keys erschien.
7
+ - Alte manuelle Extension-/Skill-Kopien werden beim Start bereinigt.
8
+
3
9
  ## 1.1.2
4
10
 
5
11
  - `kaliai` installiert den Pi Coding Agent automatisch, wenn er fehlt.
package/bin/kaliai.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { spawnSync, execFileSync } from "node:child_process";
3
- import { existsSync, mkdirSync, rmSync, symlinkSync, cpSync, readFileSync, readdirSync } from "node:fs";
3
+ import { existsSync, mkdirSync, rmSync, readdirSync, readlinkSync, readFileSync } from "node:fs";
4
4
  import { homedir, platform } from "node:os";
5
5
  import { dirname, join, basename } from "node:path";
6
6
  import { fileURLToPath } from "node:url";
@@ -9,8 +9,6 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
9
9
  const SOURCE_DIR = join(__dirname, "..");
10
10
  const HOME = homedir();
11
11
  const AGENT_DIR = join(HOME, ".pi", "agent");
12
- const EXT_DIR = join(AGENT_DIR, "extensions", "pi-featherless");
13
- const SKILLS_DIR = join(AGENT_DIR, "skills");
14
12
  const PI_PACKAGE = "@earendil-works/pi-coding-agent";
15
13
  const NPM_PACKAGE = "@ryukin-dev/pi-featherless-kali";
16
14
 
@@ -51,6 +49,59 @@ function ensurePiAgentInstalled() {
51
49
  return fresh;
52
50
  }
53
51
 
52
+ function removeLegacyCopy() {
53
+ const legacyExt = join(AGENT_DIR, "extensions", "pi-featherless");
54
+ if (existsSync(legacyExt)) {
55
+ print("==> Entferne alte manuelle Extension...");
56
+ rmSync(legacyExt, { recursive: true, force: true });
57
+ }
58
+
59
+ const skillsDir = join(AGENT_DIR, "skills");
60
+ if (!existsSync(skillsDir)) return;
61
+ for (const entry of readdirSync(skillsDir, { withFileTypes: true })) {
62
+ if (!entry.isSymbolicLink()) continue;
63
+ const target = readlinkSync(join(skillsDir, entry.name));
64
+ if (target.includes("pi-featherless-kali")) {
65
+ rmSync(join(skillsDir, entry.name), { recursive: true, force: true });
66
+ }
67
+ }
68
+ }
69
+
70
+ function installPiPackage() {
71
+ print("==> Installiere KaliAI als Pi-Paket...");
72
+ const piCli = getPiCliPath();
73
+ const result = spawnSync(process.execPath, [piCli, "install", `npm:${NPM_PACKAGE}`], {
74
+ stdio: "inherit",
75
+ });
76
+ if (result.status !== 0) {
77
+ print("Fehler: KaliAI Pi-Paket konnte nicht installiert werden.");
78
+ process.exit(1);
79
+ }
80
+ }
81
+
82
+ function getInstalledPiPackageDir() {
83
+ const scoped = join(AGENT_DIR, "npm", NPM_PACKAGE);
84
+ if (existsSync(scoped)) return scoped;
85
+ return undefined;
86
+ }
87
+
88
+ function installSkillDeps(skillPath) {
89
+ if (existsSync(join(skillPath, "package.json")) && !existsSync(join(skillPath, "node_modules"))) {
90
+ print(` Installiere Skill-Abhängigkeiten: ${basename(skillPath)}`);
91
+ spawnSync("npm", ["install"], { cwd: skillPath, stdio: "inherit" });
92
+ }
93
+ }
94
+
95
+ function installPiPackageSkillDeps() {
96
+ const pkgDir = getInstalledPiPackageDir();
97
+ if (!pkgDir) return;
98
+ const skillsDir = join(pkgDir, "skills");
99
+ if (!existsSync(skillsDir)) return;
100
+ for (const name of readdirSync(skillsDir)) {
101
+ installSkillDeps(join(skillsDir, name));
102
+ }
103
+ }
104
+
54
105
  function readPackageVersion(dir) {
55
106
  try {
56
107
  const pkg = JSON.parse(readFileSync(join(dir, "package.json"), "utf8"));
@@ -76,48 +127,11 @@ function readChangelog(dir) {
76
127
  }
77
128
  }
78
129
 
79
- function installSkillDeps(skillPath) {
80
- if (existsSync(join(skillPath, "package.json")) && !existsSync(join(skillPath, "node_modules"))) {
81
- print(` Installiere Skill-Abhängigkeiten: ${basename(skillPath)}`);
82
- spawnSync("npm", ["install"], { cwd: skillPath, stdio: "inherit" });
83
- }
84
- }
85
-
86
- function linkOrCopy(source, target) {
87
- if (existsSync(target)) rmSync(target, { recursive: true, force: true });
88
- try {
89
- symlinkSync(source, target, platform() === "win32" ? "junction" : "dir");
90
- } catch {
91
- cpSync(source, target, { recursive: true });
92
- }
93
- }
94
-
95
- function installExtension() {
96
- print("==> KaliAI Extension wird eingerichtet...");
97
- if (existsSync(EXT_DIR)) rmSync(EXT_DIR, { recursive: true, force: true });
98
- cpSync(SOURCE_DIR, EXT_DIR, {
99
- recursive: true,
100
- filter: (src) =>
101
- !src.includes("node_modules") &&
102
- !src.includes(".git"),
103
- });
104
-
105
- const skillsSource = join(SOURCE_DIR, "skills");
106
- if (existsSync(skillsSource)) {
107
- mkdirSync(SKILLS_DIR, { recursive: true });
108
- for (const name of readdirSync(skillsSource)) {
109
- const src = join(skillsSource, name);
110
- const dst = join(SKILLS_DIR, name);
111
- linkOrCopy(src, dst);
112
- installSkillDeps(dst);
113
- }
114
- }
115
- print("==> KaliAI Extension bereit.");
116
- }
117
-
118
130
  async function startChat() {
119
- installExtension();
120
131
  const piCli = ensurePiAgentInstalled();
132
+ removeLegacyCopy();
133
+ installPiPackage();
134
+ installPiPackageSkillDeps();
121
135
  print("==> Starte KaliAI Chat UI...");
122
136
  spawnSync(process.execPath, [piCli], { stdio: "inherit" });
123
137
  }
@@ -132,7 +146,10 @@ async function runUpdate() {
132
146
  print("Update fehlgeschlagen.");
133
147
  process.exit(result.status ?? 1);
134
148
  }
135
- installExtension();
149
+ const piCli = ensurePiAgentInstalled();
150
+ removeLegacyCopy();
151
+ installPiPackage();
152
+ installPiPackageSkillDeps();
136
153
  const after = readPackageVersion(SOURCE_DIR);
137
154
  print("==> KaliAI aktualisiert" + (before && after ? `: v${before} -> v${after}` : ""));
138
155
  print("");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryukin-dev/pi-featherless-kali",
3
- "version": "1.1.2",
3
+ "version": "1.1.3",
4
4
  "description": "Featherless Provider for Pi with accurate tokenization and concurrency tracking.",
5
5
  "type": "module",
6
6
  "main": "index.js",