@pi-orca/core 0.0.2-dev.20260414093420 → 0.0.2-dev.20260421080334

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 CHANGED
@@ -18,6 +18,7 @@ License: MIT
18
18
  - **DAG Utilities** — Cycle detection and transitive dependency walking for task graphs
19
19
  - **Heartbeat System** — Periodic status file writes with cost tracking
20
20
  - **Duration Parsing** — Human-readable duration strings (`30s`, `5m`, `2h`, `7d`)
21
+ - **Settings I/O** — Atomic read/write of `~/.pi/agent/settings.json` shared across extensions
21
22
 
22
23
  ## Installation
23
24
 
@@ -172,6 +173,23 @@ const userDir = getUserOrcaDir(); // ~/.pi/agent/orca/
172
173
  const projectDir = getProjectOrcaDir(); // <project>/.pi/orca/
173
174
  ```
174
175
 
176
+ ### Settings I/O
177
+
178
+ ```typescript
179
+ import { getPiSettingsPath, readPiSettings, writePiSettings } from "@pi-orca/core";
180
+
181
+ // Read current settings (returns {} if missing/unparseable)
182
+ const settings = await readPiSettings();
183
+
184
+ // Patch and write back atomically
185
+ settings.defaultProvider = "my-provider";
186
+ settings.defaultModel = "my-model";
187
+ await writePiSettings(settings);
188
+
189
+ // Override path for tests via PI_SETTINGS_PATH env var
190
+ const path = getPiSettingsPath(); // ~/.pi/agent/settings.json
191
+ ```
192
+
175
193
  ## API Documentation
176
194
 
177
195
  ### Types
@@ -196,6 +214,7 @@ const projectDir = getProjectOrcaDir(); // <project>/.pi/orca/
196
214
  - **Process**: `isPidAlive()`, `getCurrentPid()`
197
215
  - **DAG**: `detectCycle()`, `getTransitiveDependents()`, `getTransitiveDependencies()`
198
216
  - **Heartbeat**: `createHeartbeat()`
217
+ - **Settings**: `getPiSettingsPath()`, `readPiSettings()`, `writePiSettings()`
199
218
 
200
219
  ## Development
201
220
 
@@ -11,4 +11,5 @@ export * from "./dag.js";
11
11
  export * from "./heartbeat.js";
12
12
  export * from "./config-loader.js";
13
13
  export * from "./autocomplete.js";
14
+ export * from "./settings.js";
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC"}
@@ -11,4 +11,5 @@ export * from "./dag.js";
11
11
  export * from "./heartbeat.js";
12
12
  export * from "./config-loader.js";
13
13
  export * from "./autocomplete.js";
14
+ export * from "./settings.js";
14
15
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Pi agent settings.json read/write utilities.
3
+ * Shared by extensions that need to read or patch settings.
4
+ */
5
+ /**
6
+ * Path to ~/.pi/agent/settings.json.
7
+ * Override with PI_SETTINGS_PATH env var (used by tests).
8
+ */
9
+ export declare function getPiSettingsPath(): string;
10
+ /**
11
+ * Read and parse ~/.pi/agent/settings.json.
12
+ * Returns empty object if the file doesn't exist or is unparseable.
13
+ */
14
+ export declare function readPiSettings(): Promise<Record<string, any>>;
15
+ /**
16
+ * Write settings.json atomically via tmp+rename.
17
+ * Caller is responsible for merging — this writes the full object.
18
+ */
19
+ export declare function writePiSettings(settings: Record<string, any>): Promise<void>;
20
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/utils/settings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAOnE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Pi agent settings.json read/write utilities.
3
+ * Shared by extensions that need to read or patch settings.
4
+ */
5
+ import { readFile } from "fs/promises";
6
+ import { join } from "path";
7
+ import { getUserOrcaDir } from "./path.js";
8
+ import { atomicWrite } from "./filesystem.js";
9
+ /**
10
+ * Path to ~/.pi/agent/settings.json.
11
+ * Override with PI_SETTINGS_PATH env var (used by tests).
12
+ */
13
+ export function getPiSettingsPath() {
14
+ if (process.env["PI_SETTINGS_PATH"]) {
15
+ return process.env["PI_SETTINGS_PATH"];
16
+ }
17
+ // getUserOrcaDir() → ~/.pi/agent/orca → parent is ~/.pi/agent
18
+ return join(getUserOrcaDir(), "..", "settings.json");
19
+ }
20
+ /**
21
+ * Read and parse ~/.pi/agent/settings.json.
22
+ * Returns empty object if the file doesn't exist or is unparseable.
23
+ */
24
+ export async function readPiSettings() {
25
+ try {
26
+ const content = await readFile(getPiSettingsPath(), "utf-8");
27
+ return JSON.parse(content);
28
+ }
29
+ catch {
30
+ return {};
31
+ }
32
+ }
33
+ /**
34
+ * Write settings.json atomically via tmp+rename.
35
+ * Caller is responsible for merging — this writes the full object.
36
+ */
37
+ export async function writePiSettings(settings) {
38
+ await atomicWrite(getPiSettingsPath(), JSON.stringify(settings, null, 2) + "\n");
39
+ }
40
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/utils/settings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACpC,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACzC,CAAC;IACD,gEAAgE;IAChE,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,iBAAiB,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAA6B;IAE7B,MAAM,WAAW,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACnF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-orca/core",
3
- "version": "0.0.2-dev.20260414093420",
3
+ "version": "0.0.2-dev.20260421080334",
4
4
  "description": "Shared types and utilities for Pi Orca extension suite",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -36,7 +36,7 @@
36
36
  "repository": {
37
37
  "type": "git",
38
38
  "url": "https://github.com/bwavell/pi-orca.git",
39
- "directory": "packages/pi-orca-core"
39
+ "directory": "packages/core"
40
40
  },
41
41
  "dependencies": {
42
42
  "yaml": "^2.4.0"