priiisk 0.1.2 → 0.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.
@@ -8,13 +8,13 @@ import {
8
8
  makeDoctorReport,
9
9
  resolveCampSurface,
10
10
  withCampRpc
11
- } from "./chunk-UDZECRNM.js";
11
+ } from "./chunk-VHGA3U67.js";
12
12
  import {
13
13
  PI_RUNTIME_VERSION,
14
14
  PiModelCatalogIssueCode,
15
15
  inspectPiModelCatalog,
16
16
  makePiOperatorResources
17
- } from "./chunk-FMIRO6TM.js";
17
+ } from "./chunk-GCJD6IMI.js";
18
18
  import {
19
19
  CampHealthComponentStatus,
20
20
  CampHealthOverallStatus,
@@ -32,16 +32,19 @@ import {
32
32
  campManifestHostGeneration,
33
33
  campProjectPaths,
34
34
  campRecoveryDiagnosticFromCause,
35
+ describeProjectConfigOverrides,
35
36
  findCampControllerHealthFailure,
36
37
  findCampRecoveryHealthComponent,
37
38
  listWorkerModelCatalogEntries,
38
39
  loadCampHealth,
39
40
  loadCampManifest,
41
+ loadProjectWorkerConfig,
40
42
  loadWorkerConfig,
43
+ projectConfigPath,
41
44
  resolveCredentialsPath,
42
45
  resolveProjectScope,
43
46
  resolveWorkerConfigPath
44
- } from "./chunk-EBRDSFGF.js";
47
+ } from "./chunk-T6NUWP6F.js";
45
48
  import {
46
49
  Clock_exports,
47
50
  Effect_exports,
@@ -71,12 +74,34 @@ var checkRuntime = () => {
71
74
  }
72
75
  );
73
76
  };
