@caupulican/pi-adaptative 0.80.67 → 0.80.69

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,3 +1,15 @@
1
+ ## [0.80.69] - 2026-06-28
2
+
3
+ ### Added
4
+
5
+ - Configurable reflection model: the native reflection engine now uses the `autoLearn.model` / `autoLearn.thinkingLevel` settings (a `--model` pattern, e.g. a balanced or cheaper model) instead of always using the session model. The configured model is honored only when its provider is available (api key / logged in); otherwise it falls back to the session model.
6
+
7
+ ## [0.80.68] - 2026-06-27
8
+
9
+ ### Added
10
+
11
+ - Resource catalog (round resource management): point pi at a catalog directory of skills/extensions/agents/prompts/themes and install them into your pi user level. `update` hash-compares what you've installed against the catalog and re-syncs only the changed ones (and only what you chose on this machine); `backup` copies a user-level resource back into the catalog. Content-hash based, so it's portable across machines.
12
+
1
13
  ## [0.80.67] - 2026-06-27
2
14
 
3
15
  ### Added
@@ -0,0 +1,50 @@
1
+ /**
2
+ * CatalogManager — round resource management (resource-management design).
3
+ *
4
+ * A user-pointed **catalog directory** (a folder/repo holding `{skills,extensions,agents,prompts,themes}`)
5
+ * is the easy-to-setup source of a user's workflows. From it pi can:
6
+ * - **install** a resource = copy it into the pi user level (`<agentDir>/<kind>/`),
7
+ * - **update** = hash-compare what's installed against the catalog and re-sync changed/outdated ones,
8
+ * - **backup** = copy a user-level resource back into the catalog.
9
+ * Per machine, the user installs only the subset they want; `update` refreshes exactly those.
10
+ *
11
+ * Copies are content-recursive (`cpSync`); status is decided by a recursive content hash so it is
12
+ * portable across machines (mtimes differ; content does not).
13
+ */
14
+ export declare const CATALOG_KINDS: readonly ["skills", "extensions", "agents", "prompts", "themes"];
15
+ export type CatalogKind = (typeof CATALOG_KINDS)[number];
16
+ export type CatalogStatus = "not-installed" | "up-to-date" | "outdated";
17
+ export interface CatalogEntry {
18
+ kind: CatalogKind;
19
+ /** Top-level name in the catalog (a directory or file name). */
20
+ name: string;
21
+ /** Absolute path of the entry in the catalog. */
22
+ catalogPath: string;
23
+ /** Absolute path where it installs at user level. */
24
+ installPath: string;
25
+ }
26
+ export declare class CatalogManager {
27
+ private readonly agentDir;
28
+ private readonly catalogDir;
29
+ constructor(agentDir: string, catalogDir: string);
30
+ /** Every resource discovered in the catalog, across all kinds. */
31
+ list(): CatalogEntry[];
32
+ /** Status of one catalog entry relative to what is installed at user level. */
33
+ status(entry: CatalogEntry): CatalogStatus;
34
+ /** Copy a catalog entry into the user level (install or overwrite). */
35
+ install(entry: CatalogEntry): void;
36
+ /**
37
+ * Re-sync every INSTALLED resource that is outdated relative to the catalog (catalog → user level).
38
+ * Never installs things the user has not already chosen on this machine. Returns the updated entries.
39
+ */
40
+ update(): CatalogEntry[];
41
+ /** Copy a user-level resource back into the catalog (backup). Requires it to exist at user level. */
42
+ backup(entry: CatalogEntry): void;
43
+ }
44
+ /**
45
+ * Content hash of a file or directory tree: stable across machines (ignores mtimes/paths outside the
46
+ * tree). Files contribute their relative path + bytes; directories are walked in sorted order so the
47
+ * hash is deterministic.
48
+ */
49
+ export declare function hashPath(target: string): string;
50
+ //# sourceMappingURL=catalog-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-manager.d.ts","sourceRoot":"","sources":["../../src/core/catalog-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,eAAO,MAAM,aAAa,kEAAmE,CAAC;AAC9F,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,YAAY,GAAG,UAAU,CAAC;AAExE,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,YAAY,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAG/C;IAED,kEAAkE;IAClE,IAAI,IAAI,YAAY,EAAE,CAsBrB;IAED,+EAA+E;IAC/E,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CAGzC;IAED,uEAAuE;IACvE,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAEjC;IAED;;;OAGG;IACH,MAAM,IAAI,YAAY,EAAE,CASvB;IAED,qGAAqG;IACrG,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAKhC;CACD;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA8B/C","sourcesContent":["/**\n * CatalogManager — round resource management (resource-management design).\n *\n * A user-pointed **catalog directory** (a folder/repo holding `{skills,extensions,agents,prompts,themes}`)\n * is the easy-to-setup source of a user's workflows. From it pi can:\n * - **install** a resource = copy it into the pi user level (`<agentDir>/<kind>/`),\n * - **update** = hash-compare what's installed against the catalog and re-sync changed/outdated ones,\n * - **backup** = copy a user-level resource back into the catalog.\n * Per machine, the user installs only the subset they want; `update` refreshes exactly those.\n *\n * Copies are content-recursive (`cpSync`); status is decided by a recursive content hash so it is\n * portable across machines (mtimes differ; content does not).\n */\n\nimport { createHash } from \"node:crypto\";\nimport { cpSync, existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport const CATALOG_KINDS = [\"skills\", \"extensions\", \"agents\", \"prompts\", \"themes\"] as const;\nexport type CatalogKind = (typeof CATALOG_KINDS)[number];\n\nexport type CatalogStatus = \"not-installed\" | \"up-to-date\" | \"outdated\";\n\nexport interface CatalogEntry {\n\tkind: CatalogKind;\n\t/** Top-level name in the catalog (a directory or file name). */\n\tname: string;\n\t/** Absolute path of the entry in the catalog. */\n\tcatalogPath: string;\n\t/** Absolute path where it installs at user level. */\n\tinstallPath: string;\n}\n\nexport class CatalogManager {\n\tprivate readonly agentDir: string;\n\tprivate readonly catalogDir: string;\n\n\tconstructor(agentDir: string, catalogDir: string) {\n\t\tthis.agentDir = agentDir;\n\t\tthis.catalogDir = catalogDir;\n\t}\n\n\t/** Every resource discovered in the catalog, across all kinds. */\n\tlist(): CatalogEntry[] {\n\t\tconst entries: CatalogEntry[] = [];\n\t\tfor (const kind of CATALOG_KINDS) {\n\t\t\tconst kindDir = join(this.catalogDir, kind);\n\t\t\tif (!existsSync(kindDir)) continue;\n\t\t\tlet names: string[];\n\t\t\ttry {\n\t\t\t\tnames = readdirSync(kindDir);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const name of names) {\n\t\t\t\tif (name.startsWith(\".\")) continue;\n\t\t\t\tentries.push({\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\tcatalogPath: join(kindDir, name),\n\t\t\t\t\tinstallPath: join(this.agentDir, kind, name),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn entries;\n\t}\n\n\t/** Status of one catalog entry relative to what is installed at user level. */\n\tstatus(entry: CatalogEntry): CatalogStatus {\n\t\tif (!existsSync(entry.installPath)) return \"not-installed\";\n\t\treturn hashPath(entry.catalogPath) === hashPath(entry.installPath) ? \"up-to-date\" : \"outdated\";\n\t}\n\n\t/** Copy a catalog entry into the user level (install or overwrite). */\n\tinstall(entry: CatalogEntry): void {\n\t\tcpSync(entry.catalogPath, entry.installPath, { recursive: true, force: true });\n\t}\n\n\t/**\n\t * Re-sync every INSTALLED resource that is outdated relative to the catalog (catalog → user level).\n\t * Never installs things the user has not already chosen on this machine. Returns the updated entries.\n\t */\n\tupdate(): CatalogEntry[] {\n\t\tconst updated: CatalogEntry[] = [];\n\t\tfor (const entry of this.list()) {\n\t\t\tif (this.status(entry) === \"outdated\") {\n\t\t\t\tthis.install(entry);\n\t\t\t\tupdated.push(entry);\n\t\t\t}\n\t\t}\n\t\treturn updated;\n\t}\n\n\t/** Copy a user-level resource back into the catalog (backup). Requires it to exist at user level. */\n\tbackup(entry: CatalogEntry): void {\n\t\tif (!existsSync(entry.installPath)) {\n\t\t\tthrow new Error(`Cannot back up \"${entry.kind}/${entry.name}\": not installed at user level.`);\n\t\t}\n\t\tcpSync(entry.installPath, entry.catalogPath, { recursive: true, force: true });\n\t}\n}\n\n/**\n * Content hash of a file or directory tree: stable across machines (ignores mtimes/paths outside the\n * tree). Files contribute their relative path + bytes; directories are walked in sorted order so the\n * hash is deterministic.\n */\nexport function hashPath(target: string): string {\n\tconst hash = createHash(\"sha256\");\n\tconst walk = (abs: string, rel: string): void => {\n\t\tlet stats: ReturnType<typeof statSync>;\n\t\ttry {\n\t\t\tstats = statSync(abs);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tif (stats.isDirectory()) {\n\t\t\tlet children: string[];\n\t\t\ttry {\n\t\t\t\tchildren = readdirSync(abs).sort();\n\t\t\t} catch {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (const child of children) {\n\t\t\t\twalk(join(abs, child), rel ? `${rel}/${child}` : child);\n\t\t\t}\n\t\t} else if (stats.isFile()) {\n\t\t\thash.update(`\u0000${rel}\u0000`);\n\t\t\ttry {\n\t\t\t\thash.update(readFileSync(abs));\n\t\t\t} catch {\n\t\t\t\t// unreadable file → contributes only its path\n\t\t\t}\n\t\t}\n\t};\n\twalk(target, \"\");\n\treturn hash.digest(\"hex\");\n}\n"]}
Binary file
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-manager.js","sourceRoot":"","sources":["../../src/core/catalog-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAClF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAC;AAe9F,MAAM,OAAO,cAAc;IACT,QAAQ,CAAS;IACjB,UAAU,CAAS;IAEpC,YAAY,QAAgB,EAAE,UAAkB,EAAE;QACjD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAAA,CAC7B;IAED,kEAAkE;IAClE,IAAI,GAAmB;QACtB,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,SAAS;YACnC,IAAI,KAAe,CAAC;YACpB,IAAI,CAAC;gBACJ,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACR,SAAS;YACV,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBAC1B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,SAAS;gBACnC,OAAO,CAAC,IAAI,CAAC;oBACZ,IAAI;oBACJ,IAAI;oBACJ,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;oBAChC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;iBAC5C,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;QACD,OAAO,OAAO,CAAC;IAAA,CACf;IAED,+EAA+E;IAC/E,MAAM,CAAC,KAAmB,EAAiB;QAC1C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC;YAAE,OAAO,eAAe,CAAC;QAC3D,OAAO,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC;IAAA,CAC/F;IAED,uEAAuE;IACvE,OAAO,CAAC,KAAmB,EAAQ;QAClC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAAA,CAC/E;IAED;;;OAGG;IACH,MAAM,GAAmB;QACxB,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,UAAU,EAAE,CAAC;gBACvC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACF,CAAC;QACD,OAAO,OAAO,CAAC;IAAA,CACf;IAED,qGAAqG;IACrG,MAAM,CAAC,KAAmB,EAAQ;QACjC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,iCAAiC,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAAA,CAC/E;CACD;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAU;IAChD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,GAAW,EAAQ,EAAE,CAAC;QAChD,IAAI,KAAkC,CAAC;QACvC,IAAI,CAAC;YACJ,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACR,OAAO;QACR,CAAC;QACD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,IAAI,QAAkB,CAAC;YACvB,IAAI,CAAC;gBACJ,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO;YACR,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACzD,CAAC;QACF,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC;gBACJ,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACR,gDAA8C;YAC/C,CAAC;QACF,CAAC;IAAA,CACD,CAAC;IACF,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAAA,CAC1B","sourcesContent":["/**\n * CatalogManager — round resource management (resource-management design).\n *\n * A user-pointed **catalog directory** (a folder/repo holding `{skills,extensions,agents,prompts,themes}`)\n * is the easy-to-setup source of a user's workflows. From it pi can:\n * - **install** a resource = copy it into the pi user level (`<agentDir>/<kind>/`),\n * - **update** = hash-compare what's installed against the catalog and re-sync changed/outdated ones,\n * - **backup** = copy a user-level resource back into the catalog.\n * Per machine, the user installs only the subset they want; `update` refreshes exactly those.\n *\n * Copies are content-recursive (`cpSync`); status is decided by a recursive content hash so it is\n * portable across machines (mtimes differ; content does not).\n */\n\nimport { createHash } from \"node:crypto\";\nimport { cpSync, existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport const CATALOG_KINDS = [\"skills\", \"extensions\", \"agents\", \"prompts\", \"themes\"] as const;\nexport type CatalogKind = (typeof CATALOG_KINDS)[number];\n\nexport type CatalogStatus = \"not-installed\" | \"up-to-date\" | \"outdated\";\n\nexport interface CatalogEntry {\n\tkind: CatalogKind;\n\t/** Top-level name in the catalog (a directory or file name). */\n\tname: string;\n\t/** Absolute path of the entry in the catalog. */\n\tcatalogPath: string;\n\t/** Absolute path where it installs at user level. */\n\tinstallPath: string;\n}\n\nexport class CatalogManager {\n\tprivate readonly agentDir: string;\n\tprivate readonly catalogDir: string;\n\n\tconstructor(agentDir: string, catalogDir: string) {\n\t\tthis.agentDir = agentDir;\n\t\tthis.catalogDir = catalogDir;\n\t}\n\n\t/** Every resource discovered in the catalog, across all kinds. */\n\tlist(): CatalogEntry[] {\n\t\tconst entries: CatalogEntry[] = [];\n\t\tfor (const kind of CATALOG_KINDS) {\n\t\t\tconst kindDir = join(this.catalogDir, kind);\n\t\t\tif (!existsSync(kindDir)) continue;\n\t\t\tlet names: string[];\n\t\t\ttry {\n\t\t\t\tnames = readdirSync(kindDir);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const name of names) {\n\t\t\t\tif (name.startsWith(\".\")) continue;\n\t\t\t\tentries.push({\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\tcatalogPath: join(kindDir, name),\n\t\t\t\t\tinstallPath: join(this.agentDir, kind, name),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn entries;\n\t}\n\n\t/** Status of one catalog entry relative to what is installed at user level. */\n\tstatus(entry: CatalogEntry): CatalogStatus {\n\t\tif (!existsSync(entry.installPath)) return \"not-installed\";\n\t\treturn hashPath(entry.catalogPath) === hashPath(entry.installPath) ? \"up-to-date\" : \"outdated\";\n\t}\n\n\t/** Copy a catalog entry into the user level (install or overwrite). */\n\tinstall(entry: CatalogEntry): void {\n\t\tcpSync(entry.catalogPath, entry.installPath, { recursive: true, force: true });\n\t}\n\n\t/**\n\t * Re-sync every INSTALLED resource that is outdated relative to the catalog (catalog → user level).\n\t * Never installs things the user has not already chosen on this machine. Returns the updated entries.\n\t */\n\tupdate(): CatalogEntry[] {\n\t\tconst updated: CatalogEntry[] = [];\n\t\tfor (const entry of this.list()) {\n\t\t\tif (this.status(entry) === \"outdated\") {\n\t\t\t\tthis.install(entry);\n\t\t\t\tupdated.push(entry);\n\t\t\t}\n\t\t}\n\t\treturn updated;\n\t}\n\n\t/** Copy a user-level resource back into the catalog (backup). Requires it to exist at user level. */\n\tbackup(entry: CatalogEntry): void {\n\t\tif (!existsSync(entry.installPath)) {\n\t\t\tthrow new Error(`Cannot back up \"${entry.kind}/${entry.name}\": not installed at user level.`);\n\t\t}\n\t\tcpSync(entry.installPath, entry.catalogPath, { recursive: true, force: true });\n\t}\n}\n\n/**\n * Content hash of a file or directory tree: stable across machines (ignores mtimes/paths outside the\n * tree). Files contribute their relative path + bytes; directories are walked in sorted order so the\n * hash is deterministic.\n */\nexport function hashPath(target: string): string {\n\tconst hash = createHash(\"sha256\");\n\tconst walk = (abs: string, rel: string): void => {\n\t\tlet stats: ReturnType<typeof statSync>;\n\t\ttry {\n\t\t\tstats = statSync(abs);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tif (stats.isDirectory()) {\n\t\t\tlet children: string[];\n\t\t\ttry {\n\t\t\t\tchildren = readdirSync(abs).sort();\n\t\t\t} catch {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (const child of children) {\n\t\t\t\twalk(join(abs, child), rel ? `${rel}/${child}` : child);\n\t\t\t}\n\t\t} else if (stats.isFile()) {\n\t\t\thash.update(`\u0000${rel}\u0000`);\n\t\t\ttry {\n\t\t\t\thash.update(readFileSync(abs));\n\t\t\t} catch {\n\t\t\t\t// unreadable file → contributes only its path\n\t\t\t}\n\t\t}\n\t};\n\twalk(target, \"\");\n\treturn hash.digest(\"hex\");\n}\n"]}
@@ -118,6 +118,8 @@ export interface Settings {
118
118
  steeringMode?: "all" | "one-at-a-time";
119
119
  followUpMode?: "all" | "one-at-a-time";
120
120
  theme?: string;
121
+ /** Resource catalog directory (round resource management): the folder pi installs/updates/backs up from. */
122
+ catalogDir?: string;
121
123
  compaction?: CompactionSettings;
122
124
  contextGc?: ContextGcSettings;
123
125
  branchSummary?: BranchSummarySettings;
@@ -323,6 +325,9 @@ export declare class SettingsManager {
323
325
  setFollowUpMode(mode: "all" | "one-at-a-time"): void;
324
326
  getTheme(): string | undefined;
325
327
  setTheme(theme: string): void;
328
+ /** The configured resource catalog directory, if any (round resource management). */
329
+ getCatalogDir(): string | undefined;
330
+ setCatalogDir(dir: string | undefined): void;
326
331
  getDefaultThinkingLevel(): "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | undefined;
327
332
  setDefaultThinkingLevel(level: "off" | "minimal" | "low" | "medium" | "high" | "xhigh"): void;
328
333
  getTransport(): TransportSetting;