@iniesta8888/agent-live 0.3.0
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/CODE_OF_CONDUCT.md +7 -0
- package/CONTRIBUTING.md +56 -0
- package/LICENSE +21 -0
- package/README.md +92 -0
- package/SECURITY.md +13 -0
- package/dist/adapter-sdk/index.d.ts +45 -0
- package/dist/adapter-sdk/index.d.ts.map +1 -0
- package/dist/adapter-sdk/index.js +106 -0
- package/dist/adapter-sdk/index.js.map +1 -0
- package/dist/content/compiler.d.ts +31 -0
- package/dist/content/compiler.d.ts.map +1 -0
- package/dist/content/compiler.js +218 -0
- package/dist/content/compiler.js.map +1 -0
- package/dist/content/graph-validator.d.ts +56 -0
- package/dist/content/graph-validator.d.ts.map +1 -0
- package/dist/content/graph-validator.js +226 -0
- package/dist/content/graph-validator.js.map +1 -0
- package/dist/content/library.d.ts +4 -0
- package/dist/content/library.d.ts.map +1 -0
- package/dist/content/library.js +45 -0
- package/dist/content/library.js.map +1 -0
- package/dist/content/registry.d.ts +34 -0
- package/dist/content/registry.d.ts.map +1 -0
- package/dist/content/registry.js +130 -0
- package/dist/content/registry.js.map +1 -0
- package/dist/content/runtime-content.d.ts +63 -0
- package/dist/content/runtime-content.d.ts.map +1 -0
- package/dist/content/runtime-content.js +78 -0
- package/dist/content/runtime-content.js.map +1 -0
- package/dist/content/schema.d.ts +142 -0
- package/dist/content/schema.d.ts.map +1 -0
- package/dist/content/schema.js +280 -0
- package/dist/content/schema.js.map +1 -0
- package/dist/content/validator.d.ts +35 -0
- package/dist/content/validator.d.ts.map +1 -0
- package/dist/content/validator.js +205 -0
- package/dist/content/validator.js.map +1 -0
- package/dist/core/agents.d.ts +56 -0
- package/dist/core/agents.d.ts.map +1 -0
- package/dist/core/agents.js +148 -0
- package/dist/core/agents.js.map +1 -0
- package/dist/core/limits.d.ts +15 -0
- package/dist/core/limits.d.ts.map +1 -0
- package/dist/core/limits.js +16 -0
- package/dist/core/limits.js.map +1 -0
- package/dist/core/mapping.d.ts +17 -0
- package/dist/core/mapping.d.ts.map +1 -0
- package/dist/core/mapping.js +94 -0
- package/dist/core/mapping.js.map +1 -0
- package/dist/core/protocol.d.ts +105 -0
- package/dist/core/protocol.d.ts.map +1 -0
- package/dist/core/protocol.js +6 -0
- package/dist/core/protocol.js.map +1 -0
- package/dist/core/state.d.ts +49 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +216 -0
- package/dist/core/state.js.map +1 -0
- package/dist/creator/commands.d.ts +19 -0
- package/dist/creator/commands.d.ts.map +1 -0
- package/dist/creator/commands.js +44 -0
- package/dist/creator/commands.js.map +1 -0
- package/dist/creator/mode.d.ts +10 -0
- package/dist/creator/mode.d.ts.map +1 -0
- package/dist/creator/mode.js +23 -0
- package/dist/creator/mode.js.map +1 -0
- package/dist/creator/service.d.ts +199 -0
- package/dist/creator/service.d.ts.map +1 -0
- package/dist/creator/service.js +159 -0
- package/dist/creator/service.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/agent-live-runtime.d.ts +17 -0
- package/dist/runtime/agent-live-runtime.d.ts.map +1 -0
- package/dist/runtime/agent-live-runtime.js +50 -0
- package/dist/runtime/agent-live-runtime.js.map +1 -0
- package/dist/runtime/content-service.d.ts +75 -0
- package/dist/runtime/content-service.d.ts.map +1 -0
- package/dist/runtime/content-service.js +60 -0
- package/dist/runtime/content-service.js.map +1 -0
- package/dist/runtime/resource-guard.d.ts +17 -0
- package/dist/runtime/resource-guard.d.ts.map +1 -0
- package/dist/runtime/resource-guard.js +54 -0
- package/dist/runtime/resource-guard.js.map +1 -0
- package/dist/runtime/server.d.ts +39 -0
- package/dist/runtime/server.d.ts.map +1 -0
- package/dist/runtime/server.js +286 -0
- package/dist/runtime/server.js.map +1 -0
- package/dist/web/app.d.ts +1 -0
- package/dist/web/app.js +1317 -0
- package/dist/web/index.html +45 -0
- package/dist/web/office.js +350 -0
- package/dist/web/sprites.js +185 -0
- package/dist/web/style.css +288 -0
- package/dist/web/v2/bootstrap.js +276 -0
- package/dist/web/v2/content/README.md +17 -0
- package/dist/web/v2/content/agent-skins/studio-team.json +33 -0
- package/dist/web/v2/content/agent-skins/tiny-developers.json +33 -0
- package/dist/web/v2/content/atmospheres/default.json +13 -0
- package/dist/web/v2/content/atmospheres/rainy-night.json +37 -0
- package/dist/web/v2/content/catalog.json +14 -0
- package/dist/web/v2/content/component-library/activity-implementations.json +873 -0
- package/dist/web/v2/content/component-library/activity-recipes.json +25 -0
- package/dist/web/v2/content/component-library/agent-profile-templates.json +18 -0
- package/dist/web/v2/content/component-library/catalog.json +38 -0
- package/dist/web/v2/content/component-library/npc-templates.json +42 -0
- package/dist/web/v2/content/component-library/props.json +41 -0
- package/dist/web/v2/content/environments/local-office.json +31 -0
- package/dist/web/v2/content/environments/rainy-night.json +28 -0
- package/dist/web/v2/content/environments/static-office.json +27 -0
- package/dist/web/v2/content/layouts/boardroom-office.json +122 -0
- package/dist/web/v2/content/layouts/demo-office.json +88 -0
- package/dist/web/v2/content/layouts/lively-office.json +96 -0
- package/dist/web/v2/content/layouts/old-school-office.json +154 -0
- package/dist/web/v2/content/layouts/tech-open-office.json +132 -0
- package/dist/web/v2/content/life-activities/boardroom-routines.json +67 -0
- package/dist/web/v2/content/life-activities/none.json +10 -0
- package/dist/web/v2/content/life-activities/office-basics.json +39 -0
- package/dist/web/v2/content/life-activities/old-school-routines.json +74 -0
- package/dist/web/v2/content/life-activities/tech-office-routines.json +148 -0
- package/dist/web/v2/content/npcs/boardroom-staff.json +54 -0
- package/dist/web/v2/content/npcs/none.json +10 -0
- package/dist/web/v2/content/npcs/office-staff.json +25 -0
- package/dist/web/v2/content/npcs/old-school-staff.json +39 -0
- package/dist/web/v2/content/npcs/tech-office-staff.json +40 -0
- package/dist/web/v2/content/official-offices/boardroom-office.json +25 -0
- package/dist/web/v2/content/official-offices/old-school-office.json +25 -0
- package/dist/web/v2/content/official-offices/tech-open-office.json +25 -0
- package/dist/web/v2/content/presets/boardroom-office.json +21 -0
- package/dist/web/v2/content/presets/cozy-studio.json +19 -0
- package/dist/web/v2/content/presets/demo-office.json +19 -0
- package/dist/web/v2/content/presets/lively-office.json +19 -0
- package/dist/web/v2/content/presets/night-shift.json +19 -0
- package/dist/web/v2/content/presets/old-school-office.json +20 -0
- package/dist/web/v2/content/presets/refined-demo.json +20 -0
- package/dist/web/v2/content/presets/tech-open-office.json +21 -0
- package/dist/web/v2/content/props/default-office.json +23 -0
- package/dist/web/v2/content/props/extended-office.json +39 -0
- package/dist/web/v2/content/props/tech-office.json +28 -0
- package/dist/web/v2/content/styles/pixel-classic.json +160 -0
- package/dist/web/v2/content/styles/warm-studio.json +150 -0
- package/dist/web/v2/environment-runtime.d.ts +1 -0
- package/dist/web/v2/environment-runtime.js +138 -0
- package/dist/web/v2/graph-validator.d.ts +55 -0
- package/dist/web/v2/graph-validator.js +225 -0
- package/dist/web/v2/i18n.js +54 -0
- package/dist/web/v2/locales/en.json +209 -0
- package/dist/web/v2/locales/zh-CN.json +52 -0
- package/dist/web/v2/office-engine.d.ts +1 -0
- package/dist/web/v2/office-engine.js +145 -0
- package/dist/web/v2/office-renderer.d.ts +1 -0
- package/dist/web/v2/office-renderer.js +843 -0
- package/dist/web/v2/parity.html +10 -0
- package/dist/web/v2/parity.js +82 -0
- package/dist/web/v2/sprite-renderer.d.ts +1 -0
- package/dist/web/v2/sprite-renderer.js +242 -0
- package/dist/web/v2/static-content.js +48 -0
- package/dist/web/v2/style.css +140 -0
- package/dist/web/v2.html +68 -0
- package/docs/ADAPTER-DEVELOPMENT.md +328 -0
- package/docs/ADAPTER-SDK.md +109 -0
- package/docs/ARCHITECTURE.md +223 -0
- package/docs/COMPONENT-LIBRARY.md +212 -0
- package/docs/CUSTOMIZATION.md +163 -0
- package/docs/DEVELOPER.md +186 -0
- package/docs/DSH-ADAPTER-DESIGN.md +173 -0
- package/docs/OFFICE-THEMES.md +516 -0
- package/docs/PRESET-CONFIG.md +460 -0
- package/docs/RELEASE-CHECK.md +23 -0
- package/docs/TECHNICAL.md +515 -0
- package/docs/USING-CODEX.md +24 -0
- package/docs/USING-DSH.md +44 -0
- package/docs/USING-PI.md +50 -0
- package/docs/VISION.md +146 -0
- package/examples/adapter/local-office.mjs +52 -0
- package/package.json +89 -0
- package/skills/agent-live-adapter-builder/SKILL.md +30 -0
- package/skills/agent-live-adapter-builder/agents/openai.yaml +4 -0
- package/skills/agent-live-adapter-builder/references/investigation.md +9 -0
- package/skills/agent-live-adapter-builder/references/review.md +7 -0
- package/skills/agent-live-adapter-builder/scripts/create-adapter.mjs +26 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structural rules for a renderable content graph — the single source of truth.
|
|
3
|
+
*
|
|
4
|
+
* Two consumers share this module:
|
|
5
|
+
* - the browser imports the generated `web/v2/graph-validator.js`
|
|
6
|
+
* (see `tsconfig.web-validator.json` and `scripts/web-validator.mjs`);
|
|
7
|
+
* - the local server imports the TypeScript module directly, so the same rules
|
|
8
|
+
* gate saving an Office Spec and serving `/api/office-content`.
|
|
9
|
+
*
|
|
10
|
+
* Keep this file dependency-free, platform-neutral, and side-effect-free: it is
|
|
11
|
+
* compiled for the browser and bundled into every host integration.
|
|
12
|
+
*/
|
|
13
|
+
/** Capabilities every layout must expose as a walkable work station. */
|
|
14
|
+
export declare const WORK_CAPABILITIES: readonly ["research", "create", "compute", "plan", "communicate", "collaborate"];
|
|
15
|
+
/** Renderer-resolved destinations that deliberately do not belong to a layout. */
|
|
16
|
+
export declare const DYNAMIC_ACTIVITY_TARGETS: Set<string>;
|
|
17
|
+
export interface ContentIssue {
|
|
18
|
+
code: string;
|
|
19
|
+
path: string;
|
|
20
|
+
message: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* What an activity needs to be staged: a named prop instance, or a capability
|
|
24
|
+
* any matching prop type can provide. The named form is the legacy syntax;
|
|
25
|
+
* capability requirements let the same implementation be reused across layouts
|
|
26
|
+
* and stop a prop swap from satisfying an activity by id alone.
|
|
27
|
+
*/
|
|
28
|
+
export type ActivityRequirement = string | {
|
|
29
|
+
prop: string;
|
|
30
|
+
} | {
|
|
31
|
+
capability: string;
|
|
32
|
+
};
|
|
33
|
+
export interface ResolvedRequirements {
|
|
34
|
+
/** Resolved instance id per requirement, aligned by index; null when unresolved. */
|
|
35
|
+
bindings: (string | null)[];
|
|
36
|
+
issues: ContentIssue[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Resolves activity requirements against the props actually present, so both
|
|
40
|
+
* syntaxes stay valid while content migrates.
|
|
41
|
+
*/
|
|
42
|
+
export declare function resolveActivityRequirements(requires: readonly unknown[] | undefined, instances: Iterable<readonly [string, string]>, capabilitiesOf: (type: string) => readonly string[], activity: string): ResolvedRequirements;
|
|
43
|
+
export declare function assertManifest(value: unknown, kind: string): void;
|
|
44
|
+
/**
|
|
45
|
+
* Layout structure rules. `propTypeNames` are the type names a layout may
|
|
46
|
+
* reference; the library stores props namespaced while the rendered graph does
|
|
47
|
+
* not, so both callers normalize before calling.
|
|
48
|
+
*/
|
|
49
|
+
export declare function layoutIssues(layout: any, propTypeNames: Iterable<string>): ContentIssue[];
|
|
50
|
+
/** Every reason the browser would refuse to render this resolved content graph. */
|
|
51
|
+
export declare function graphIssues(content: any): ContentIssue[];
|
|
52
|
+
/** Browser entry point: refuse the first structural problem, exactly as rendered. */
|
|
53
|
+
export declare function validateRegistry(content: unknown): void;
|
|
54
|
+
/** Server entry point: report every problem at once for the Creator surface. */
|
|
55
|
+
export declare function graphIssueMessages(content: unknown): string[];
|
|
56
|
+
//# sourceMappingURL=graph-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-validator.d.ts","sourceRoot":"","sources":["../../plugins/agent-live/src/content/graph-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,wEAAwE;AACxE,eAAO,MAAM,iBAAiB,kFAAmF,CAAC;AAElH,kFAAkF;AAClF,eAAO,MAAM,wBAAwB,aAA8B,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAErF,MAAM,WAAW,oBAAoB;IACpC,oFAAoF;IACpF,QAAQ,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IAC5B,MAAM,EAAE,YAAY,EAAE,CAAC;CACvB;AAQD;;;GAGG;AACH,wBAAgB,2BAA2B,CAC1C,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,EACxC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC9C,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,EACnD,QAAQ,EAAE,MAAM,GACd,oBAAoB,CAyBtB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAKjE;AAoBD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,YAAY,EAAE,CA+BzF;AAED,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG,YAAY,EAAE,CAqExD;AAED,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAGvD;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAE7D"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structural rules for a renderable content graph — the single source of truth.
|
|
3
|
+
*
|
|
4
|
+
* Two consumers share this module:
|
|
5
|
+
* - the browser imports the generated `web/v2/graph-validator.js`
|
|
6
|
+
* (see `tsconfig.web-validator.json` and `scripts/web-validator.mjs`);
|
|
7
|
+
* - the local server imports the TypeScript module directly, so the same rules
|
|
8
|
+
* gate saving an Office Spec and serving `/api/office-content`.
|
|
9
|
+
*
|
|
10
|
+
* Keep this file dependency-free, platform-neutral, and side-effect-free: it is
|
|
11
|
+
* compiled for the browser and bundled into every host integration.
|
|
12
|
+
*/
|
|
13
|
+
/** Capabilities every layout must expose as a walkable work station. */
|
|
14
|
+
export const WORK_CAPABILITIES = ["research", "create", "compute", "plan", "communicate", "collaborate"];
|
|
15
|
+
/** Renderer-resolved destinations that deliberately do not belong to a layout. */
|
|
16
|
+
export const DYNAMIC_ACTIVITY_TARGETS = new Set(["near-colleague"]);
|
|
17
|
+
function namedInstance(requirement) {
|
|
18
|
+
if (typeof requirement === "string")
|
|
19
|
+
return requirement;
|
|
20
|
+
if (requirement && typeof requirement.prop === "string")
|
|
21
|
+
return requirement.prop;
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Resolves activity requirements against the props actually present, so both
|
|
26
|
+
* syntaxes stay valid while content migrates.
|
|
27
|
+
*/
|
|
28
|
+
export function resolveActivityRequirements(requires, instances, capabilitiesOf, activity) {
|
|
29
|
+
const table = [...instances];
|
|
30
|
+
const bindings = [];
|
|
31
|
+
const issues = [];
|
|
32
|
+
for (const requirement of requires ?? []) {
|
|
33
|
+
const named = namedInstance(requirement);
|
|
34
|
+
if (named !== undefined) {
|
|
35
|
+
const present = table.some(([instanceId]) => instanceId === named);
|
|
36
|
+
bindings.push(present ? named : null);
|
|
37
|
+
if (!present)
|
|
38
|
+
issues.push({ code: "missing-activity-prop", path: "$", message: `${activity} 缺少 Prop:${named}` });
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const capability = requirement && typeof requirement.capability === "string"
|
|
42
|
+
? requirement.capability
|
|
43
|
+
: undefined;
|
|
44
|
+
if (!capability) {
|
|
45
|
+
bindings.push(null);
|
|
46
|
+
issues.push({ code: "invalid-activity-requirement", path: "$", message: `${activity} 的依赖必须是具名道具或能力需求` });
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const match = table.find(([, type]) => capabilitiesOf(type).includes(capability));
|
|
50
|
+
bindings.push(match ? match[0] : null);
|
|
51
|
+
if (!match)
|
|
52
|
+
issues.push({ code: "missing-activity-capability", path: "$", message: `${activity} 需要 ${capability} 能力,当前办公室没有提供该能力的道具` });
|
|
53
|
+
}
|
|
54
|
+
return { bindings, issues };
|
|
55
|
+
}
|
|
56
|
+
export function assertManifest(value, kind) {
|
|
57
|
+
const manifest = value;
|
|
58
|
+
if (!manifest || manifest.schemaVersion !== 1 || manifest.kind !== kind || !manifest.id || !manifest.version) {
|
|
59
|
+
throw new Error(`无效的 ${kind} 内容清单`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function manifestKindFor(key) {
|
|
63
|
+
if (key === "agentSkin")
|
|
64
|
+
return "agent-skin";
|
|
65
|
+
if (key === "lifeActivities")
|
|
66
|
+
return "life-activities";
|
|
67
|
+
return key;
|
|
68
|
+
}
|
|
69
|
+
function validClock(value) {
|
|
70
|
+
if (typeof value !== "string" || !/^\d{2}:\d{2}$/.test(value))
|
|
71
|
+
return false;
|
|
72
|
+
const [hour, minute] = value.split(":").map(Number);
|
|
73
|
+
return hour >= 0 && hour <= 23 && minute >= 0 && minute <= 59;
|
|
74
|
+
}
|
|
75
|
+
function shiftIssue(value, code, path, label) {
|
|
76
|
+
if (!value || !validClock(value.start) || !validClock(value.end))
|
|
77
|
+
return { code, path, message: `${label} 必须提供有效的 HH:MM 起止时间` };
|
|
78
|
+
if (value.endLatest !== undefined && !validClock(value.endLatest))
|
|
79
|
+
return { code, path: `${path}.endLatest`, message: `${label} 的最晚下班时间必须是有效的 HH:MM` };
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Layout structure rules. `propTypeNames` are the type names a layout may
|
|
84
|
+
* reference; the library stores props namespaced while the rendered graph does
|
|
85
|
+
* not, so both callers normalize before calling.
|
|
86
|
+
*/
|
|
87
|
+
export function layoutIssues(layout, propTypeNames) {
|
|
88
|
+
if (!layout || typeof layout !== "object")
|
|
89
|
+
return [{ code: "missing-layout", path: "$.layout", message: "Layout 缺失" }];
|
|
90
|
+
const issues = [];
|
|
91
|
+
if (layout.contract !== "single-office-v1")
|
|
92
|
+
issues.push({ code: "invalid-layout-contract", path: "$.layout", message: `不支持的 Layout 合同:${layout.contract}` });
|
|
93
|
+
if (layout.canvas?.width !== 384 || layout.canvas?.height !== 216)
|
|
94
|
+
issues.push({ code: "invalid-layout-canvas", path: "$.layout", message: "single-office-v1 必须使用 384×216 逻辑画布" });
|
|
95
|
+
if (!Array.isArray(layout.seats) || layout.seats.length !== 8)
|
|
96
|
+
issues.push({ code: "invalid-layout-seats", path: "$.layout", message: "Demo Layout 必须提供 8 个座位" });
|
|
97
|
+
if (!Array.isArray(layout.navigation?.lanes) || !layout.navigation.lanes.length)
|
|
98
|
+
issues.push({ code: "invalid-layout-navigation", path: "$.layout", message: "Layout 缺少导航通道" });
|
|
99
|
+
const propTypes = new Set(propTypeNames);
|
|
100
|
+
const textIds = new Set();
|
|
101
|
+
if (layout.textSlots !== undefined && (!Array.isArray(layout.textSlots) || layout.textSlots.length > 8)) {
|
|
102
|
+
issues.push({ code: "invalid-text-slots", path: "$.layout.textSlots", message: "maximum 8 text areas" });
|
|
103
|
+
}
|
|
104
|
+
else
|
|
105
|
+
for (const slot of layout.textSlots ?? []) {
|
|
106
|
+
const valid = slot && typeof slot.id === "string" && /^[a-z][a-z0-9-]*$/.test(slot.id) && !textIds.has(slot.id)
|
|
107
|
+
&& [slot.x, slot.y, slot.width, slot.height, slot.maxLength].every(Number.isFinite)
|
|
108
|
+
&& slot.x >= 0 && slot.y >= 0 && slot.width >= 12 && slot.height >= 9
|
|
109
|
+
&& slot.x + slot.width <= 384 && slot.y + slot.height <= 216
|
|
110
|
+
&& slot.maxLength >= 1 && slot.maxLength <= 120
|
|
111
|
+
&& [slot.text, slot.defaultText].every((text) => text === undefined || typeof text === "string" && [...text].length <= slot.maxLength);
|
|
112
|
+
if (!valid)
|
|
113
|
+
issues.push({ code: "invalid-text-slot", path: "$.layout.textSlots", message: "invalid, duplicate or out-of-bounds text area" });
|
|
114
|
+
if (slot?.id)
|
|
115
|
+
textIds.add(slot.id);
|
|
116
|
+
}
|
|
117
|
+
const propInstances = new Set();
|
|
118
|
+
for (const instance of layout.propInstances ?? []) {
|
|
119
|
+
if (!propTypes.has(instance?.type))
|
|
120
|
+
issues.push({ code: "unknown-layout-prop", path: "$.layout.propInstances", message: `未知 Prop Type:${instance?.type}` });
|
|
121
|
+
if (!instance?.id || propInstances.has(instance.id))
|
|
122
|
+
issues.push({ code: "invalid-layout-prop", path: "$.layout.propInstances", message: `重复或无效的 Prop 实例:${instance?.id ?? "—"}` });
|
|
123
|
+
propInstances.add(instance?.id);
|
|
124
|
+
}
|
|
125
|
+
for (const capability of WORK_CAPABILITIES) {
|
|
126
|
+
if (!layout.stations?.[capability])
|
|
127
|
+
issues.push({ code: "missing-layout-station", path: `$.layout.stations.${capability}`, message: `Layout 缺少工作能力:${capability}` });
|
|
128
|
+
}
|
|
129
|
+
return issues;
|
|
130
|
+
}
|
|
131
|
+
/** Every reason the browser would refuse to render this resolved content graph. */
|
|
132
|
+
export function graphIssues(content) {
|
|
133
|
+
const issues = [];
|
|
134
|
+
for (const [key, value] of Object.entries(content ?? {})) {
|
|
135
|
+
if (key === "preset" || key === "agentProfile")
|
|
136
|
+
continue;
|
|
137
|
+
try {
|
|
138
|
+
assertManifest(value, manifestKindFor(key));
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
issues.push({ code: "invalid-manifest", path: `$.${key}`, message: error.message });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const profile = content?.agentProfile;
|
|
145
|
+
if (!profile || typeof profile !== "object" || typeof profile.template !== "string" || !profile.template
|
|
146
|
+
|| !profile.appearance || typeof profile.appearance !== "object" || Array.isArray(profile.appearance)) {
|
|
147
|
+
issues.push({ code: "invalid-agent-profile", path: "$.agentProfile", message: "无效的 Agent Profile" });
|
|
148
|
+
}
|
|
149
|
+
const layout = content?.layout;
|
|
150
|
+
issues.push(...layoutIssues(layout, Object.keys(content?.props?.types ?? {})));
|
|
151
|
+
const instances = (layout?.propInstances ?? []).map((instance) => [instance?.id, instance?.type]);
|
|
152
|
+
const capabilitiesOf = (type) => content?.props?.types?.[type]?.capabilities ?? [];
|
|
153
|
+
;
|
|
154
|
+
(content?.npcs?.entries ?? []).forEach((npc, index) => {
|
|
155
|
+
const path = `$.npcs.entries[${index}]`;
|
|
156
|
+
if (!npc?.id || !npc.role || !layout?.targets?.[npc.spawn])
|
|
157
|
+
issues.push({ code: "invalid-npc", path, message: `无效的 NPC:${npc?.id ?? "—"}` });
|
|
158
|
+
const shift = npc?.shift ? shiftIssue(npc.shift, "invalid-npc-shift", path, `NPC ${npc.id} 的 shift`) : null;
|
|
159
|
+
if (shift)
|
|
160
|
+
issues.push(shift);
|
|
161
|
+
});
|
|
162
|
+
;
|
|
163
|
+
(content?.lifeActivities?.entries ?? []).forEach((activity, index) => {
|
|
164
|
+
const path = `$.lifeActivities.entries[${index}]`;
|
|
165
|
+
if (!activity?.id || !["agent", "npc", "person"].includes(activity.participant?.kind) || !activity.steps?.length) {
|
|
166
|
+
issues.push({ code: "invalid-activity", path, message: `无效的 Life Activity:${activity?.id ?? "—"}` });
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (activity.participant?.minAgents != null && (!Number.isInteger(activity.participant.minAgents) || activity.participant.minAgents < 2)) {
|
|
170
|
+
issues.push({ code: "invalid-activity-participant", path, message: `${activity.id} 的 minAgents 必须是至少 2 的整数` });
|
|
171
|
+
}
|
|
172
|
+
const resolved = resolveActivityRequirements(activity.requires, instances, capabilitiesOf, activity.id);
|
|
173
|
+
issues.push(...resolved.issues.map((issue) => ({ ...issue, path })));
|
|
174
|
+
for (const step of activity.steps ?? []) {
|
|
175
|
+
if (!layout?.targets?.[step?.target] && !DYNAMIC_ACTIVITY_TARGETS.has(step?.target))
|
|
176
|
+
issues.push({ code: "missing-activity-target", path, message: `${activity.id} 缺少 Target:${step?.target}` });
|
|
177
|
+
for (const target of step?.targets ?? []) {
|
|
178
|
+
if (!layout?.targets?.[target])
|
|
179
|
+
issues.push({ code: "missing-activity-target", path, message: `${activity.id} 缺少 Group Target:${target}` });
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
const environment = content?.environment;
|
|
184
|
+
if (!environment || !["local", "fixed"].includes(environment.clock?.mode)) {
|
|
185
|
+
issues.push({ code: "invalid-environment", path: "$.environment", message: "Environment 的 clock.mode 必须是 local 或 fixed" });
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
if (environment.clock.mode === "fixed" && !validClock(environment.clock.fixedTime))
|
|
189
|
+
issues.push({ code: "invalid-environment", path: "$.environment.clock.fixedTime", message: "Environment 的 fixedTime 无效" });
|
|
190
|
+
if (!Array.isArray(environment.clock?.phases) || !environment.clock.phases.length)
|
|
191
|
+
issues.push({ code: "invalid-environment", path: "$.environment.clock", message: "Environment 缺少 day phases" });
|
|
192
|
+
for (const phase of environment.clock?.phases ?? []) {
|
|
193
|
+
if (!phase?.id || !validClock(phase.start))
|
|
194
|
+
issues.push({ code: "invalid-environment", path: "$.environment.clock.phases", message: "Environment 包含无效的 day phase" });
|
|
195
|
+
}
|
|
196
|
+
if (!Array.isArray(environment.weather?.allowedConditions) || !environment.weather.allowedConditions.length) {
|
|
197
|
+
issues.push({ code: "invalid-environment", path: "$.environment.weather", message: "Environment 缺少天气类型" });
|
|
198
|
+
}
|
|
199
|
+
const allowedWeather = new Set(environment.weather?.allowedConditions ?? []);
|
|
200
|
+
for (const condition of [environment.weather?.condition, environment.weather?.fallback]) {
|
|
201
|
+
if (condition != null && !allowedWeather.has(condition)) {
|
|
202
|
+
issues.push({ code: "invalid-environment", path: "$.environment.weather", message: `Environment 的天气 ${condition} 不在 allowedConditions 中` });
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
const shift = environment.npcSchedule?.defaultShift ? shiftIssue(environment.npcSchedule.defaultShift, "invalid-environment", "$.environment.npcSchedule", "Environment 的 NPC 默认班次") : null;
|
|
206
|
+
if (shift)
|
|
207
|
+
issues.push(shift);
|
|
208
|
+
for (const [role, value] of Object.entries(environment.npcSchedule?.roleOverrides ?? {})) {
|
|
209
|
+
const roleIssue = shiftIssue(value, "invalid-environment", `$.environment.npcSchedule.roleOverrides.${role}`, `Environment 的 ${role} 班次`);
|
|
210
|
+
if (roleIssue)
|
|
211
|
+
issues.push(roleIssue);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return issues;
|
|
215
|
+
}
|
|
216
|
+
/** Browser entry point: refuse the first structural problem, exactly as rendered. */
|
|
217
|
+
export function validateRegistry(content) {
|
|
218
|
+
const issues = graphIssues(content);
|
|
219
|
+
if (issues.length)
|
|
220
|
+
throw new Error(issues[0].message);
|
|
221
|
+
}
|
|
222
|
+
/** Server entry point: report every problem at once for the Creator surface. */
|
|
223
|
+
export function graphIssueMessages(content) {
|
|
224
|
+
return graphIssues(content).map((issue) => issue.message);
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=graph-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-validator.js","sourceRoot":"","sources":["../../plugins/agent-live/src/content/graph-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ComponentLibraryView } from "./validator.ts";
|
|
2
|
+
export declare function loadComponentLibrary(contentRoot: string): Promise<ComponentLibraryView>;
|
|
3
|
+
export declare function loadOfficialOffices(contentRoot: string): Promise<any[]>;
|
|
4
|
+
//# sourceMappingURL=library.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../../plugins/agent-live/src/content/library.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAM3D,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAgC7F;AAED,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,kBAI5D"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
async function readJson(file) {
|
|
4
|
+
return JSON.parse(await readFile(file, "utf8"));
|
|
5
|
+
}
|
|
6
|
+
export async function loadComponentLibrary(contentRoot) {
|
|
7
|
+
const root = path.join(contentRoot, "component-library");
|
|
8
|
+
const [catalog, props, npcTemplates, agentProfileTemplates, activityRecipes, activityImplementations] = await Promise.all([
|
|
9
|
+
readJson(path.join(root, "catalog.json")),
|
|
10
|
+
readJson(path.join(root, "props.json")),
|
|
11
|
+
readJson(path.join(root, "npc-templates.json")),
|
|
12
|
+
readJson(path.join(root, "agent-profile-templates.json")),
|
|
13
|
+
readJson(path.join(root, "activity-recipes.json")),
|
|
14
|
+
readJson(path.join(root, "activity-implementations.json")),
|
|
15
|
+
]);
|
|
16
|
+
const layouts = new Map();
|
|
17
|
+
for (const entry of catalog.layouts)
|
|
18
|
+
layouts.set(entry.id, await readJson(path.join(contentRoot, "layouts", `${entry.id.replace(/^builtin\//, "")}.json`)));
|
|
19
|
+
return {
|
|
20
|
+
descriptors: {
|
|
21
|
+
styles: catalog.styles,
|
|
22
|
+
layouts: catalog.layouts,
|
|
23
|
+
agentSkins: catalog.agentSkins,
|
|
24
|
+
atmospheres: catalog.atmospheres,
|
|
25
|
+
environments: catalog.environments,
|
|
26
|
+
},
|
|
27
|
+
styles: new Set(catalog.styles.map((entry) => entry.id)), layouts,
|
|
28
|
+
agentSkins: new Set(catalog.agentSkins.map((entry) => entry.id)),
|
|
29
|
+
props: new Map(props.entries.map((entry) => [entry.id, entry])),
|
|
30
|
+
npcTemplates: new Map(npcTemplates.entries.map((entry) => [entry.id, entry])),
|
|
31
|
+
agentProfileTemplates: new Map(agentProfileTemplates.entries.map((entry) => [entry.id, entry])),
|
|
32
|
+
activityRecipes: new Map(activityRecipes.entries.map((entry) => [entry.id, entry])),
|
|
33
|
+
activityImplementations: new Map(activityImplementations.entries.map((entry) => [`${entry.layout}|${entry.recipe}`, entry])),
|
|
34
|
+
atmospheres: new Set(catalog.atmospheres.map((entry) => entry.id)),
|
|
35
|
+
environments: new Set(catalog.environments.map((entry) => entry.id)),
|
|
36
|
+
defaultNpcTemplate: npcTemplates.defaultTemplate,
|
|
37
|
+
npcProfilePolicy: npcTemplates.defaultInstancePolicy,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export async function loadOfficialOffices(contentRoot) {
|
|
41
|
+
const catalog = await readJson(path.join(contentRoot, "catalog.json"));
|
|
42
|
+
const publicIds = catalog.presets.filter((entry) => entry.visibility !== "internal").map((entry) => entry.id);
|
|
43
|
+
return Promise.all(publicIds.map((id) => readJson(path.join(contentRoot, "official-offices", `${id}.json`))));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=library.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library.js","sourceRoot":"","sources":["../../plugins/agent-live/src/content/library.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import type { OfficeSpec } from "./schema.ts";
|
|
3
|
+
import { type ComponentLibraryView, type ValidationIssue } from "./validator.ts";
|
|
4
|
+
export interface RegistryEntry {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
origin: "official" | "custom";
|
|
8
|
+
selected: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface SaveResult {
|
|
11
|
+
saved: boolean;
|
|
12
|
+
issues: ValidationIssue[];
|
|
13
|
+
}
|
|
14
|
+
export interface OfficeRegistryOptions {
|
|
15
|
+
root: string;
|
|
16
|
+
library: ComponentLibraryView;
|
|
17
|
+
officialOffices: OfficeSpec[];
|
|
18
|
+
fallbackOffice?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare class OfficeRegistry {
|
|
21
|
+
#private;
|
|
22
|
+
readonly root: string;
|
|
23
|
+
constructor(options: OfficeRegistryOptions);
|
|
24
|
+
onChange(listener: (id: string | undefined) => void): () => EventEmitter<[never]>;
|
|
25
|
+
initialize(): Promise<void>;
|
|
26
|
+
list(): Promise<RegistryEntry[]>;
|
|
27
|
+
get(id: string): Promise<OfficeSpec | undefined>;
|
|
28
|
+
save(spec: OfficeSpec): Promise<SaveResult>;
|
|
29
|
+
remove(id: string): Promise<boolean>;
|
|
30
|
+
select(id: string): Promise<void>;
|
|
31
|
+
selectedId(): Promise<string>;
|
|
32
|
+
selected(): Promise<OfficeSpec>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../plugins/agent-live/src/content/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAsB,KAAK,oBAAoB,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAOrG,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,oBAAoB,CAAC;IAC9B,eAAe,EAAE,UAAU,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,qBAAa,cAAc;;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAMV,OAAO,EAAE,qBAAqB;IAQ1C,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI;IAK7C,UAAU;IAIV,IAAI,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAmBhC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAWhD,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAa3C,MAAM,CAAC,EAAE,EAAE,MAAM;IAcjB,MAAM,CAAC,EAAE,EAAE,MAAM;IAWjB,UAAU;IAUV,QAAQ;CAed"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import { mkdir, readFile, readdir, rename, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { validateOfficeSpec } from "./validator.js";
|
|
5
|
+
const SAFE_LOCAL_ID = /^local\/[a-z0-9][a-z0-9-]*(?:\/[a-z0-9][a-z0-9-]*)*$/;
|
|
6
|
+
export class OfficeRegistry {
|
|
7
|
+
root;
|
|
8
|
+
#library;
|
|
9
|
+
#official = new Map();
|
|
10
|
+
#events = new EventEmitter();
|
|
11
|
+
#fallbackOffice;
|
|
12
|
+
constructor(options) {
|
|
13
|
+
this.root = path.resolve(options.root);
|
|
14
|
+
this.#library = options.library;
|
|
15
|
+
for (const office of options.officialOffices)
|
|
16
|
+
this.#official.set(office.id, structuredClone(office));
|
|
17
|
+
this.#fallbackOffice = options.fallbackOffice ?? "builtin/tech-open-office";
|
|
18
|
+
if (!this.#official.has(this.#fallbackOffice))
|
|
19
|
+
throw new Error(`unknown fallback office ${this.#fallbackOffice}`);
|
|
20
|
+
}
|
|
21
|
+
onChange(listener) {
|
|
22
|
+
this.#events.on("change", listener);
|
|
23
|
+
return () => this.#events.off("change", listener);
|
|
24
|
+
}
|
|
25
|
+
async initialize() {
|
|
26
|
+
await mkdir(this.#officeDir(), { recursive: true });
|
|
27
|
+
}
|
|
28
|
+
async list() {
|
|
29
|
+
await this.initialize();
|
|
30
|
+
const selected = await this.selectedId();
|
|
31
|
+
const entries = [...this.#official.values()].map((office) => ({ id: office.id, name: office.name, origin: "official", selected: office.id === selected }));
|
|
32
|
+
for (const file of await readdir(this.#officeDir())) {
|
|
33
|
+
if (!file.endsWith(".json"))
|
|
34
|
+
continue;
|
|
35
|
+
try {
|
|
36
|
+
const office = await this.#readCustomFile(path.join(this.#officeDir(), file));
|
|
37
|
+
entries.push({ id: office.id, name: office.name, origin: "custom", selected: office.id === selected });
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.warn(`Agent Live ignored invalid custom office ${file}: ${error instanceof Error ? error.message : String(error)}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return [
|
|
44
|
+
...entries.filter((entry) => entry.origin === "official"),
|
|
45
|
+
...entries.filter((entry) => entry.origin === "custom").sort((a, b) => a.name.localeCompare(b.name) || a.id.localeCompare(b.id)),
|
|
46
|
+
];
|
|
47
|
+
}
|
|
48
|
+
async get(id) {
|
|
49
|
+
const official = this.#official.get(id);
|
|
50
|
+
if (official)
|
|
51
|
+
return structuredClone(official);
|
|
52
|
+
if (!SAFE_LOCAL_ID.test(id))
|
|
53
|
+
return undefined;
|
|
54
|
+
try {
|
|
55
|
+
return await this.#readCustomFile(this.#fileFor(id));
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async save(spec) {
|
|
62
|
+
const validation = validateOfficeSpec(spec, this.#library);
|
|
63
|
+
if (!validation.valid)
|
|
64
|
+
return { saved: false, issues: validation.issues };
|
|
65
|
+
if (spec.origin !== "custom" || !SAFE_LOCAL_ID.test(spec.id))
|
|
66
|
+
return { saved: false, issues: [{ code: "official-read-only", path: "$.id", message: "only local/ custom offices can be saved" }] };
|
|
67
|
+
await this.initialize();
|
|
68
|
+
const destination = this.#fileFor(spec.id);
|
|
69
|
+
const temporary = `${destination}.${process.pid}.${Date.now()}.tmp`;
|
|
70
|
+
await writeFile(temporary, `${JSON.stringify(spec, null, "\t")}\n`, { encoding: "utf8", mode: 0o600 });
|
|
71
|
+
await rename(temporary, destination);
|
|
72
|
+
this.#events.emit("change", spec.id);
|
|
73
|
+
return { saved: true, issues: [] };
|
|
74
|
+
}
|
|
75
|
+
async remove(id) {
|
|
76
|
+
if (!SAFE_LOCAL_ID.test(id))
|
|
77
|
+
return false;
|
|
78
|
+
const selected = await this.selectedId();
|
|
79
|
+
try {
|
|
80
|
+
await rm(this.#fileFor(id));
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (error?.code === "ENOENT")
|
|
84
|
+
return false;
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
if (selected === id)
|
|
88
|
+
await this.select(this.#fallbackOffice);
|
|
89
|
+
this.#events.emit("change", id);
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
async select(id) {
|
|
93
|
+
if (!(await this.get(id)))
|
|
94
|
+
throw new Error(`unknown or invalid office ${id}`);
|
|
95
|
+
await this.initialize();
|
|
96
|
+
const state = { schemaVersion: 1, selectedOffice: id };
|
|
97
|
+
const destination = this.#stateFile();
|
|
98
|
+
const temporary = `${destination}.${process.pid}.${Date.now()}.tmp`;
|
|
99
|
+
await writeFile(temporary, `${JSON.stringify(state, null, "\t")}\n`, { encoding: "utf8", mode: 0o600 });
|
|
100
|
+
await rename(temporary, destination);
|
|
101
|
+
this.#events.emit("change", id);
|
|
102
|
+
}
|
|
103
|
+
async selectedId() {
|
|
104
|
+
try {
|
|
105
|
+
const state = JSON.parse(await readFile(this.#stateFile(), "utf8"));
|
|
106
|
+
if (state.schemaVersion === 1 && state.selectedOffice && await this.get(state.selectedOffice))
|
|
107
|
+
return state.selectedOffice;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// Missing or corrupt state falls back without mutating user files.
|
|
111
|
+
}
|
|
112
|
+
return this.#fallbackOffice;
|
|
113
|
+
}
|
|
114
|
+
async selected() {
|
|
115
|
+
return (await this.get(await this.selectedId())) ?? structuredClone(this.#official.get(this.#fallbackOffice));
|
|
116
|
+
}
|
|
117
|
+
#officeDir() { return path.join(this.root, "offices"); }
|
|
118
|
+
#stateFile() { return path.join(this.root, "registry.json"); }
|
|
119
|
+
#fileFor(id) { return path.join(this.#officeDir(), `${encodeURIComponent(id.slice("local/".length))}.json`); }
|
|
120
|
+
async #readCustomFile(file) {
|
|
121
|
+
const spec = JSON.parse(await readFile(file, "utf8"));
|
|
122
|
+
const validation = validateOfficeSpec(spec, this.#library);
|
|
123
|
+
if (!validation.valid || spec.origin !== "custom" || !SAFE_LOCAL_ID.test(spec.id))
|
|
124
|
+
throw new Error(`invalid custom office ${file}`);
|
|
125
|
+
if (this.#fileFor(spec.id) !== file)
|
|
126
|
+
throw new Error(`custom office filename does not match id ${spec.id}`);
|
|
127
|
+
return spec;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../plugins/agent-live/src/content/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { OfficeSpec } from "./schema.ts";
|
|
2
|
+
import type { ComponentLibraryView } from "./validator.ts";
|
|
3
|
+
/** Compiles a validated Office Spec into the renderer's current in-memory content graph. */
|
|
4
|
+
export declare function resolveRuntimeContent(spec: OfficeSpec, contentRoot: string, library: ComponentLibraryView): Promise<{
|
|
5
|
+
preset: Record<string, unknown>;
|
|
6
|
+
style: any;
|
|
7
|
+
layout: any;
|
|
8
|
+
agentSkin: any;
|
|
9
|
+
agentProfile: {
|
|
10
|
+
appearance: any;
|
|
11
|
+
title?: string | undefined;
|
|
12
|
+
name?: string | undefined;
|
|
13
|
+
template: any;
|
|
14
|
+
};
|
|
15
|
+
props: {
|
|
16
|
+
schemaVersion: number;
|
|
17
|
+
kind: string;
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
version: string;
|
|
21
|
+
contract: string;
|
|
22
|
+
types: {
|
|
23
|
+
[k: string]: {
|
|
24
|
+
size: any;
|
|
25
|
+
capabilities: any;
|
|
26
|
+
renderer: any;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
npcs: {
|
|
31
|
+
schemaVersion: number;
|
|
32
|
+
kind: string;
|
|
33
|
+
id: string;
|
|
34
|
+
name: string;
|
|
35
|
+
version: string;
|
|
36
|
+
contract: string;
|
|
37
|
+
entries: {
|
|
38
|
+
role: any;
|
|
39
|
+
id: string;
|
|
40
|
+
template?: string;
|
|
41
|
+
profile?: string;
|
|
42
|
+
name?: string;
|
|
43
|
+
title?: string;
|
|
44
|
+
gender?: import("./schema.ts").Gender;
|
|
45
|
+
appearance?: import("./schema.ts").Appearance;
|
|
46
|
+
spawn?: string;
|
|
47
|
+
shift?: import("./schema.ts").Shift;
|
|
48
|
+
pose?: import("./schema.ts").NpcPose;
|
|
49
|
+
}[];
|
|
50
|
+
};
|
|
51
|
+
lifeActivities: {
|
|
52
|
+
schemaVersion: number;
|
|
53
|
+
kind: string;
|
|
54
|
+
id: string;
|
|
55
|
+
name: string;
|
|
56
|
+
version: string;
|
|
57
|
+
contract: string;
|
|
58
|
+
entries: any[];
|
|
59
|
+
};
|
|
60
|
+
atmosphere: any;
|
|
61
|
+
environment: any;
|
|
62
|
+
}>;
|
|
63
|
+
//# sourceMappingURL=runtime-content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-content.d.ts","sourceRoot":"","sources":["../../plugins/agent-live/src/content/runtime-content.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAU3D,4FAA4F;AAC5F,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6D/G"}
|