74
- var checkConfig = (fs) => Effect_exports.all([resolveWorkerConfigPath, loadWorkerConfig(fs)]).pipe(
77
+ var projectConfigDetails = (fs) => resolveProjectScope.pipe(
78
+ Effect_exports.flatMap(
79
+ (scope) => loadProjectWorkerConfig(fs, scope.cwd).pipe(
80
+ Effect_exports.map(
81
+ (project) => project === void 0 ? {} : {
82
+ projectConfigPath: projectConfigPath(scope.cwd),
83
+ projectOverrides: describeProjectConfigOverrides(project)
84
+ }
85
+ ),
86
+ Effect_exports.catchAll(() => Effect_exports.succeed({ projectConfigPath: projectConfigPath(scope.cwd) }))
87
+ )
88
+ )
89
+ );
90
+ var checkConfig = (fs) => Effect_exports.all([resolveWorkerConfigPath, loadWorkerConfig(fs), projectConfigDetails(fs)]).pipe(
75
91
  Effect_exports.map(
76
- ([path, config]) => config === void 0 ? doctorCheck("config", DoctorCheckStatus.warning, "User config is missing", { path }) : doctorCheck("config", DoctorCheckStatus.pass, "TOML config is valid", {
92
+ ([path, config, project]) => config === void 0 ? doctorCheck("config", DoctorCheckStatus.warning, "User config is missing", {
77
93
  path,
78
- schemaVersion: config.schemaVersion
79
- })
94
+ ...project
95
+ }) : doctorCheck(
96
+ "config",
97
+ DoctorCheckStatus.pass,
98
+ project.projectOverrides === void 0 ? "TOML config is valid" : `TOML config is valid, ${String(project.projectOverrides.length)} field(s) overridden by the project`,
99
+ {
100
+ path,
101
+ schemaVersion: config.schemaVersion,
102
+ ...project
103
+ }
104
+ )
80
105
  ),
81
106
  Effect_exports.catchAll(
82
107
  (cause) => resolveWorkerConfigPath.pipe(
@@ -28,7 +28,7 @@ import {
28
28
  makePlatform,
29
29
  makeRunMain,
30
30
  stdin
31
- } from "./chunk-EBRDSFGF.js";
31
+ } from "./chunk-T6NUWP6F.js";
32
32
  import {
33
33
  BaseProto,
34
34
  __export,
@@ -3,7 +3,7 @@ const require = __priiiskCreateRequire(import.meta.url);
3
3
  import {
4
4
  FileSystem_exports,
5
5
  PRIIISK_PI_AGENT_DIR_ENV
6
- } from "./chunk-EBRDSFGF.js";
6
+ } from "./chunk-T6NUWP6F.js";
7
7
  import {
8
8
  CampDeliveryPort,
9
9
  CampFailureCode,
@@ -9008,10 +9008,10 @@ var CloseLatch = /* @__PURE__ */ Reference()("@effect/platform/WorkerRunner/Clos
9008
9008
  var PlatformRunner2 = PlatformRunner;
9009
9009
  var CloseLatch2 = CloseLatch;
9010
9010
 
9011
- // packages/config/src/project/projectPaths.ts
9011
+ // packages/config/src/project/projectScope.ts
9012
9012
  import { createHash } from "node:crypto";
9013
- import { tmpdir } from "node:os";
9014
- import { join as join3, resolve as resolve4 } from "node:path";
9013
+ import { existsSync, realpathSync } from "node:fs";
9014
+ import { basename, dirname, join as join3, parse as parse3, resolve as resolve4 } from "node:path";
9015
9015
 
9016
9016
  // packages/config/src/loaders/storageRoots.ts
9017
9017
  import { homedir } from "node:os";
@@ -9027,78 +9027,22 @@ var resolveConfigRootSync = () => xdgRoot("XDG_CONFIG_HOME", join2(homedir(), ".
9027
9027
  var resolveStateRootSync = () => configuredRoot(PRIIISK_STATE_ROOT_ENV) ?? xdgRoot("XDG_STATE_HOME", join2(homedir(), ".local", "state"));
9028
9028
  var resolveCacheRootSync = () => configuredRoot(PRIIISK_CACHE_ROOT_ENV) ?? xdgRoot("XDG_CACHE_HOME", join2(homedir(), ".cache"));
9029
9029
 
9030
- // packages/config/src/project/projectPaths.ts
9031
- var PRIIISK_RUNTIME_DIR_ENV = "PRIIISK_RUNTIME_DIR";
9032
- var PRIIISK_PI_AGENT_DIR_ENV = "PRIIISK_PI_AGENT_DIR";
9033
- var campRunStorageKey = (runId) => createHash("sha256").update(runId).digest("hex").slice(0, 24);
9034
- var campRunPaths = (paths, runId) => {
9035
- const runDir = join3(paths.runsDir, campRunStorageKey(runId));
9036
- const controllerDir = join3(runDir, "controller");
9037
- return {
9038
- runDir,
9039
- manifestPath: join3(runDir, "camp.json"),
9040
- sessionsDir: join3(runDir, "sessions"),
9041
- controllerDir,
9042
- eventsDir: join3(controllerDir, "events"),
9043
- consumersPath: join3(controllerDir, "consumers.json"),
9044
- receiptsPath: join3(controllerDir, "receipts.json")
9045
- };
9046
- };
9047
- var runtimeOwner = () => {
9048
- const uid = process.getuid?.();
9049
- return uid === void 0 ? "user" : String(uid);
9050
- };
9051
- var resolveRuntimeDirSync = () => {
9052
- const override = process.env[PRIIISK_RUNTIME_DIR_ENV]?.trim();
9053
- if (override !== void 0 && override !== "") return resolve4(override);
9054
- const platformRuntime = process.env.XDG_RUNTIME_DIR?.trim();
9055
- if (platformRuntime !== void 0 && platformRuntime !== "") {
9056
- return join3(resolve4(platformRuntime), "priiisk");
9057
- }
9058
- return join3(tmpdir(), `priiisk-${runtimeOwner()}`);
9059
- };
9060
- var campProjectPaths = (scope3) => {
9061
- const runtimeDir = resolveRuntimeDirSync();
9062
- const controllerDir = join3(scope3.stateDir, "controller");
9063
- return {
9064
- stateDir: scope3.stateDir,
9065
- runsDir: join3(scope3.stateDir, "runs"),
9066
- quarantineDir: join3(scope3.stateDir, "quarantine"),
9067
- sessionsDir: join3(scope3.stateDir, "sessions"),
9068
- controllerDir,
9069
- eventsDir: join3(controllerDir, "events"),
9070
- consumersPath: join3(controllerDir, "consumers.json"),
9071
- receiptsPath: join3(controllerDir, "receipts.json"),
9072
- agentDir: join3(scope3.stateDir, "pi-agent"),
9073
- logsDir: join3(scope3.stateDir, "logs"),
9074
- cacheDir: join3(resolveCacheRootSync(), "projects", scope3.hash),
9075
- runtimeDir,
9076
- socketPath: join3(runtimeDir, `${scope3.hash}.sock`),
9077
- lifecycleLockPath: join3(runtimeDir, `${scope3.hash}.lifecycle.lock`),
9078
- manifestPath: join3(scope3.stateDir, "camp.json"),
9079
- healthPath: join3(scope3.stateDir, "logs", "health.json")
9080
- };
9081
- };
9082
-
9083
9030
  // packages/config/src/project/projectScope.ts
9084
- import { createHash as createHash2 } from "node:crypto";
9085
- import { existsSync, realpathSync } from "node:fs";
9086
- import { basename, dirname, join as join4, parse as parse3, resolve as resolve5 } from "node:path";
9087
9031
  var PRIIISK_PROJECT_CWD_ENV = "PRIIISK_PROJECT_CWD";
9088
9032
  var PROJECTS_DIR_NAME = "projects";
9089
9033
  var PROJECT_HASH_HEX_LENGTH = 12;
9090
- var normalizeProjectCwd = (cwd) => realpathSync.native(resolve5(cwd));
9034
+ var normalizeProjectCwd = (cwd) => realpathSync.native(resolve4(cwd));
9091
9035
  var findProjectRootSync = (cwd) => {
9092
9036
  let current = normalizeProjectCwd(cwd);
9093
9037
  const filesystemRoot = parse3(current).root;
9094
9038
  while (current !== filesystemRoot) {
9095
- if (existsSync(join4(current, ".git"))) return current;
9039
+ if (existsSync(join3(current, ".git"))) return current;
9096
9040
  current = dirname(current);
9097
9041
  }
9098
- return existsSync(join4(filesystemRoot, ".git")) ? filesystemRoot : normalizeProjectCwd(cwd);
9042
+ return existsSync(join3(filesystemRoot, ".git")) ? filesystemRoot : normalizeProjectCwd(cwd);
9099
9043
  };
9100
- var projectHashFromCwd = (cwd) => createHash2("sha256").update(normalizeProjectCwd(cwd)).digest("hex").slice(0, PROJECT_HASH_HEX_LENGTH);
9101
- var projectStateDirFromHash = (hash) => join4(resolveStateRootSync(), PROJECTS_DIR_NAME, hash);
9044
+ var projectHashFromCwd = (cwd) => createHash("sha256").update(normalizeProjectCwd(cwd)).digest("hex").slice(0, PROJECT_HASH_HEX_LENGTH);
9045
+ var projectStateDirFromHash = (hash) => join3(resolveStateRootSync(), PROJECTS_DIR_NAME, hash);
9102
9046
  var projectScopeFromCwd = (cwd) => {
9103
9047
  const normalized = findProjectRootSync(cwd);
9104
9048
  const hash = projectHashFromCwd(normalized);
@@ -9119,6 +9063,62 @@ var resolveProjectScope = Effect_exports.gen(function* () {
9119
9063
  return projectScopeFromCwd(cwd);
9120
9064
  }).pipe(Effect_exports.catchAll(() => Effect_exports.succeed(resolveProjectScopeSync())));
9121
9065
 
9066
+ // packages/config/src/project/projectPaths.ts
9067
+ import { createHash as createHash2 } from "node:crypto";
9068
+ import { tmpdir } from "node:os";
9069
+ import { join as join4, resolve as resolve5 } from "node:path";
9070
+ var PRIIISK_RUNTIME_DIR_ENV = "PRIIISK_RUNTIME_DIR";
9071
+ var PRIIISK_PI_AGENT_DIR_ENV = "PRIIISK_PI_AGENT_DIR";
9072
+ var campRunStorageKey = (runId) => createHash2("sha256").update(runId).digest("hex").slice(0, 24);
9073
+ var campRunPaths = (paths, runId) => {
9074
+ const runDir = join4(paths.runsDir, campRunStorageKey(runId));
9075
+ const controllerDir = join4(runDir, "controller");
9076
+ return {
9077
+ runDir,
9078
+ manifestPath: join4(runDir, "camp.json"),
9079
+ sessionsDir: join4(runDir, "sessions"),
9080
+ controllerDir,
9081
+ eventsDir: join4(controllerDir, "events"),
9082
+ consumersPath: join4(controllerDir, "consumers.json"),
9083
+ receiptsPath: join4(controllerDir, "receipts.json")
9084
+ };
9085
+ };
9086
+ var runtimeOwner = () => {
9087
+ const uid = process.getuid?.();
9088
+ return uid === void 0 ? "user" : String(uid);
9089
+ };
9090
+ var resolveRuntimeDirSync = () => {
9091
+ const override = process.env[PRIIISK_RUNTIME_DIR_ENV]?.trim();
9092
+ if (override !== void 0 && override !== "") return resolve5(override);
9093
+ const platformRuntime = process.env.XDG_RUNTIME_DIR?.trim();
9094
+ if (platformRuntime !== void 0 && platformRuntime !== "") {
9095
+ return join4(resolve5(platformRuntime), "priiisk");
9096
+ }
9097
+ return join4(tmpdir(), `priiisk-${runtimeOwner()}`);
9098
+ };
9099
+ var campProjectPaths = (scope3) => {
9100
+ const runtimeDir = resolveRuntimeDirSync();
9101
+ const controllerDir = join4(scope3.stateDir, "controller");
9102
+ return {
9103
+ stateDir: scope3.stateDir,
9104
+ runsDir: join4(scope3.stateDir, "runs"),
9105
+ quarantineDir: join4(scope3.stateDir, "quarantine"),
9106
+ sessionsDir: join4(scope3.stateDir, "sessions"),
9107
+ controllerDir,
9108
+ eventsDir: join4(controllerDir, "events"),
9109
+ consumersPath: join4(controllerDir, "consumers.json"),
9110
+ receiptsPath: join4(controllerDir, "receipts.json"),
9111
+ agentDir: join4(scope3.stateDir, "pi-agent"),
9112
+ logsDir: join4(scope3.stateDir, "logs"),
9113
+ cacheDir: join4(resolveCacheRootSync(), "projects", scope3.hash),
9114
+ runtimeDir,
9115
+ socketPath: join4(runtimeDir, `${scope3.hash}.sock`),
9116
+ lifecycleLockPath: join4(runtimeDir, `${scope3.hash}.lifecycle.lock`),
9117
+ manifestPath: join4(scope3.stateDir, "camp.json"),
9118
+ healthPath: join4(scope3.stateDir, "logs", "health.json")
9119
+ };
9120
+ };
9121
+
9122
9122
  // packages/config/src/domain/configErrors.ts
9123
9123
  var StateIoError = class extends Data_exports.TaggedError("StateIoError") {
9124
9124
  };
@@ -9194,8 +9194,8 @@ var loadReferencedMcpCredentials = (fs, names) => Effect_exports.gen(function* (
9194
9194
  );
9195
9195
  });
9196
9196
 
9197
- // packages/config/src/loaders/userStoragePreparation.ts
9198
- import { dirname as dirname2 } from "node:path";
9197
+ // packages/config/src/loaders/projectConfigLoader.ts
9198
+ import { join as join6 } from "node:path";
9199
9199
 
9200
9200
  // node_modules/.pnpm/smol-toml@1.7.0/node_modules/smol-toml/dist/date.js
9201
9201
  var DATE_TIME_RE = /^(\d{4}-\d{2}-\d{2})?[T ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|[-+]\d{2}:\d{2})?$/i;
@@ -9966,6 +9966,133 @@ var WorkerDefaultsSchema = Schema_exports.Struct({
9966
9966
  directTools: Schema_exports.optional(DirectToolsConfigSchema)
9967
9967
  });
9968
9968
 
9969
+ // packages/config/src/schema/projectConfig.ts
9970
+ var ProjectRolePresetSchema = RolePresetSchema.omit("readTools");
9971
+ var ProjectDefaultsSchema = Schema_exports.partial(WorkerDefaultsSchema.omit("readTools"));
9972
+ var ProjectWorkerConfigSchema = Schema_exports.Struct({
9973
+ schemaVersion: Schema_exports.Literal(1),
9974
+ models: Schema_exports.optional(Schema_exports.Record({ key: Schema_exports.String, value: ModelAliasSchema })),
9975
+ roles: Schema_exports.optional(Schema_exports.Record({ key: Schema_exports.String, value: ProjectRolePresetSchema })),
9976
+ hirePresets: Schema_exports.optional(Schema_exports.Record({ key: Schema_exports.String, value: HirePresetSchema })),
9977
+ skillGroups: Schema_exports.optional(SkillGroupsSchema),
9978
+ defaults: Schema_exports.optional(ProjectDefaultsSchema)
9979
+ });
9980
+ var executableReason = (what) => `${what} \u0437\u0430\u0434\u0430\u0435\u0442 \u0442\u043E, \u0447\u0442\u043E \u043B\u0430\u0433\u0435\u0440\u044C \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0435\u0442, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0438\u0437 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E config`;
9981
+ var findProjectConfigForbiddenFields = (parsed) => {
9982
+ if (typeof parsed !== "object" || parsed === null) return [];
9983
+ const found = [];
9984
+ if (Reflect.get(parsed, "mcpServers") !== void 0) {
9985
+ found.push({ field: "mcpServers", reason: executableReason("\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 MCP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430") });
9986
+ }
9987
+ const defaults = Reflect.get(parsed, "defaults");
9988
+ if (typeof defaults === "object" && defaults !== null && Reflect.get(defaults, "readTools") !== void 0) {
9989
+ found.push({ field: "defaults.readTools", reason: executableReason("\u043A\u0430\u0442\u0430\u043B\u043E\u0433 \u0431\u0438\u043D\u0430\u0440\u0435\u0439") });
9990
+ }
9991
+ const roles = Reflect.get(parsed, "roles");
9992
+ if (typeof roles === "object" && roles !== null) {
9993
+ for (const [role, entry] of Object.entries(roles)) {
9994
+ if (typeof entry === "object" && entry !== null && Reflect.get(entry, "readTools") !== void 0) {
9995
+ found.push({
9996
+ field: `roles.${role}.readTools`,
9997
+ reason: executableReason("\u043A\u0430\u0442\u0430\u043B\u043E\u0433 \u0431\u0438\u043D\u0430\u0440\u0435\u0439 \u0440\u043E\u043B\u0438")
9998
+ });
9999
+ }
10000
+ }
10001
+ }
10002
+ return found;
10003
+ };
10004
+
10005
+ // packages/config/src/loaders/projectConfigLoader.ts
10006
+ var PROJECT_CONFIG_DIRECTORY = ".priiisk";
10007
+ var PROJECT_CONFIG_FILE = "config.toml";
10008
+ var projectConfigPath = (projectCwd) => join6(projectCwd, PROJECT_CONFIG_DIRECTORY, PROJECT_CONFIG_FILE);
10009
+ var decodeProjectConfig = Schema_exports.decodeUnknown(ProjectWorkerConfigSchema, {
10010
+ onExcessProperty: "error"
10011
+ });
10012
+ var loadProjectWorkerConfig = (fs, projectCwd) => Effect_exports.gen(function* () {
10013
+ const path = projectConfigPath(projectCwd);
10014
+ const raw3 = yield* fs.readFileString(path).pipe(
10015
+ Effect_exports.map((content) => content),
10016
+ Effect_exports.catchIf(
10017
+ (error) => error._tag === "SystemError" && error.reason === "NotFound",
10018
+ () => Effect_exports.succeed(void 0)
10019
+ ),
10020
+ Effect_exports.mapError((cause) => new WorkerConfigInvalidError({ path, message: String(cause) }))
10021
+ );
10022
+ if (raw3 === void 0) return void 0;
10023
+ const parsed = yield* Effect_exports.try({
10024
+ try: () => parse4(raw3),
10025
+ catch: (cause) => new WorkerConfigInvalidError({ path, message: `\u043D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u044B\u0439 TOML: ${String(cause)}` })
10026
+ });
10027
+ const forbidden = findProjectConfigForbiddenFields(parsed);
10028
+ if (forbidden.length > 0) {
10029
+ return yield* Effect_exports.fail(
10030
+ new WorkerConfigInvalidError({
10031
+ path,
10032
+ message: forbidden.map((entry) => `\u043F\u043E\u043B\u0435 ${entry.field} \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u043E \u0432 project config: ${entry.reason}`).join("; ")
10033
+ })
10034
+ );
10035
+ }
10036
+ return yield* decodeProjectConfig(parsed).pipe(
10037
+ Effect_exports.mapError(
10038
+ (parseError) => new WorkerConfigInvalidError({
10039
+ path,
10040
+ message: `\u043D\u0435 \u043F\u0440\u043E\u0448\u0435\u043B \u0441\u0445\u0435\u043C\u0443: ${String(parseError)}`
10041
+ })
10042
+ )
10043
+ );
10044
+ });
10045
+ var mergeRecords = (user, project, mergeEntry) => {
10046
+ if (project === void 0) return user;
10047
+ const merged = { ...user ?? {} };
10048
+ for (const [key, entry] of Object.entries(project)) {
10049
+ merged[key] = mergeEntry(user?.[key], entry);
10050
+ }
10051
+ return merged;
10052
+ };
10053
+ var mergeWorkerConfigs = (user, project) => {
10054
+ if (project === void 0) return user;
10055
+ const models = { ...user?.models ?? {}, ...project.models ?? {} };
10056
+ const defaults = {
10057
+ ...user?.defaults ?? {},
10058
+ ...project.defaults ?? {},
10059
+ ...user?.defaults?.readTools === void 0 ? {} : { readTools: user.defaults.readTools }
10060
+ };
10061
+ const roles = mergeRecords(user?.roles, project.roles, (userRole, projectRole) => ({
10062
+ ...userRole,
10063
+ ...projectRole,
10064
+ ...userRole?.readTools === void 0 ? {} : { readTools: userRole.readTools }
10065
+ }));
10066
+ const hirePresets = mergeRecords(
10067
+ user?.hirePresets,
10068
+ project.hirePresets,
10069
+ (userPreset, preset) => ({
10070
+ ...userPreset,
10071
+ ...preset
10072
+ })
10073
+ );
10074
+ const skillGroups = mergeRecords(user?.skillGroups, project.skillGroups, (_, groups) => groups);
10075
+ return {
10076
+ schemaVersion: 1,
10077
+ models,
10078
+ defaults,
10079
+ ...roles === void 0 ? {} : { roles },
10080
+ ...hirePresets === void 0 ? {} : { hirePresets },
10081
+ ...skillGroups === void 0 ? {} : { skillGroups },
10082
+ ...user?.mcpServers === void 0 ? {} : { mcpServers: user.mcpServers }
10083
+ };
10084
+ };
10085
+ var describeProjectConfigOverrides = (project) => [
10086
+ ...project.defaults === void 0 ? [] : ["defaults"],
10087
+ ...project.models === void 0 ? [] : Object.keys(project.models).map((n) => `models.${n}`),
10088
+ ...project.roles === void 0 ? [] : Object.keys(project.roles).map((n) => `roles.${n}`),
10089
+ ...project.hirePresets === void 0 ? [] : Object.keys(project.hirePresets).map((n) => `hirePresets.${n}`),
10090
+ ...project.skillGroups === void 0 ? [] : Object.keys(project.skillGroups).map((n) => `skillGroups.${n}`)
10091
+ ];
10092
+
10093
+ // packages/config/src/loaders/userStoragePreparation.ts
10094
+ import { dirname as dirname2 } from "node:path";
10095
+
9969
10096
  // packages/config/src/schema/workerConfig.ts
9970
10097
  var WorkerConfigSchema = Schema_exports.Struct({
9971
10098
  schemaVersion: Schema_exports.Literal(1),
@@ -9979,7 +10106,7 @@ var WorkerConfigSchema = Schema_exports.Struct({
9979
10106
 
9980
10107
  // packages/config/src/loaders/workerConfigLoader.ts
9981
10108
  var decodeWorkerConfig = Schema_exports.decodeUnknown(WorkerConfigSchema, { onExcessProperty: "error" });
9982
- var loadWorkerConfig = (fs) => Effect_exports.gen(function* () {
10109
+ var loadUserWorkerConfig = (fs) => Effect_exports.gen(function* () {
9983
10110
  const configPath = yield* resolveWorkerConfigPath;
9984
10111
  const raw3 = yield* fs.readFileString(configPath).pipe(
9985
10112
  Effect_exports.map((content) => content),
@@ -10010,19 +10137,25 @@ var loadWorkerConfig = (fs) => Effect_exports.gen(function* () {
10010
10137
  )
10011
10138
  );
10012
10139
  });
10140
+ var loadWorkerConfig = (fs, options4 = {}) => Effect_exports.gen(function* () {
10141
+ const user = yield* loadUserWorkerConfig(fs);
10142
+ const projectCwd = options4.projectCwd ?? (yield* resolveProjectScope.pipe(Effect_exports.map((scope3) => scope3.cwd)));
10143
+ const project = yield* loadProjectWorkerConfig(fs, projectCwd);
10144
+ return mergeWorkerConfigs(user, project);
10145
+ });
10013
10146
 
10014
10147
  // packages/config/src/project/roleProfile.ts
10015
10148
  import { tmpdir as tmpdir2 } from "node:os";
10016
10149
 
10017
10150
  // packages/config/src/project/runtimeAssets.ts
10018
10151
  import { existsSync as existsSync2 } from "node:fs";
10019
- import { dirname as dirname3, join as join6, parse as parse5 } from "node:path";
10152
+ import { dirname as dirname3, join as join7, parse as parse5 } from "node:path";
10020
10153
  import { fileURLToPath } from "node:url";
10021
10154
  var findAssetRoot = (moduleUrl, directoryName) => {
10022
10155
  const root = parse5(fileURLToPath(moduleUrl)).root;
10023
10156
  let current = dirname3(fileURLToPath(moduleUrl));
10024
10157
  for (; ; ) {
10025
- const candidate = join6(current, directoryName);
10158
+ const candidate = join7(current, directoryName);
10026
10159
  if (existsSync2(candidate)) return candidate;
10027
10160
  if (current === root) return candidate;
10028
10161
  current = dirname3(current);
@@ -10420,7 +10553,7 @@ var listWorkerModelCatalogEntries = (config) => {
10420
10553
 
10421
10554
  // packages/protocol/src/domain/protocolVersion.ts
10422
10555
  var PRIIISK_PROTOCOL_VERSION = "11";
10423
- var PRIIISK_PROTOCOL_PACKAGE_VERSION = "0.1.2";
10556
+ var PRIIISK_PROTOCOL_PACKAGE_VERSION = "0.1.3";
10424
10557
  var ProtocolVersionSchema = Schema_exports.String.pipe(Schema_exports.minLength(1));
10425
10558
 
10426
10559
  // packages/protocol/src/domain/protocolIdentifiers.ts
@@ -13295,7 +13428,7 @@ var CampProtocol = class extends RpcGroup_exports.make(
13295
13428
  };
13296
13429
 
13297
13430
  // packages/camp-state/src/bootstrap/campHostVersion.ts
13298
- var PRIIISK_HOST_VERSION = "0.1.2";
13431
+ var PRIIISK_HOST_VERSION = "0.1.3";
13299
13432
 
13300
13433
  // packages/surface/src/domain/surfaceModel.ts
13301
13434
  var NonEmptyString7 = Schema_exports.String.pipe(Schema_exports.minLength(1));
@@ -14091,7 +14224,7 @@ var launchCampPrepared = (surface, request, persistIntent, handshake, persist) =
14091
14224
 
14092
14225
  // packages/camp-state/src/history/campLegacyState.ts
14093
14226
  import { randomUUID as randomUUID4 } from "node:crypto";
14094
- import { join as join7 } from "node:path";
14227
+ import { join as join8 } from "node:path";
14095
14228
  var LEGACY_CAMP_MANIFEST_VERSION = 1;
14096
14229
  var CampLegacyStateErrorCode = {
14097
14230
  invalidManifest: "legacy_manifest_invalid",
@@ -14156,7 +14289,7 @@ var moveStateFile = (fs, source, destination, message) => fs.rename(source, dest
14156
14289
  );
14157
14290
  var quarantineLegacyCampState = (fs, paths) => Effect_exports.gen(function* () {
14158
14291
  const timestamp = yield* Clock_exports.currentTimeMillis;
14159
- const directory = join7(
14292
+ const directory = join8(
14160
14293
  paths.quarantineDir,
14161
14294
  `legacy-v${String(LEGACY_CAMP_MANIFEST_VERSION)}-${String(timestamp)}-${randomUUID4()}`
14162
14295
  );
@@ -14170,8 +14303,8 @@ var quarantineLegacyCampState = (fs, paths) => Effect_exports.gen(function* () {
14170
14303
  )
14171
14304
  )
14172
14305
  );
14173
- const manifestPath = join7(directory, "camp.json");
14174
- const healthPath = join7(directory, "health.json");
14306
+ const manifestPath = join8(directory, "camp.json");
14307
+ const healthPath = join8(directory, "health.json");
14175
14308
  const hasHealth = yield* fs.exists(paths.healthPath).pipe(
14176
14309
  Effect_exports.mapError(
14177
14310
  (cause) => legacyError(
@@ -14224,7 +14357,7 @@ var quarantineLegacyCampState = (fs, paths) => Effect_exports.gen(function* () {
14224
14357
  });
14225
14358
 
14226
14359
  // packages/camp-state/src/history/campRunCatalog.ts
14227
- import { join as join8 } from "node:path";
14360
+ import { join as join9 } from "node:path";
14228
14361
 
14229
14362
  // packages/camp-state/src/history/campRunCatalogModel.ts
14230
14363
  var CampRunCatalogErrorCode = {
@@ -14314,7 +14447,7 @@ var listCampRuns = (fs, project, paths) => Effect_exports.gen(function* () {
14314
14447
  );
14315
14448
  const historical = yield* Effect_exports.forEach(
14316
14449
  entries,
14317
- (entry) => loadCampManifest(fs, join8(paths.runsDir, entry, "camp.json")).pipe(
14450
+ (entry) => loadCampManifest(fs, join9(paths.runsDir, entry, "camp.json")).pipe(
14318
14451
  Effect_exports.mapError(
14319
14452
  (cause) => catalogError(
14320
14453
  "list",
@@ -14326,7 +14459,7 @@ var listCampRuns = (fs, project, paths) => Effect_exports.gen(function* () {
14326
14459
  Effect_exports.flatMap(
14327
14460
  Option_exports.match({
14328
14461
  onNone: () => Effect_exports.succeed(void 0),
14329
- onSome: (manifest) => campRunPaths(paths, manifest.runId).manifestPath !== join8(paths.runsDir, entry, "camp.json") ? Effect_exports.fail(
14462
+ onSome: (manifest) => campRunPaths(paths, manifest.runId).manifestPath !== join9(paths.runsDir, entry, "camp.json") ? Effect_exports.fail(
14330
14463
  catalogError(
14331
14464
  "list",
14332
14465
  CampRunCatalogErrorCode.nonCanonicalRun,
@@ -14638,13 +14771,16 @@ export {
14638
14771
  AgentRoleSchema,
14639
14772
  PiThinkingLevel,
14640
14773
  PiThinkingLevelSchema,
14774
+ projectConfigPath,
14775
+ loadProjectWorkerConfig,
14776
+ describeProjectConfigOverrides,
14777
+ projectScopeFromCwd,
14778
+ resolveProjectScopeSync,
14779
+ resolveProjectScope,
14641
14780
  loadWorkerConfig,
14642
14781
  PRIIISK_PI_AGENT_DIR_ENV,
14643
14782
  campRunPaths,
14644
14783
  campProjectPaths,
14645
- projectScopeFromCwd,
14646
- resolveProjectScopeSync,
14647
- resolveProjectScope,
14648
14784
  resolveRoleProfilePath,
14649
14785
  prepareCampStorage,
14650
14786
  prepareCampRunStorage,
@@ -20,7 +20,7 @@ import {
20
20
  layerNet,
21
21
  makeCampSurfaceName,
22
22
  resolveProjectScopeSync
23
- } from "./chunk-EBRDSFGF.js";
23
+ } from "./chunk-T6NUWP6F.js";
24
24
  import {
25
25
  Clock_exports,
26
26
  Config_exports,
@@ -111,7 +111,7 @@ var CliSurfaceSelectionError = class extends Data_exports.TaggedError("CliSurfac
111
111
  import { randomUUID } from "node:crypto";
112
112
 
113
113
  // packages/cli/src/domain/cliVersion.ts
114
- var PRIIISK_CLI_VERSION = "0.1.2";
114
+ var PRIIISK_CLI_VERSION = "0.1.3";
115
115
 
116
116
  // packages/cli/src/client/campRpcConnection.ts
117
117
  var PRIIISK_CONTROLLER_ID_ENV = "PRIIISK_CONTROLLER_ID";
@@ -4,7 +4,7 @@ const require = __priiiskCreateRequire(import.meta.url);
4
4
  import {
5
5
  NodeContext_exports,
6
6
  NodeRuntime_exports
7
- } from "./chunk-42LW4XTH.js";
7
+ } from "./chunk-C7GQZ3PV.js";
8
8
  import {
9
9
  CampUiBackendError,
10
10
  CampUiHealthStatus,
@@ -19,7 +19,7 @@ import {
19
19
  makePiTransportLayer,
20
20
  requirePiModelCatalog,
21
21
  require_undici
22
- } from "./chunk-FMIRO6TM.js";
22
+ } from "./chunk-GCJD6IMI.js";
23
23
  import {
24
24
  AgentRole,
25
25
  AgentRoleSchema,
@@ -96,7 +96,7 @@ import {
96
96
  runningCampManifest,
97
97
  saveCampHealth,
98
98
  saveCampManifest
99
- } from "./chunk-EBRDSFGF.js";
99
+ } from "./chunk-T6NUWP6F.js";
100
100
  import {
101
101
  CampAskRouter,
102
102
  CampCancellationCode,
@@ -22412,7 +22412,7 @@ var Client = class extends Protocol {
22412
22412
  };
22413
22413
 
22414
22414
  // packages/mcp-backend/src/connections/clientIdentity.ts
22415
- var backendVersion = "0.1.2";
22415
+ var backendVersion = "0.1.3";
22416
22416
 
22417
22417
  // packages/mcp-backend/src/connections/mcpFailure.ts
22418
22418
  var McpFailure = class extends Data_exports.TaggedError("McpFailure") {
@@ -26645,7 +26645,7 @@ var acquireLiveCampHost = (options = {}) => Effect_exports.gen(function* () {
26645
26645
  if (options.manifestRunId !== void 0) {
26646
26646
  yield* prepareCampRunStorage(fs, paths, options.manifestRunId);
26647
26647
  }
26648
- const config2 = yield* loadWorkerConfig(fs);
26648
+ const config2 = yield* loadWorkerConfig(fs, { projectCwd: project.cwd });
26649
26649
  const piResources = options.piResources ?? (yield* makePiOperatorResources(
26650
26650
  options.piAgentDir === void 0 ? {} : { agentDir: options.piAgentDir }
26651
26651
  ));
package/dist/priiisk.js CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  fromReadable,
6
6
  layer,
7
7
  runMain
8
- } from "./chunk-42LW4XTH.js";
8
+ } from "./chunk-C7GQZ3PV.js";
9
9
  import {
10
10
  CliCampLifecycleError,
11
11
  CliEquipmentConflict,
@@ -23,7 +23,7 @@ import {
23
23
  resolveCampSurface,
24
24
  withCampRpc,
25
25
  withCampRpcSession
26
- } from "./chunk-UDZECRNM.js";
26
+ } from "./chunk-VHGA3U67.js";
27
27
  import {
28
28
  CampCommandFailure,
29
29
  CampHostReadiness,
@@ -58,7 +58,7 @@ import {
58
58
  resolveProjectScopeSync,
59
59
  saveCampManifest,
60
60
  startingCampManifest
61
- } from "./chunk-EBRDSFGF.js";
61
+ } from "./chunk-T6NUWP6F.js";
62
62
  import {
63
63
  Cause_exports,
64
64
  CommitPrototype,
@@ -19976,7 +19976,7 @@ var rootCommand = Command_exports.make(
19976
19976
  ).pipe(Command_exports.withDescription("Runs and observes a camp of collaborating workers."));
19977
19977
 
19978
19978
  // packages/cli/src/commands/doctorCommand.ts
19979
- var runDoctorOnDemand = Effect_exports.promise(() => import("./chunk-AZ2OCIIG.js")).pipe(
19979
+ var runDoctorOnDemand = Effect_exports.promise(() => import("./chunk-4IQLMJ25.js")).pipe(
19980
19980
  Effect_exports.flatMap((doctor) => doctor.runDoctor)
19981
19981
  );
19982
19982
  var statusLabel = {
@@ -20672,7 +20672,7 @@ var command = rootCommand.pipe(
20672
20672
  );
20673
20673
  var cli = Command_exports.run(command, {
20674
20674
  name: "priiisk camp control",
20675
- version: "0.1.2"
20675
+ version: "0.1.3"
20676
20676
  });
20677
20677
  var runCliCommand = (argumentsList) => cli(argumentsList).pipe(
20678
20678
  Effect_exports.matchEffect({
package/package.json CHANGED
@@ -1,21 +1,21 @@
1
1
  {
2
2
  "name": "priiisk",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "CLI for running and observing a camp of collaborating agents",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "priiisk": "./dist/priiisk.js"
8
8
  },
9
9
  "files": [
10
- "dist/chunk-42LW4XTH.js",
11
- "dist/chunk-AZ2OCIIG.js",
12
- "dist/chunk-EBRDSFGF.js",
13
- "dist/chunk-EBRDSFGF.js.LEGAL.txt",
14
- "dist/chunk-FMIRO6TM.js",
15
- "dist/chunk-FMIRO6TM.js.LEGAL.txt",
10
+ "dist/chunk-4IQLMJ25.js",
11
+ "dist/chunk-C7GQZ3PV.js",
12
+ "dist/chunk-GCJD6IMI.js",
13
+ "dist/chunk-GCJD6IMI.js.LEGAL.txt",
16
14
  "dist/chunk-KFSFN6L5.js",
17
15
  "dist/chunk-PIZUXHCN.js",
18
- "dist/chunk-UDZECRNM.js",
16
+ "dist/chunk-T6NUWP6F.js",
17
+ "dist/chunk-T6NUWP6F.js.LEGAL.txt",
18
+ "dist/chunk-VHGA3U67.js",
19
19
  "dist/chunk-Z64QXV3O.js",
20
20
  "dist/priiisk-host.js",
21
21
  "dist/priiisk.js",