@av-pi-studio/server 0.0.1
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 +411 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/agent/agent-manager.d.ts +107 -0
- package/dist/agent/agent-manager.d.ts.map +1 -0
- package/dist/agent/agent-manager.js +218 -0
- package/dist/agent/agent-manager.js.map +1 -0
- package/dist/agent/agent-service.d.ts +36 -0
- package/dist/agent/agent-service.d.ts.map +1 -0
- package/dist/agent/agent-service.js +195 -0
- package/dist/agent/agent-service.js.map +1 -0
- package/dist/agent/index.d.ts +17 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +18 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/manifest.d.ts +7 -0
- package/dist/agent/manifest.d.ts.map +1 -0
- package/dist/agent/manifest.js +27 -0
- package/dist/agent/manifest.js.map +1 -0
- package/dist/agent/mcp-server.d.ts +100 -0
- package/dist/agent/mcp-server.d.ts.map +1 -0
- package/dist/agent/mcp-server.js +163 -0
- package/dist/agent/mcp-server.js.map +1 -0
- package/dist/agent/permissions.d.ts +71 -0
- package/dist/agent/permissions.d.ts.map +1 -0
- package/dist/agent/permissions.js +132 -0
- package/dist/agent/permissions.js.map +1 -0
- package/dist/agent/provider-contract.d.ts +134 -0
- package/dist/agent/provider-contract.d.ts.map +1 -0
- package/dist/agent/provider-contract.js +2 -0
- package/dist/agent/provider-contract.js.map +1 -0
- package/dist/agent/provider-registry.d.ts +37 -0
- package/dist/agent/provider-registry.d.ts.map +1 -0
- package/dist/agent/provider-registry.js +92 -0
- package/dist/agent/provider-registry.js.map +1 -0
- package/dist/agent/provider-snapshot.d.ts +52 -0
- package/dist/agent/provider-snapshot.d.ts.map +1 -0
- package/dist/agent/provider-snapshot.js +73 -0
- package/dist/agent/provider-snapshot.js.map +1 -0
- package/dist/agent/providers/mock/mock-provider.d.ts +44 -0
- package/dist/agent/providers/mock/mock-provider.d.ts.map +1 -0
- package/dist/agent/providers/mock/mock-provider.js +162 -0
- package/dist/agent/providers/mock/mock-provider.js.map +1 -0
- package/dist/agent/providers/pi/agent.d.ts +80 -0
- package/dist/agent/providers/pi/agent.d.ts.map +1 -0
- package/dist/agent/providers/pi/agent.js +322 -0
- package/dist/agent/providers/pi/agent.js.map +1 -0
- package/dist/agent/providers/pi/event-mapper.d.ts +17 -0
- package/dist/agent/providers/pi/event-mapper.d.ts.map +1 -0
- package/dist/agent/providers/pi/event-mapper.js +150 -0
- package/dist/agent/providers/pi/event-mapper.js.map +1 -0
- package/dist/agent/providers/pi/rpc-transport.d.ts +53 -0
- package/dist/agent/providers/pi/rpc-transport.d.ts.map +1 -0
- package/dist/agent/providers/pi/rpc-transport.js +190 -0
- package/dist/agent/providers/pi/rpc-transport.js.map +1 -0
- package/dist/agent/providers/pi/session-hydration.d.ts +11 -0
- package/dist/agent/providers/pi/session-hydration.d.ts.map +1 -0
- package/dist/agent/providers/pi/session-hydration.js +167 -0
- package/dist/agent/providers/pi/session-hydration.js.map +1 -0
- package/dist/agent/rewind-rpc.d.ts +15 -0
- package/dist/agent/rewind-rpc.d.ts.map +1 -0
- package/dist/agent/rewind-rpc.js +30 -0
- package/dist/agent/rewind-rpc.js.map +1 -0
- package/dist/agent/session-operations.d.ts +32 -0
- package/dist/agent/session-operations.d.ts.map +1 -0
- package/dist/agent/session-operations.js +130 -0
- package/dist/agent/session-operations.js.map +1 -0
- package/dist/agent/structured-generation.d.ts +39 -0
- package/dist/agent/structured-generation.d.ts.map +1 -0
- package/dist/agent/structured-generation.js +78 -0
- package/dist/agent/structured-generation.js.map +1 -0
- package/dist/agent/timeline-rpc.d.ts +21 -0
- package/dist/agent/timeline-rpc.d.ts.map +1 -0
- package/dist/agent/timeline-rpc.js +59 -0
- package/dist/agent/timeline-rpc.js.map +1 -0
- package/dist/agent/timeline-store.d.ts +100 -0
- package/dist/agent/timeline-store.d.ts.map +1 -0
- package/dist/agent/timeline-store.js +255 -0
- package/dist/agent/timeline-store.js.map +1 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +3 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/password-auth.d.ts +44 -0
- package/dist/auth/password-auth.d.ts.map +1 -0
- package/dist/auth/password-auth.js +78 -0
- package/dist/auth/password-auth.js.map +1 -0
- package/dist/config/daemon-config.d.ts +634 -0
- package/dist/config/daemon-config.d.ts.map +1 -0
- package/dist/config/daemon-config.js +258 -0
- package/dist/config/daemon-config.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/project-config.d.ts +104 -0
- package/dist/config/project-config.d.ts.map +1 -0
- package/dist/config/project-config.js +106 -0
- package/dist/config/project-config.js.map +1 -0
- package/dist/daemon/bootstrap.d.ts +37 -0
- package/dist/daemon/bootstrap.d.ts.map +1 -0
- package/dist/daemon/bootstrap.js +448 -0
- package/dist/daemon/bootstrap.js.map +1 -0
- package/dist/daemon/dev-bootstrap.d.ts +14 -0
- package/dist/daemon/dev-bootstrap.d.ts.map +1 -0
- package/dist/daemon/dev-bootstrap.js +231 -0
- package/dist/daemon/dev-bootstrap.js.map +1 -0
- package/dist/daemon/dev-main.d.ts +3 -0
- package/dist/daemon/dev-main.d.ts.map +1 -0
- package/dist/daemon/dev-main.js +36 -0
- package/dist/daemon/dev-main.js.map +1 -0
- package/dist/daemon/index.d.ts +15 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +21 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/main.d.ts +3 -0
- package/dist/daemon/main.d.ts.map +1 -0
- package/dist/daemon/main.js +29 -0
- package/dist/daemon/main.js.map +1 -0
- package/dist/daemon/orchestration-rpc.d.ts +19 -0
- package/dist/daemon/orchestration-rpc.d.ts.map +1 -0
- package/dist/daemon/orchestration-rpc.js +136 -0
- package/dist/daemon/orchestration-rpc.js.map +1 -0
- package/dist/files/download-token-store.d.ts +14 -0
- package/dist/files/download-token-store.d.ts.map +1 -0
- package/dist/files/download-token-store.js +33 -0
- package/dist/files/download-token-store.js.map +1 -0
- package/dist/files/file-explorer.d.ts +54 -0
- package/dist/files/file-explorer.d.ts.map +1 -0
- package/dist/files/file-explorer.js +182 -0
- package/dist/files/file-explorer.js.map +1 -0
- package/dist/files/file-transfer.d.ts +30 -0
- package/dist/files/file-transfer.d.ts.map +1 -0
- package/dist/files/file-transfer.js +132 -0
- package/dist/files/file-transfer.js.map +1 -0
- package/dist/files/index.d.ts +4 -0
- package/dist/files/index.d.ts.map +1 -0
- package/dist/files/index.js +5 -0
- package/dist/files/index.js.map +1 -0
- package/dist/http/host-allowlist.d.ts +15 -0
- package/dist/http/host-allowlist.d.ts.map +1 -0
- package/dist/http/host-allowlist.js +52 -0
- package/dist/http/host-allowlist.js.map +1 -0
- package/dist/http/http-server.d.ts +27 -0
- package/dist/http/http-server.d.ts.map +1 -0
- package/dist/http/http-server.js +76 -0
- package/dist/http/http-server.js.map +1 -0
- package/dist/http/index.d.ts +3 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +4 -0
- package/dist/http/index.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/index.d.ts +2 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +2 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.d.ts +48 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +53 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/orchestration/chat-service.d.ts +61 -0
- package/dist/orchestration/chat-service.d.ts.map +1 -0
- package/dist/orchestration/chat-service.js +156 -0
- package/dist/orchestration/chat-service.js.map +1 -0
- package/dist/orchestration/cron.d.ts +30 -0
- package/dist/orchestration/cron.d.ts.map +1 -0
- package/dist/orchestration/cron.js +136 -0
- package/dist/orchestration/cron.js.map +1 -0
- package/dist/orchestration/index.d.ts +5 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +6 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/loop-service.d.ts +129 -0
- package/dist/orchestration/loop-service.d.ts.map +1 -0
- package/dist/orchestration/loop-service.js +234 -0
- package/dist/orchestration/loop-service.js.map +1 -0
- package/dist/orchestration/schedule-service.d.ts +65 -0
- package/dist/orchestration/schedule-service.d.ts.map +1 -0
- package/dist/orchestration/schedule-service.js +201 -0
- package/dist/orchestration/schedule-service.js.map +1 -0
- package/dist/persistence/atomic-store.d.ts +45 -0
- package/dist/persistence/atomic-store.d.ts.map +1 -0
- package/dist/persistence/atomic-store.js +92 -0
- package/dist/persistence/atomic-store.js.map +1 -0
- package/dist/persistence/entity-schemas.d.ts +1707 -0
- package/dist/persistence/entity-schemas.d.ts.map +1 -0
- package/dist/persistence/entity-schemas.js +250 -0
- package/dist/persistence/entity-schemas.js.map +1 -0
- package/dist/persistence/entity-stores.d.ts +46 -0
- package/dist/persistence/entity-stores.d.ts.map +1 -0
- package/dist/persistence/entity-stores.js +167 -0
- package/dist/persistence/entity-stores.js.map +1 -0
- package/dist/persistence/index.d.ts +4 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +5 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/projects/checkout-diff-manager.d.ts +44 -0
- package/dist/projects/checkout-diff-manager.d.ts.map +1 -0
- package/dist/projects/checkout-diff-manager.js +82 -0
- package/dist/projects/checkout-diff-manager.js.map +1 -0
- package/dist/projects/git-checkout-rpc.d.ts +18 -0
- package/dist/projects/git-checkout-rpc.d.ts.map +1 -0
- package/dist/projects/git-checkout-rpc.js +57 -0
- package/dist/projects/git-checkout-rpc.js.map +1 -0
- package/dist/projects/git-detect.d.ts +21 -0
- package/dist/projects/git-detect.d.ts.map +1 -0
- package/dist/projects/git-detect.js +34 -0
- package/dist/projects/git-detect.js.map +1 -0
- package/dist/projects/git-operations.d.ts +67 -0
- package/dist/projects/git-operations.d.ts.map +1 -0
- package/dist/projects/git-operations.js +200 -0
- package/dist/projects/git-operations.js.map +1 -0
- package/dist/projects/github-service.d.ts +80 -0
- package/dist/projects/github-service.d.ts.map +1 -0
- package/dist/projects/github-service.js +172 -0
- package/dist/projects/github-service.js.map +1 -0
- package/dist/projects/index.d.ts +13 -0
- package/dist/projects/index.d.ts.map +1 -0
- package/dist/projects/index.js +19 -0
- package/dist/projects/index.js.map +1 -0
- package/dist/projects/open-project.d.ts +35 -0
- package/dist/projects/open-project.d.ts.map +1 -0
- package/dist/projects/open-project.js +106 -0
- package/dist/projects/open-project.js.map +1 -0
- package/dist/projects/reconciliation.d.ts +15 -0
- package/dist/projects/reconciliation.d.ts.map +1 -0
- package/dist/projects/reconciliation.js +63 -0
- package/dist/projects/reconciliation.js.map +1 -0
- package/dist/projects/status-projection.d.ts +33 -0
- package/dist/projects/status-projection.d.ts.map +1 -0
- package/dist/projects/status-projection.js +98 -0
- package/dist/projects/status-projection.js.map +1 -0
- package/dist/projects/workspace-activity.d.ts +28 -0
- package/dist/projects/workspace-activity.d.ts.map +1 -0
- package/dist/projects/workspace-activity.js +74 -0
- package/dist/projects/workspace-activity.js.map +1 -0
- package/dist/projects/workspace-git-service.d.ts +27 -0
- package/dist/projects/workspace-git-service.d.ts.map +1 -0
- package/dist/projects/workspace-git-service.js +60 -0
- package/dist/projects/workspace-git-service.js.map +1 -0
- package/dist/projects/workspace-registry.d.ts +59 -0
- package/dist/projects/workspace-registry.d.ts.map +1 -0
- package/dist/projects/workspace-registry.js +149 -0
- package/dist/projects/workspace-registry.js.map +1 -0
- package/dist/projects/worktree-service.d.ts +100 -0
- package/dist/projects/worktree-service.d.ts.map +1 -0
- package/dist/projects/worktree-service.js +216 -0
- package/dist/projects/worktree-service.js.map +1 -0
- package/dist/proxy/index.d.ts +4 -0
- package/dist/proxy/index.d.ts.map +1 -0
- package/dist/proxy/index.js +5 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/service-hostname.d.ts +21 -0
- package/dist/proxy/service-hostname.d.ts.map +1 -0
- package/dist/proxy/service-hostname.js +44 -0
- package/dist/proxy/service-hostname.js.map +1 -0
- package/dist/proxy/service-port-registry.d.ts +36 -0
- package/dist/proxy/service-port-registry.d.ts.map +1 -0
- package/dist/proxy/service-port-registry.js +55 -0
- package/dist/proxy/service-port-registry.js.map +1 -0
- package/dist/proxy/service-proxy.d.ts +34 -0
- package/dist/proxy/service-proxy.d.ts.map +1 -0
- package/dist/proxy/service-proxy.js +54 -0
- package/dist/proxy/service-proxy.js.map +1 -0
- package/dist/terminal/index.d.ts +4 -0
- package/dist/terminal/index.d.ts.map +1 -0
- package/dist/terminal/index.js +5 -0
- package/dist/terminal/index.js.map +1 -0
- package/dist/terminal/pty-backend.d.ts +44 -0
- package/dist/terminal/pty-backend.d.ts.map +1 -0
- package/dist/terminal/pty-backend.js +119 -0
- package/dist/terminal/pty-backend.js.map +1 -0
- package/dist/terminal/screen-buffer.d.ts +21 -0
- package/dist/terminal/screen-buffer.d.ts.map +1 -0
- package/dist/terminal/screen-buffer.js +55 -0
- package/dist/terminal/screen-buffer.js.map +1 -0
- package/dist/terminal/terminal-manager.d.ts +79 -0
- package/dist/terminal/terminal-manager.d.ts.map +1 -0
- package/dist/terminal/terminal-manager.js +174 -0
- package/dist/terminal/terminal-manager.js.map +1 -0
- package/dist/terminal/terminal-rpc.d.ts +20 -0
- package/dist/terminal/terminal-rpc.d.ts.map +1 -0
- package/dist/terminal/terminal-rpc.js +122 -0
- package/dist/terminal/terminal-rpc.js.map +1 -0
- package/dist/util/concurrency.d.ts +16 -0
- package/dist/util/concurrency.d.ts.map +1 -0
- package/dist/util/concurrency.js +23 -0
- package/dist/util/concurrency.js.map +1 -0
- package/dist/util/index.d.ts +2 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +2 -0
- package/dist/util/index.js.map +1 -0
- package/dist/ws/capability-store.d.ts +11 -0
- package/dist/ws/capability-store.d.ts.map +1 -0
- package/dist/ws/capability-store.js +10 -0
- package/dist/ws/capability-store.js.map +1 -0
- package/dist/ws/index.d.ts +5 -0
- package/dist/ws/index.d.ts.map +1 -0
- package/dist/ws/index.js +6 -0
- package/dist/ws/index.js.map +1 -0
- package/dist/ws/router.d.ts +34 -0
- package/dist/ws/router.d.ts.map +1 -0
- package/dist/ws/router.js +97 -0
- package/dist/ws/router.js.map +1 -0
- package/dist/ws/session.d.ts +28 -0
- package/dist/ws/session.d.ts.map +1 -0
- package/dist/ws/session.js +36 -0
- package/dist/ws/session.js.map +1 -0
- package/dist/ws/ws-server.d.ts +41 -0
- package/dist/ws/ws-server.d.ts.map +1 -0
- package/dist/ws/ws-server.js +104 -0
- package/dist/ws/ws-server.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
/**
|
|
5
|
+
* Daemon config (`$PI_STUDIO_HOME/config.json`) — architecture/config.md § Daemon config,
|
|
6
|
+
* § Env precedence, § Behavior; MAIN-SCOPE.md §6.
|
|
7
|
+
*
|
|
8
|
+
* Every field is optional with a sensible default, so a missing or `{}` config yields a fully
|
|
9
|
+
* populated object. Legacy shapes (`allowedHosts`, provider `command:{mode,…}`) are normalized
|
|
10
|
+
* inline on load (no migration framework). Environment variables overlay the parsed config (env
|
|
11
|
+
* wins) for the keys enumerated in config.md.
|
|
12
|
+
*/
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Provider overrides (agents.providers.{id})
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/** Provider ids: `/^[a-z][a-z0-9-]*$/`. */
|
|
17
|
+
export const providerIdSchema = z.string().regex(/^[a-z][a-z0-9-]*$/, "invalid provider id");
|
|
18
|
+
/** A custom Pi-compatible provider profile, or an override of the built-in `pi` provider. */
|
|
19
|
+
export const providerOverrideSchema = z.object({
|
|
20
|
+
extends: z.literal("pi").optional(),
|
|
21
|
+
label: z.string().optional(),
|
|
22
|
+
description: z.string().optional(),
|
|
23
|
+
command: z.array(z.string()).optional(),
|
|
24
|
+
env: z.record(z.string(), z.string()).optional(),
|
|
25
|
+
params: z.record(z.string(), z.unknown()).optional(),
|
|
26
|
+
models: z.array(z.unknown()).optional(),
|
|
27
|
+
additionalModels: z.array(z.unknown()).optional(),
|
|
28
|
+
disallowedTools: z.array(z.string()).optional(),
|
|
29
|
+
enabled: z.boolean().optional(),
|
|
30
|
+
order: z.number().optional(),
|
|
31
|
+
});
|
|
32
|
+
/** The only built-in provider id; everything else under `agents.providers` is a custom profile. */
|
|
33
|
+
const BUILTIN_PROVIDER_IDS = new Set(["pi"]);
|
|
34
|
+
/**
|
|
35
|
+
* `agents.providers` map. Keys must match the provider-id pattern. A *custom* profile (any id other
|
|
36
|
+
* than a built-in) must declare `extends:"pi"` and a `label`; overriding the built-in `pi` does not.
|
|
37
|
+
*/
|
|
38
|
+
export const providersRecordSchema = z
|
|
39
|
+
.record(providerIdSchema, providerOverrideSchema)
|
|
40
|
+
.superRefine((record, ctx) => {
|
|
41
|
+
for (const [id, override] of Object.entries(record)) {
|
|
42
|
+
if (BUILTIN_PROVIDER_IDS.has(id))
|
|
43
|
+
continue;
|
|
44
|
+
if (override.extends !== "pi") {
|
|
45
|
+
ctx.addIssue({
|
|
46
|
+
code: z.ZodIssueCode.custom,
|
|
47
|
+
message: `custom provider "${id}" must set extends:"pi"`,
|
|
48
|
+
path: [id, "extends"],
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (!override.label) {
|
|
52
|
+
ctx.addIssue({
|
|
53
|
+
code: z.ZodIssueCode.custom,
|
|
54
|
+
message: `custom provider "${id}" must set a label`,
|
|
55
|
+
path: [id, "label"],
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
export const metadataGenerationProviderSchema = z.object({
|
|
61
|
+
provider: z.string(),
|
|
62
|
+
model: z.string().optional(),
|
|
63
|
+
thinkingOptionId: z.string().optional(),
|
|
64
|
+
});
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// PersistedConfigSchema
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
const hostnamesSchema = z.union([z.literal(true), z.array(z.string())]);
|
|
69
|
+
export const persistedConfigSchema = z
|
|
70
|
+
.object({
|
|
71
|
+
version: z.number().default(1),
|
|
72
|
+
daemon: z
|
|
73
|
+
.object({
|
|
74
|
+
listen: z.string().default("127.0.0.1:6767"),
|
|
75
|
+
hostnames: hostnamesSchema.default(["localhost", "*.localhost"]),
|
|
76
|
+
mcp: z
|
|
77
|
+
.object({
|
|
78
|
+
enabled: z.boolean().default(true),
|
|
79
|
+
injectIntoAgents: z.boolean().default(true),
|
|
80
|
+
})
|
|
81
|
+
.default({}),
|
|
82
|
+
appendSystemPrompt: z.string().default(""),
|
|
83
|
+
cors: z.object({ allowedOrigins: z.array(z.string()).default([]) }).default({}),
|
|
84
|
+
relay: z
|
|
85
|
+
.object({
|
|
86
|
+
enabled: z.boolean().default(false),
|
|
87
|
+
endpoint: z.string().optional(),
|
|
88
|
+
publicEndpoint: z.string().optional(),
|
|
89
|
+
useTls: z.boolean().default(false),
|
|
90
|
+
publicUseTls: z.boolean().default(false),
|
|
91
|
+
})
|
|
92
|
+
.default({}),
|
|
93
|
+
auth: z.object({ password: z.string().optional() }).default({}),
|
|
94
|
+
serviceProxy: z
|
|
95
|
+
.object({
|
|
96
|
+
listen: z.string().optional(),
|
|
97
|
+
publicBaseUrl: z.string().optional(),
|
|
98
|
+
enabled: z.boolean().optional(),
|
|
99
|
+
})
|
|
100
|
+
.default({}),
|
|
101
|
+
})
|
|
102
|
+
.default({}),
|
|
103
|
+
app: z.object({ baseUrl: z.string().optional() }).default({}),
|
|
104
|
+
worktrees: z.object({ root: z.string().optional() }).default({}),
|
|
105
|
+
providers: z
|
|
106
|
+
.object({ local: z.object({ modelsDir: z.string().optional() }).default({}) })
|
|
107
|
+
.default({}),
|
|
108
|
+
agents: z
|
|
109
|
+
.object({
|
|
110
|
+
providers: providersRecordSchema.default({}),
|
|
111
|
+
metadataGeneration: z
|
|
112
|
+
.object({ providers: z.array(metadataGenerationProviderSchema).default([]) })
|
|
113
|
+
.default({}),
|
|
114
|
+
})
|
|
115
|
+
.default({}),
|
|
116
|
+
log: z
|
|
117
|
+
.object({
|
|
118
|
+
level: z.string().default("info"),
|
|
119
|
+
format: z.string().default("json"),
|
|
120
|
+
console: z.record(z.string(), z.unknown()).default({}),
|
|
121
|
+
file: z
|
|
122
|
+
.object({
|
|
123
|
+
level: z.string().optional(),
|
|
124
|
+
path: z.string().optional(),
|
|
125
|
+
rotate: z
|
|
126
|
+
.object({ maxSize: z.string().optional(), maxFiles: z.number().optional() })
|
|
127
|
+
.default({}),
|
|
128
|
+
})
|
|
129
|
+
.default({}),
|
|
130
|
+
})
|
|
131
|
+
.default({}),
|
|
132
|
+
})
|
|
133
|
+
.default({});
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
// Legacy normalization (inline; no migration framework)
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
/**
|
|
138
|
+
* Migrate a legacy provider override. The old `command` was an object `{ mode, command?, args? }`;
|
|
139
|
+
* the current shape is a `string[]`. The `mode` wrapper is dropped (rpc is implicit).
|
|
140
|
+
*
|
|
141
|
+
* COMPAT(legacy-provider-command): inline; remove when no config.json carries the object form.
|
|
142
|
+
*/
|
|
143
|
+
function migrateProviderSettings(value) {
|
|
144
|
+
if (!value || typeof value !== "object")
|
|
145
|
+
return value;
|
|
146
|
+
const override = { ...value };
|
|
147
|
+
const command = override.command;
|
|
148
|
+
if (command && !Array.isArray(command) && typeof command === "object") {
|
|
149
|
+
const legacy = command;
|
|
150
|
+
const base = typeof legacy.command === "string"
|
|
151
|
+
? [legacy.command]
|
|
152
|
+
: Array.isArray(legacy.command)
|
|
153
|
+
? legacy.command
|
|
154
|
+
: [];
|
|
155
|
+
const args = Array.isArray(legacy.args) ? legacy.args : [];
|
|
156
|
+
const merged = [...base, ...args].filter((part) => typeof part === "string");
|
|
157
|
+
if (merged.length > 0)
|
|
158
|
+
override.command = merged;
|
|
159
|
+
else
|
|
160
|
+
delete override.command;
|
|
161
|
+
}
|
|
162
|
+
return override;
|
|
163
|
+
}
|
|
164
|
+
/** Normalize a raw config object before schema validation. */
|
|
165
|
+
export function migrateConfig(raw) {
|
|
166
|
+
const root = { ...raw };
|
|
167
|
+
const daemon = { ...root.daemon };
|
|
168
|
+
// COMPAT(legacy-allowed-hosts): `allowedHosts` → `hostnames` (daemon-level or top-level).
|
|
169
|
+
if (daemon.hostnames === undefined) {
|
|
170
|
+
if (daemon.allowedHosts !== undefined)
|
|
171
|
+
daemon.hostnames = daemon.allowedHosts;
|
|
172
|
+
else if (root.allowedHosts !== undefined)
|
|
173
|
+
daemon.hostnames = root.allowedHosts;
|
|
174
|
+
}
|
|
175
|
+
delete daemon.allowedHosts;
|
|
176
|
+
delete root.allowedHosts;
|
|
177
|
+
root.daemon = daemon;
|
|
178
|
+
const agents = { ...root.agents };
|
|
179
|
+
const providers = agents.providers;
|
|
180
|
+
if (providers && typeof providers === "object" && !Array.isArray(providers)) {
|
|
181
|
+
const migrated = {};
|
|
182
|
+
for (const [id, override] of Object.entries(providers)) {
|
|
183
|
+
migrated[id] = migrateProviderSettings(override);
|
|
184
|
+
}
|
|
185
|
+
agents.providers = migrated;
|
|
186
|
+
}
|
|
187
|
+
if (Object.keys(agents).length > 0)
|
|
188
|
+
root.agents = agents;
|
|
189
|
+
return root;
|
|
190
|
+
}
|
|
191
|
+
function envBool(value) {
|
|
192
|
+
const v = value.trim().toLowerCase();
|
|
193
|
+
return v === "1" || v === "true" || v === "yes" || v === "on";
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Overlay environment variables onto a parsed config (env wins) for the keys enumerated in
|
|
197
|
+
* config.md § Env precedence.
|
|
198
|
+
*/
|
|
199
|
+
export function overlayEnv(config, env) {
|
|
200
|
+
const next = structuredClone(config);
|
|
201
|
+
if (env.PI_STUDIO_LISTEN)
|
|
202
|
+
next.daemon.listen = env.PI_STUDIO_LISTEN;
|
|
203
|
+
if (env.PI_STUDIO_PASSWORD)
|
|
204
|
+
next.daemon.auth.password = env.PI_STUDIO_PASSWORD;
|
|
205
|
+
if (env.PI_STUDIO_HOSTNAMES !== undefined) {
|
|
206
|
+
const raw = env.PI_STUDIO_HOSTNAMES.trim();
|
|
207
|
+
next.daemon.hostnames =
|
|
208
|
+
raw.toLowerCase() === "true"
|
|
209
|
+
? true
|
|
210
|
+
: raw
|
|
211
|
+
.split(",")
|
|
212
|
+
.map((h) => h.trim())
|
|
213
|
+
.filter((h) => h.length > 0);
|
|
214
|
+
}
|
|
215
|
+
if (env.PI_STUDIO_RELAY_ENDPOINT)
|
|
216
|
+
next.daemon.relay.endpoint = env.PI_STUDIO_RELAY_ENDPOINT;
|
|
217
|
+
if (env.PI_STUDIO_RELAY_PUBLIC_ENDPOINT) {
|
|
218
|
+
next.daemon.relay.publicEndpoint = env.PI_STUDIO_RELAY_PUBLIC_ENDPOINT;
|
|
219
|
+
}
|
|
220
|
+
if (env.PI_STUDIO_RELAY_USE_TLS !== undefined) {
|
|
221
|
+
next.daemon.relay.useTls = envBool(env.PI_STUDIO_RELAY_USE_TLS);
|
|
222
|
+
}
|
|
223
|
+
if (env.PI_STUDIO_RELAY_PUBLIC_USE_TLS !== undefined) {
|
|
224
|
+
next.daemon.relay.publicUseTls = envBool(env.PI_STUDIO_RELAY_PUBLIC_USE_TLS);
|
|
225
|
+
}
|
|
226
|
+
if (env.PI_STUDIO_SERVICE_PROXY_LISTEN) {
|
|
227
|
+
next.daemon.serviceProxy.listen = env.PI_STUDIO_SERVICE_PROXY_LISTEN;
|
|
228
|
+
}
|
|
229
|
+
if (env.PI_STUDIO_SERVICE_PROXY_PUBLIC_BASE_URL) {
|
|
230
|
+
next.daemon.serviceProxy.publicBaseUrl = env.PI_STUDIO_SERVICE_PROXY_PUBLIC_BASE_URL;
|
|
231
|
+
}
|
|
232
|
+
if (env.PI_STUDIO_SERVICE_PROXY_ENABLED !== undefined) {
|
|
233
|
+
next.daemon.serviceProxy.enabled = envBool(env.PI_STUDIO_SERVICE_PROXY_ENABLED);
|
|
234
|
+
}
|
|
235
|
+
return next;
|
|
236
|
+
}
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
// loadConfig
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
/**
|
|
241
|
+
* Load and normalize `config.json`: read JSON (or `{}` when missing/corrupt), migrate legacy
|
|
242
|
+
* shapes, validate with {@link persistedConfigSchema}, then overlay env vars. Throws if the parsed
|
|
243
|
+
* config is structurally invalid (e.g. a bad provider id or a custom provider missing extends/label).
|
|
244
|
+
*/
|
|
245
|
+
export function loadConfig(path, env = process.env) {
|
|
246
|
+
let raw = {};
|
|
247
|
+
if (existsSync(path)) {
|
|
248
|
+
try {
|
|
249
|
+
raw = JSON.parse(readFileSync(path, "utf8"));
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
raw = {};
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
const parsed = persistedConfigSchema.parse(migrateConfig(raw));
|
|
256
|
+
return overlayEnv(parsed, env);
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=daemon-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-config.js","sourceRoot":"","sources":["../../src/config/daemon-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AACA,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* A named script entry. `command` is required; `type:"service"` flags it for the service proxy.
|
|
4
|
+
* Extra fields are tolerated (full script-entry schema is TODO(verify)).
|
|
5
|
+
*/
|
|
6
|
+
export declare const scriptEntrySchema: z.ZodObject<{
|
|
7
|
+
type: z.ZodOptional<z.ZodString>;
|
|
8
|
+
command: z.ZodString;
|
|
9
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
10
|
+
type: z.ZodOptional<z.ZodString>;
|
|
11
|
+
command: z.ZodString;
|
|
12
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
13
|
+
type: z.ZodOptional<z.ZodString>;
|
|
14
|
+
command: z.ZodString;
|
|
15
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
16
|
+
export type ScriptEntry = z.infer<typeof scriptEntrySchema>;
|
|
17
|
+
/** True when a script should be registered with the service proxy. */
|
|
18
|
+
export declare function isServiceScript(entry: ScriptEntry): boolean;
|
|
19
|
+
export declare const piStudioConfigSchema: z.ZodObject<{
|
|
20
|
+
worktree: z.ZodDefault<z.ZodEffects<z.ZodObject<{
|
|
21
|
+
setup: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
|
|
22
|
+
teardown: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
|
|
23
|
+
}, "strip", z.ZodTypeAny, {
|
|
24
|
+
setup?: string | string[] | undefined;
|
|
25
|
+
teardown?: string | string[] | undefined;
|
|
26
|
+
}, {
|
|
27
|
+
setup?: string | string[] | undefined;
|
|
28
|
+
teardown?: string | string[] | undefined;
|
|
29
|
+
}>, {
|
|
30
|
+
setup: string[];
|
|
31
|
+
teardown: string[];
|
|
32
|
+
}, {
|
|
33
|
+
setup?: string | string[] | undefined;
|
|
34
|
+
teardown?: string | string[] | undefined;
|
|
35
|
+
}>>;
|
|
36
|
+
scripts: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
37
|
+
type: z.ZodOptional<z.ZodString>;
|
|
38
|
+
command: z.ZodString;
|
|
39
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
40
|
+
type: z.ZodOptional<z.ZodString>;
|
|
41
|
+
command: z.ZodString;
|
|
42
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
43
|
+
type: z.ZodOptional<z.ZodString>;
|
|
44
|
+
command: z.ZodString;
|
|
45
|
+
}, z.ZodTypeAny, "passthrough">>>>;
|
|
46
|
+
instructions: z.ZodOptional<z.ZodString>;
|
|
47
|
+
}, "strip", z.ZodTypeAny, {
|
|
48
|
+
worktree: {
|
|
49
|
+
setup: string[];
|
|
50
|
+
teardown: string[];
|
|
51
|
+
};
|
|
52
|
+
scripts: Record<string, z.objectOutputType<{
|
|
53
|
+
type: z.ZodOptional<z.ZodString>;
|
|
54
|
+
command: z.ZodString;
|
|
55
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
56
|
+
instructions?: string | undefined;
|
|
57
|
+
}, {
|
|
58
|
+
worktree?: {
|
|
59
|
+
setup?: string | string[] | undefined;
|
|
60
|
+
teardown?: string | string[] | undefined;
|
|
61
|
+
} | undefined;
|
|
62
|
+
scripts?: Record<string, z.objectInputType<{
|
|
63
|
+
type: z.ZodOptional<z.ZodString>;
|
|
64
|
+
command: z.ZodString;
|
|
65
|
+
}, z.ZodTypeAny, "passthrough">> | undefined;
|
|
66
|
+
instructions?: string | undefined;
|
|
67
|
+
}>;
|
|
68
|
+
export type PiStudioConfig = z.infer<typeof piStudioConfigSchema>;
|
|
69
|
+
/** Parse + normalize a raw `pi-studio.json` document. Throws on invalid input. */
|
|
70
|
+
export declare function normalizeProjectConfig(raw: unknown): PiStudioConfig;
|
|
71
|
+
/** Revision token of a `pi-studio.json` (content hash). `null` means "no file on disk". */
|
|
72
|
+
export declare const piStudioConfigRevisionSchema: z.ZodNullable<z.ZodString>;
|
|
73
|
+
export type PiStudioConfigRevision = z.infer<typeof piStudioConfigRevisionSchema>;
|
|
74
|
+
export type ProjectConfigWriteError = "project_not_found" | "invalid_project_config" | "stale_project_config" | "write_failed";
|
|
75
|
+
/** Compute the revision token for the given file contents (sha256 hex). */
|
|
76
|
+
export declare function computeRevision(contents: string): string;
|
|
77
|
+
export interface ReadProjectConfigResult {
|
|
78
|
+
config: PiStudioConfig;
|
|
79
|
+
/** `null` when no `pi-studio.json` exists (project has no per-project config yet). */
|
|
80
|
+
revision: PiStudioConfigRevision;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Read + normalize `pi-studio.json`. A missing file yields the default (empty) config with a `null`
|
|
84
|
+
* revision; corrupt/invalid JSON yields defaults too (read is lenient — the write path enforces
|
|
85
|
+
* validity).
|
|
86
|
+
*/
|
|
87
|
+
export declare function readProjectConfig(path: string): Promise<ReadProjectConfigResult>;
|
|
88
|
+
export type WriteProjectConfigResult = {
|
|
89
|
+
ok: true;
|
|
90
|
+
revision: string;
|
|
91
|
+
config: PiStudioConfig;
|
|
92
|
+
} | {
|
|
93
|
+
ok: false;
|
|
94
|
+
error: ProjectConfigWriteError;
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Write `pi-studio.json` under the optimistic-concurrency revision model. Returns a typed error:
|
|
98
|
+
* - `project_not_found` — the project root directory does not exist.
|
|
99
|
+
* - `invalid_project_config` — `newConfig` fails schema validation.
|
|
100
|
+
* - `stale_project_config` — the on-disk file changed since `expectedRevision` was read.
|
|
101
|
+
* - `write_failed` — the filesystem write threw.
|
|
102
|
+
*/
|
|
103
|
+
export declare function writeProjectConfig(path: string, newConfig: unknown, expectedRevision: PiStudioConfigRevision): Promise<WriteProjectConfigResult>;
|
|
104
|
+
//# sourceMappingURL=project-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/config/project-config.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2BxB;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;gCAKd,CAAC;AACjB,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE3D;AAED,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,kFAAkF;AAClF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CAEnE;AAMD,2FAA2F;AAC3F,eAAO,MAAM,4BAA4B,4BAAwB,CAAC;AAClE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,MAAM,MAAM,uBAAuB,GAC/B,mBAAmB,GACnB,wBAAwB,GACxB,sBAAsB,GACtB,cAAc,CAAC;AAEnB,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD;AAOD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,cAAc,CAAC;IACvB,sFAAsF;IACtF,QAAQ,EAAE,sBAAsB,CAAC;CAClC;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAUtF;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACtD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,uBAAuB,CAAA;CAAE,CAAC;AAElD;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,OAAO,EAClB,gBAAgB,EAAE,sBAAsB,GACvC,OAAO,CAAC,wBAAwB,CAAC,CAgBnC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
4
|
+
import { dirname } from "node:path";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
/**
|
|
7
|
+
* Per-project `pi-studio.json` config — architecture/config.md § Per-project config,
|
|
8
|
+
* features/worktrees.md § Lifecycle config, features/service-proxy.md § Triggering.
|
|
9
|
+
*
|
|
10
|
+
* Holds worktree lifecycle commands (`setup`/`teardown`) and named `scripts` (a `type:"service"`
|
|
11
|
+
* script is proxied). A stale-write revision model guards concurrent edits.
|
|
12
|
+
*/
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Schema + normalization
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/** Normalize a `string | string[] | undefined` command list: split to array, drop blanks. */
|
|
17
|
+
function toCommandList(value) {
|
|
18
|
+
const list = value === undefined ? [] : Array.isArray(value) ? value : [value];
|
|
19
|
+
return list.map((entry) => entry.trim()).filter((entry) => entry.length > 0);
|
|
20
|
+
}
|
|
21
|
+
const commandsInputSchema = z.union([z.string(), z.array(z.string())]).optional();
|
|
22
|
+
/** Worktree lifecycle block — `setup`/`teardown` normalized to deduped command arrays. */
|
|
23
|
+
const worktreeConfigSchema = z
|
|
24
|
+
.object({ setup: commandsInputSchema, teardown: commandsInputSchema })
|
|
25
|
+
.transform((w) => ({ setup: toCommandList(w.setup), teardown: toCommandList(w.teardown) }));
|
|
26
|
+
/**
|
|
27
|
+
* A named script entry. `command` is required; `type:"service"` flags it for the service proxy.
|
|
28
|
+
* Extra fields are tolerated (full script-entry schema is TODO(verify)).
|
|
29
|
+
*/
|
|
30
|
+
export const scriptEntrySchema = z
|
|
31
|
+
.object({
|
|
32
|
+
type: z.string().optional(),
|
|
33
|
+
command: z.string(),
|
|
34
|
+
})
|
|
35
|
+
.passthrough();
|
|
36
|
+
/** True when a script should be registered with the service proxy. */
|
|
37
|
+
export function isServiceScript(entry) {
|
|
38
|
+
return entry.type === "service";
|
|
39
|
+
}
|
|
40
|
+
export const piStudioConfigSchema = z.object({
|
|
41
|
+
worktree: worktreeConfigSchema.default({}),
|
|
42
|
+
scripts: z.record(z.string(), scriptEntrySchema).default({}),
|
|
43
|
+
instructions: z.string().optional(),
|
|
44
|
+
});
|
|
45
|
+
/** Parse + normalize a raw `pi-studio.json` document. Throws on invalid input. */
|
|
46
|
+
export function normalizeProjectConfig(raw) {
|
|
47
|
+
return piStudioConfigSchema.parse(raw ?? {});
|
|
48
|
+
}
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Revision / stale-write model
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
/** Revision token of a `pi-studio.json` (content hash). `null` means "no file on disk". */
|
|
53
|
+
export const piStudioConfigRevisionSchema = z.string().nullable();
|
|
54
|
+
/** Compute the revision token for the given file contents (sha256 hex). */
|
|
55
|
+
export function computeRevision(contents) {
|
|
56
|
+
return createHash("sha256").update(contents).digest("hex");
|
|
57
|
+
}
|
|
58
|
+
async function currentRevision(path) {
|
|
59
|
+
if (!existsSync(path))
|
|
60
|
+
return null;
|
|
61
|
+
return computeRevision(await readFile(path, "utf8"));
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Read + normalize `pi-studio.json`. A missing file yields the default (empty) config with a `null`
|
|
65
|
+
* revision; corrupt/invalid JSON yields defaults too (read is lenient — the write path enforces
|
|
66
|
+
* validity).
|
|
67
|
+
*/
|
|
68
|
+
export async function readProjectConfig(path) {
|
|
69
|
+
if (!existsSync(path))
|
|
70
|
+
return { config: normalizeProjectConfig({}), revision: null };
|
|
71
|
+
const contents = await readFile(path, "utf8");
|
|
72
|
+
let parsed;
|
|
73
|
+
try {
|
|
74
|
+
parsed = normalizeProjectConfig(JSON.parse(contents));
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
parsed = normalizeProjectConfig({});
|
|
78
|
+
}
|
|
79
|
+
return { config: parsed, revision: computeRevision(contents) };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Write `pi-studio.json` under the optimistic-concurrency revision model. Returns a typed error:
|
|
83
|
+
* - `project_not_found` — the project root directory does not exist.
|
|
84
|
+
* - `invalid_project_config` — `newConfig` fails schema validation.
|
|
85
|
+
* - `stale_project_config` — the on-disk file changed since `expectedRevision` was read.
|
|
86
|
+
* - `write_failed` — the filesystem write threw.
|
|
87
|
+
*/
|
|
88
|
+
export async function writeProjectConfig(path, newConfig, expectedRevision) {
|
|
89
|
+
if (!existsSync(dirname(path)))
|
|
90
|
+
return { ok: false, error: "project_not_found" };
|
|
91
|
+
const parsed = piStudioConfigSchema.safeParse(newConfig);
|
|
92
|
+
if (!parsed.success)
|
|
93
|
+
return { ok: false, error: "invalid_project_config" };
|
|
94
|
+
const onDisk = await currentRevision(path);
|
|
95
|
+
if (expectedRevision !== onDisk)
|
|
96
|
+
return { ok: false, error: "stale_project_config" };
|
|
97
|
+
try {
|
|
98
|
+
const contents = `${JSON.stringify(newConfig, null, 2)}\n`;
|
|
99
|
+
await writeFile(path, contents, "utf8");
|
|
100
|
+
return { ok: true, revision: computeRevision(contents), config: parsed.data };
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return { ok: false, error: "write_failed" };
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=project-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-config.js","sourceRoot":"","sources":["../../src/config/project-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Server as HttpServer } from "node:http";
|
|
2
|
+
export interface DaemonOptions {
|
|
3
|
+
host: string;
|
|
4
|
+
port: number;
|
|
5
|
+
/** Overrides `PI_STUDIO_HOME` (defaults to `~/.pi-studio`). */
|
|
6
|
+
home?: string;
|
|
7
|
+
/** Overrides the config path (defaults to `<home>/config.json`). */
|
|
8
|
+
configPath?: string;
|
|
9
|
+
serverId?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface DaemonHandle {
|
|
12
|
+
httpServer: HttpServer;
|
|
13
|
+
serverId: string;
|
|
14
|
+
home: string;
|
|
15
|
+
provider: string;
|
|
16
|
+
close(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Every WS client only routes bare top-level frames it recognizes (`status`/`ping`/`pong`/
|
|
20
|
+
* `session`) — `DaemonClient.handleTextFrame`'s `default:` case silently drops anything else,
|
|
21
|
+
* including unwrapped fan-out messages like `{ type: "terminals_update", ... }`. Call sites across
|
|
22
|
+
* the daemon send plain "session update" objects (`agent_update`, `workspace_update`,
|
|
23
|
+
* `terminals_update`, …) expecting them to reach `onSessionMessage` subscribers, so `broadcast`
|
|
24
|
+
* wraps every message in the `session` envelope through this helper. A few call sites already
|
|
25
|
+
* wrap manually (`{ type: "session", message: event }`) — passed through as-is, never
|
|
26
|
+
* double-wrapped.
|
|
27
|
+
*/
|
|
28
|
+
export declare function wrapSessionEnvelope(message: unknown): {
|
|
29
|
+
type: "session";
|
|
30
|
+
message: unknown;
|
|
31
|
+
} | unknown;
|
|
32
|
+
/**
|
|
33
|
+
* Start the real production daemon. Returns a handle exposing the HTTP server, serverId, and a
|
|
34
|
+
* `close()` for graceful shutdown.
|
|
35
|
+
*/
|
|
36
|
+
export declare function startDaemon(opts: DaemonOptions): DaemonHandle;
|
|
37
|
+
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/daemon/bootstrap.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAyCtD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAmCD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAIrG;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,CAwY7D"}
|