pi-shadow-mind 0.1.5
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/DESIGN.md +493 -0
- package/README.md +58 -0
- package/dist/config.d.ts +18 -0
- package/dist/config.js +132 -0
- package/dist/config.js.map +1 -0
- package/dist/entity-store.d.ts +22 -0
- package/dist/entity-store.js +71 -0
- package/dist/entity-store.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +8537 -0
- package/dist/index.js.map +7 -0
- package/dist/management-tools.d.ts +4 -0
- package/dist/management-tools.js +130 -0
- package/dist/management-tools.js.map +1 -0
- package/dist/protocol.d.ts +5 -0
- package/dist/protocol.js +34 -0
- package/dist/protocol.js.map +1 -0
- package/dist/random.d.ts +2 -0
- package/dist/random.js +14 -0
- package/dist/random.js.map +1 -0
- package/dist/registry.d.ts +9 -0
- package/dist/registry.js +139 -0
- package/dist/registry.js.map +1 -0
- package/dist/report-batcher.d.ts +15 -0
- package/dist/report-batcher.js +49 -0
- package/dist/report-batcher.js.map +1 -0
- package/dist/runtime.d.ts +36 -0
- package/dist/runtime.js +274 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scheduler.d.ts +10 -0
- package/dist/scheduler.js +46 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/shadow-runner.d.ts +93 -0
- package/dist/shadow-runner.js +251 -0
- package/dist/shadow-runner.js.map +1 -0
- package/dist/shutdown-drain.d.ts +12 -0
- package/dist/shutdown-drain.js +22 -0
- package/dist/shutdown-drain.js.map +1 -0
- package/dist/summaries.d.ts +9 -0
- package/dist/summaries.js +56 -0
- package/dist/summaries.js.map +1 -0
- package/dist/trajectory.d.ts +7 -0
- package/dist/trajectory.js +33 -0
- package/dist/trajectory.js.map +1 -0
- package/dist/types.d.ts +64 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +8 -0
- package/dist/validation.js +18 -0
- package/dist/validation.js.map +1 -0
- package/package.json +52 -0
package/dist/config.js
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { inRange, isFiniteNumber, isNonEmptyString, isThinkingLevel } from "./validation.js";
|
|
4
|
+
export const DEFAULT_CONFIG = {
|
|
5
|
+
heartbeatProbability: 1 / 3,
|
|
6
|
+
maxParallelShadows: 2,
|
|
7
|
+
defaultShadowTimeoutSeconds: 60,
|
|
8
|
+
headlessDrainTimeoutSeconds: 120,
|
|
9
|
+
resultBatchWindowMs: 400,
|
|
10
|
+
defaultThinkingLevel: "low",
|
|
11
|
+
};
|
|
12
|
+
export function parseConfig(input) {
|
|
13
|
+
if (input === null || typeof input !== "object" || Array.isArray(input)) {
|
|
14
|
+
throw new Error("config must be a JSON object");
|
|
15
|
+
}
|
|
16
|
+
const value = input;
|
|
17
|
+
const probability = numberInRange(value.heartbeat_probability, 0, 1, DEFAULT_CONFIG.heartbeatProbability, "heartbeat_probability");
|
|
18
|
+
const parallel = positiveInteger(value.max_parallel_shadows, DEFAULT_CONFIG.maxParallelShadows, "max_parallel_shadows");
|
|
19
|
+
const timeout = positiveNumber(value.default_shadow_timeout_seconds, DEFAULT_CONFIG.defaultShadowTimeoutSeconds, "default_shadow_timeout_seconds");
|
|
20
|
+
const drainTimeout = positiveNumber(value.headless_drain_timeout_seconds, DEFAULT_CONFIG.headlessDrainTimeoutSeconds, "headless_drain_timeout_seconds");
|
|
21
|
+
const windowMs = nonNegativeInteger(value.result_batch_window_ms, DEFAULT_CONFIG.resultBatchWindowMs, "result_batch_window_ms");
|
|
22
|
+
const model = optionalNonEmptyString(value.default_shadow_model, "default_shadow_model");
|
|
23
|
+
const randomSeed = optionalSeed(value.random_seed);
|
|
24
|
+
const thinking = value.default_thinking_level ?? DEFAULT_CONFIG.defaultThinkingLevel;
|
|
25
|
+
if (!isThinkingLevel(thinking)) {
|
|
26
|
+
throw new Error("default_thinking_level is invalid");
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
heartbeatProbability: probability,
|
|
30
|
+
maxParallelShadows: parallel,
|
|
31
|
+
defaultShadowTimeoutSeconds: timeout,
|
|
32
|
+
headlessDrainTimeoutSeconds: drainTimeout,
|
|
33
|
+
resultBatchWindowMs: windowMs,
|
|
34
|
+
defaultShadowModel: model,
|
|
35
|
+
defaultThinkingLevel: thinking,
|
|
36
|
+
randomSeed,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function serializeConfig(config) {
|
|
40
|
+
return `${JSON.stringify({
|
|
41
|
+
heartbeat_probability: config.heartbeatProbability,
|
|
42
|
+
max_parallel_shadows: config.maxParallelShadows,
|
|
43
|
+
default_shadow_timeout_seconds: config.defaultShadowTimeoutSeconds,
|
|
44
|
+
headless_drain_timeout_seconds: config.headlessDrainTimeoutSeconds,
|
|
45
|
+
result_batch_window_ms: config.resultBatchWindowMs,
|
|
46
|
+
...(config.defaultShadowModel ? { default_shadow_model: config.defaultShadowModel } : {}),
|
|
47
|
+
default_thinking_level: config.defaultThinkingLevel,
|
|
48
|
+
...(config.randomSeed !== undefined ? { random_seed: config.randomSeed } : {}),
|
|
49
|
+
}, null, 2)}\n`;
|
|
50
|
+
}
|
|
51
|
+
export class ConfigStore {
|
|
52
|
+
agentDir;
|
|
53
|
+
configPath;
|
|
54
|
+
lastGood = DEFAULT_CONFIG;
|
|
55
|
+
lastError;
|
|
56
|
+
constructor(agentDir) {
|
|
57
|
+
this.agentDir = agentDir;
|
|
58
|
+
this.configPath = join(agentDir, "shadow-minds", "config.json");
|
|
59
|
+
}
|
|
60
|
+
async initialize() {
|
|
61
|
+
await mkdir(dirname(this.configPath), { recursive: true });
|
|
62
|
+
try {
|
|
63
|
+
await readFile(this.configPath, "utf8");
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (error.code !== "ENOENT")
|
|
67
|
+
throw error;
|
|
68
|
+
await writeFile(this.configPath, serializeConfig(DEFAULT_CONFIG), "utf8");
|
|
69
|
+
}
|
|
70
|
+
await this.reload();
|
|
71
|
+
}
|
|
72
|
+
async reload() {
|
|
73
|
+
try {
|
|
74
|
+
const raw = await readFile(this.configPath, "utf8");
|
|
75
|
+
this.lastGood = parseConfig(JSON.parse(raw));
|
|
76
|
+
this.lastError = undefined;
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
this.lastError = error instanceof Error ? error.message : String(error);
|
|
80
|
+
}
|
|
81
|
+
return { config: this.lastGood, error: this.lastError };
|
|
82
|
+
}
|
|
83
|
+
get current() {
|
|
84
|
+
return this.lastGood;
|
|
85
|
+
}
|
|
86
|
+
get error() {
|
|
87
|
+
return this.lastError;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function numberInRange(value, min, max, fallback, name) {
|
|
91
|
+
if (value === undefined)
|
|
92
|
+
return fallback;
|
|
93
|
+
if (!isFiniteNumber(value) || !inRange(value, min, max))
|
|
94
|
+
throw new Error(`${name} must be between ${min} and ${max}`);
|
|
95
|
+
return value;
|
|
96
|
+
}
|
|
97
|
+
function positiveNumber(value, fallback, name) {
|
|
98
|
+
if (value === undefined)
|
|
99
|
+
return fallback;
|
|
100
|
+
if (!isFiniteNumber(value) || value <= 0)
|
|
101
|
+
throw new Error(`${name} must be positive`);
|
|
102
|
+
return value;
|
|
103
|
+
}
|
|
104
|
+
function positiveInteger(value, fallback, name) {
|
|
105
|
+
const parsed = positiveNumber(value, fallback, name);
|
|
106
|
+
if (!Number.isInteger(parsed))
|
|
107
|
+
throw new Error(`${name} must be an integer`);
|
|
108
|
+
return parsed;
|
|
109
|
+
}
|
|
110
|
+
function nonNegativeInteger(value, fallback, name) {
|
|
111
|
+
if (value === undefined)
|
|
112
|
+
return fallback;
|
|
113
|
+
if (!isFiniteNumber(value) || !Number.isInteger(value) || value < 0)
|
|
114
|
+
throw new Error(`${name} must be a non-negative integer`);
|
|
115
|
+
return value;
|
|
116
|
+
}
|
|
117
|
+
function optionalNonEmptyString(value, name) {
|
|
118
|
+
if (value === undefined)
|
|
119
|
+
return undefined;
|
|
120
|
+
if (!isNonEmptyString(value))
|
|
121
|
+
throw new Error(`${name} must be a non-empty string`);
|
|
122
|
+
return value.trim();
|
|
123
|
+
}
|
|
124
|
+
function optionalSeed(value) {
|
|
125
|
+
if (value === undefined)
|
|
126
|
+
return undefined;
|
|
127
|
+
if (!isFiniteNumber(value) || !Number.isInteger(value) || value < 0 || value > 0xffff_ffff) {
|
|
128
|
+
throw new Error("random_seed must be an integer between 0 and 4294967295");
|
|
129
|
+
}
|
|
130
|
+
return value;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ShadowRegistry } from "./registry.js";
|
|
2
|
+
import type { ShadowConfig, ShadowDefinition } from "./types.js";
|
|
3
|
+
export type ShadowDraft = Partial<Omit<ShadowDefinition, "filePath">> & {
|
|
4
|
+
id: string;
|
|
5
|
+
prompt?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare class EntityStore {
|
|
8
|
+
readonly registry: ShadowRegistry;
|
|
9
|
+
private readonly configPath;
|
|
10
|
+
constructor(registry: ShadowRegistry, configPath: string);
|
|
11
|
+
list(): Promise<ShadowDefinition[]>;
|
|
12
|
+
get(id: string): Promise<ShadowDefinition>;
|
|
13
|
+
create(draft: ShadowDraft): Promise<ShadowDefinition>;
|
|
14
|
+
update(id: string, patch: Partial<Omit<ShadowDraft, "id">>): Promise<ShadowDefinition>;
|
|
15
|
+
private writeParsed;
|
|
16
|
+
setEnabled(id: string, enabled: boolean): Promise<ShadowDefinition>;
|
|
17
|
+
delete(id: string): Promise<void>;
|
|
18
|
+
readConfig(): Promise<string>;
|
|
19
|
+
writeConfig(config: ShadowConfig): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export declare function serializeShadow(shadow: ShadowDraft): string;
|
|
22
|
+
export declare function describeShadow(shadow: ShadowDefinition): string;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { readFile, unlink, writeFile } from "node:fs/promises";
|
|
2
|
+
import { basename, join } from "node:path";
|
|
3
|
+
import YAML from "yaml";
|
|
4
|
+
import { serializeConfig } from "./config.js";
|
|
5
|
+
import { parseShadowMarkdown } from "./registry.js";
|
|
6
|
+
export class EntityStore {
|
|
7
|
+
registry;
|
|
8
|
+
configPath;
|
|
9
|
+
constructor(registry, configPath) {
|
|
10
|
+
this.registry = registry;
|
|
11
|
+
this.configPath = configPath;
|
|
12
|
+
}
|
|
13
|
+
async list() {
|
|
14
|
+
return (await this.registry.load()).shadows;
|
|
15
|
+
}
|
|
16
|
+
async get(id) {
|
|
17
|
+
const shadow = (await this.list()).find((candidate) => candidate.id === id);
|
|
18
|
+
if (!shadow)
|
|
19
|
+
throw new Error(`shadow not found: ${id}`);
|
|
20
|
+
return shadow;
|
|
21
|
+
}
|
|
22
|
+
async create(draft) {
|
|
23
|
+
if ((await this.list()).some((shadow) => shadow.id === draft.id))
|
|
24
|
+
throw new Error(`shadow already exists: ${draft.id}`);
|
|
25
|
+
return this.writeParsed(join(this.registry.directory, `${draft.id}.md`), draft, { overwrite: false });
|
|
26
|
+
}
|
|
27
|
+
async update(id, patch) {
|
|
28
|
+
const current = await this.get(id);
|
|
29
|
+
return this.writeParsed(current.filePath, { ...current, ...definedOnly(patch), id, prompt: patch.prompt ?? current.prompt }, { overwrite: true });
|
|
30
|
+
}
|
|
31
|
+
async writeParsed(filePath, draft, options) {
|
|
32
|
+
const source = serializeShadow({ ...draft, prompt: draft.prompt ?? "Describe this Shadow Mind's responsibility." });
|
|
33
|
+
const parsed = parseShadowMarkdown(source, filePath);
|
|
34
|
+
await writeFile(filePath, source, { encoding: "utf8", ...(options.overwrite ? {} : { flag: "wx" }) });
|
|
35
|
+
return parsed;
|
|
36
|
+
}
|
|
37
|
+
async setEnabled(id, enabled) {
|
|
38
|
+
return this.update(id, { enabled });
|
|
39
|
+
}
|
|
40
|
+
async delete(id) {
|
|
41
|
+
await unlink((await this.get(id)).filePath);
|
|
42
|
+
}
|
|
43
|
+
async readConfig() {
|
|
44
|
+
return readFile(this.configPath, "utf8");
|
|
45
|
+
}
|
|
46
|
+
async writeConfig(config) {
|
|
47
|
+
await writeFile(this.configPath, serializeConfig(config), "utf8");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export function serializeShadow(shadow) {
|
|
51
|
+
const frontmatter = {
|
|
52
|
+
id: shadow.id,
|
|
53
|
+
...(shadow.name !== undefined ? { name: shadow.name } : {}),
|
|
54
|
+
enabled: shadow.enabled ?? true,
|
|
55
|
+
debug: shadow.debug ?? false,
|
|
56
|
+
activation_probability: shadow.activationProbability ?? 0.3,
|
|
57
|
+
active_for_models: shadow.activeForModels ?? ["*"],
|
|
58
|
+
...(shadow.runWithModel ? { run_with_model: shadow.runWithModel } : {}),
|
|
59
|
+
...(shadow.thinkingLevel ? { thinking_level: shadow.thinkingLevel } : {}),
|
|
60
|
+
...(shadow.timeoutSeconds !== undefined ? { timeout_seconds: shadow.timeoutSeconds } : {}),
|
|
61
|
+
tools: shadow.tools ?? [],
|
|
62
|
+
};
|
|
63
|
+
return `---\n${YAML.stringify(frontmatter).trimEnd()}\n---\n\n${(shadow.prompt ?? "").trim()}\n`;
|
|
64
|
+
}
|
|
65
|
+
export function describeShadow(shadow) {
|
|
66
|
+
return `${shadow.enabled ? "enabled" : "disabled"} ${shadow.id} (${shadow.name}) p=${shadow.activationProbability} models=${shadow.activeForModels.join(",")} tools=${shadow.tools.join(",") || "default"} file=${basename(shadow.filePath)}`;
|
|
67
|
+
}
|
|
68
|
+
function definedOnly(value) {
|
|
69
|
+
return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined));
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=entity-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-store.js","sourceRoot":"","sources":["../src/entity-store.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED