Publish Weksa command boundary store records
This commit is contained in:
parent
3c2445718c
commit
54272da0d5
2 changed files with 143 additions and 10 deletions
|
|
@ -38,11 +38,19 @@ and trace.
|
||||||
- `.weksa/provider-advertisement.cc`: read-only provider advertisement witness.
|
- `.weksa/provider-advertisement.cc`: read-only provider advertisement witness.
|
||||||
- `.weksa/provider-advertisement-store.cc`: CultMesh/CultCache provider store
|
- `.weksa/provider-advertisement-store.cc`: CultMesh/CultCache provider store
|
||||||
containing `gamecult.eve.provider_advertisement.v1`,
|
containing `gamecult.eve.provider_advertisement.v1`,
|
||||||
`gamecult.eve.interface_binding.v1`, and `gamecult.eve.surface_state.v1`
|
`gamecult.eve.interface_binding.v1`, `gamecult.eve.surface_state.v1`,
|
||||||
records for Odin discovery.
|
`weksa.operator_state.v0`, `weksa.command_boundary.v1`, and
|
||||||
|
`weksa.transport_profile.v1` records for Odin discovery.
|
||||||
- `.weksa/operator-state.cc`: daemon health, readiness, and runtime witness
|
- `.weksa/operator-state.cc`: daemon health, readiness, and runtime witness
|
||||||
index used by Idunn health checks and operator inspection.
|
index used by Idunn health checks and operator inspection.
|
||||||
- `.weksa/eve-surfaces.cc`: current Weksa operator Eve surface witness.
|
- `.weksa/eve-surfaces.cc`: current Weksa operator Eve surface witness.
|
||||||
|
- `.weksa/command-boundary.cc`: provider-owned command and lifecycle boundary
|
||||||
|
naming Weksa as owner, Idunn as lifecycle requester, and the remaining MiMo
|
||||||
|
VoiceDesign HTTP route as compatibility command ingress.
|
||||||
|
- `.weksa/transport-profile.cc`: target/current transport profile. Health is
|
||||||
|
published through `cultnet.transport.rudp.v0`; provider state is carried by
|
||||||
|
the CultMesh store; the MiMo VoiceDesign command route remains compatibility
|
||||||
|
HTTP debt until a CultNet/RUDP command document ingress replaces it.
|
||||||
- `.weksa/cultmesh-publications.cc`: publication index naming current Weksa
|
- `.weksa/cultmesh-publications.cc`: publication index naming current Weksa
|
||||||
witness surfaces and compatibility routes.
|
witness surfaces and compatibility routes.
|
||||||
- `.weksa/intent/{intentId}.cc`: conversational intent documents.
|
- `.weksa/intent/{intentId}.cc`: conversational intent documents.
|
||||||
|
|
@ -96,7 +104,10 @@ those endpoints are operator/debug projections, not daemon liveness owners.
|
||||||
Odin ingests the Starfire Weksa provider through
|
Odin ingests the Starfire Weksa provider through
|
||||||
`.weksa/provider-advertisement-store.cc`. Idunn tracks the daemon as target
|
`.weksa/provider-advertisement-store.cc`. Idunn tracks the daemon as target
|
||||||
`weksa` in the `starfire-local` swarm profile and owns restart authority through
|
`weksa` in the `starfire-local` swarm profile and owns restart authority through
|
||||||
the Weksa restart script.
|
the Weksa restart script. Odin should read Weksa's provider advertisement,
|
||||||
|
operator state, command boundary, transport profile, and Eve surface from the
|
||||||
|
typed provider store; HTTP endpoints are debug/operator lowerings and do not own
|
||||||
|
provider truth.
|
||||||
|
|
||||||
## Eve Surfaces
|
## Eve Surfaces
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -137,11 +137,15 @@ async function publishWitnesses() {
|
||||||
await writeWitness("provider-advertisement.cc", snapshot.providerAdvertisement);
|
await writeWitness("provider-advertisement.cc", snapshot.providerAdvertisement);
|
||||||
await writeWitness("operator-state.cc", snapshot.operatorState);
|
await writeWitness("operator-state.cc", snapshot.operatorState);
|
||||||
await writeWitness("eve-surfaces.cc", snapshot.operatorSurface);
|
await writeWitness("eve-surfaces.cc", snapshot.operatorSurface);
|
||||||
|
await writeWitness("command-boundary.cc", snapshot.commandBoundary);
|
||||||
|
await writeWitness("transport-profile.cc", snapshot.transportProfile);
|
||||||
await writeWitness("cultmesh-publications.cc", snapshot.cultMeshPublications);
|
await writeWitness("cultmesh-publications.cc", snapshot.cultMeshPublications);
|
||||||
await writeCultMeshStore(snapshot);
|
await writeCultMeshStore(snapshot);
|
||||||
await writeJson(resolve(stateRoot, "provider-advertisement.json"), snapshot.providerAdvertisement);
|
await writeJson(resolve(stateRoot, "provider-advertisement.json"), snapshot.providerAdvertisement);
|
||||||
await writeJson(resolve(stateRoot, "operator-state.json"), snapshot.operatorState);
|
await writeJson(resolve(stateRoot, "operator-state.json"), snapshot.operatorState);
|
||||||
await writeJson(resolve(stateRoot, "eve-operator-surface.json"), snapshot.operatorSurface);
|
await writeJson(resolve(stateRoot, "eve-operator-surface.json"), snapshot.operatorSurface);
|
||||||
|
await writeJson(resolve(stateRoot, "command-boundary.json"), snapshot.commandBoundary);
|
||||||
|
await writeJson(resolve(stateRoot, "transport-profile.json"), snapshot.transportProfile);
|
||||||
await writeJson(resolve(stateRoot, "cultmesh-publications.json"), snapshot.cultMeshPublications);
|
await writeJson(resolve(stateRoot, "cultmesh-publications.json"), snapshot.cultMeshPublications);
|
||||||
cachedSnapshot = snapshot;
|
cachedSnapshot = snapshot;
|
||||||
lastPublishedAt = snapshot.operatorState.updated_at;
|
lastPublishedAt = snapshot.operatorState.updated_at;
|
||||||
|
|
@ -223,7 +227,9 @@ async function buildSnapshot() {
|
||||||
},
|
},
|
||||||
latest_affect_tuning: tuning,
|
latest_affect_tuning: tuning,
|
||||||
};
|
};
|
||||||
const operatorSurface = buildOperatorSurface({ providerAdvertisement, operatorState, cultureCatalog, tuning });
|
const commandBoundary = buildCommandBoundary(updatedAt);
|
||||||
|
const transportProfile = buildTransportProfile(updatedAt);
|
||||||
|
const operatorSurface = buildOperatorSurface({ providerAdvertisement, operatorState, commandBoundary, cultureCatalog, tuning });
|
||||||
const cultMeshPublications = {
|
const cultMeshPublications = {
|
||||||
schema: "weksa.cultmesh_publications.v0",
|
schema: "weksa.cultmesh_publications.v0",
|
||||||
service_id: "weksa.intent.service",
|
service_id: "weksa.intent.service",
|
||||||
|
|
@ -238,11 +244,13 @@ async function buildSnapshot() {
|
||||||
publication("weksa.service/provider-advertisement", "gamecult.eve.provider_advertisement.v1", ".weksa/provider-advertisement-store.cc", "/provider-advertisement"),
|
publication("weksa.service/provider-advertisement", "gamecult.eve.provider_advertisement.v1", ".weksa/provider-advertisement-store.cc", "/provider-advertisement"),
|
||||||
publication("weksa.operator/status", "weksa.operator_state.v0", ".weksa/operator-state.cc", "/operator-state"),
|
publication("weksa.operator/status", "weksa.operator_state.v0", ".weksa/operator-state.cc", "/operator-state"),
|
||||||
publication("weksa.eve.surface.operator", "gamecult.eve.surface.v1", ".weksa/eve-surfaces.cc", "/eve/operator"),
|
publication("weksa.eve.surface.operator", "gamecult.eve.surface.v1", ".weksa/eve-surfaces.cc", "/eve/operator"),
|
||||||
|
publication("weksa.command-boundary", "weksa.command_boundary.v1", ".weksa/command-boundary.cc", null),
|
||||||
|
publication("weksa.transport-profile", "weksa.transport_profile.v1", ".weksa/transport-profile.cc", null),
|
||||||
publication("weksa.cultmesh/publications", "weksa.cultmesh_publications.v0", ".weksa/cultmesh-publications.cc", "/cultmesh/publications"),
|
publication("weksa.cultmesh/publications", "weksa.cultmesh_publications.v0", ".weksa/cultmesh-publications.cc", "/cultmesh/publications"),
|
||||||
publication("weksa.speech-provider/mimo/voicedesign", "weksa.mimo_tts_request.v0", ".weksa/speech-provider/mimo/{requestId}.cc", "/speech-provider/mimo/voicedesign"),
|
publication("weksa.speech-provider/mimo/voicedesign", "weksa.mimo_tts_request.v0", ".weksa/speech-provider/mimo/{requestId}.cc", "/speech-provider/mimo/voicedesign"),
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
return { providerAdvertisement, operatorState, operatorSurface, cultMeshPublications };
|
return { providerAdvertisement, operatorState, operatorSurface, commandBoundary, transportProfile, cultMeshPublications };
|
||||||
}
|
}
|
||||||
|
|
||||||
async function writeCultMeshStore(snapshot) {
|
async function writeCultMeshStore(snapshot) {
|
||||||
|
|
@ -251,8 +259,22 @@ async function writeCultMeshStore(snapshot) {
|
||||||
await appendLog(`CultMesh store write skipped: ${runtime.error.message}`);
|
await appendLog(`CultMesh store write skipped: ${runtime.error.message}`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const { providerAdvertisementDefinition, interfaceBindingDefinition, surfaceDefinition } = defineCultMeshDocuments(runtime.defineDocumentType);
|
const {
|
||||||
const documents = [providerAdvertisementDefinition, interfaceBindingDefinition, surfaceDefinition];
|
providerAdvertisementDefinition,
|
||||||
|
interfaceBindingDefinition,
|
||||||
|
surfaceDefinition,
|
||||||
|
operatorStateDefinition,
|
||||||
|
commandBoundaryDefinition,
|
||||||
|
transportProfileDefinition,
|
||||||
|
} = defineCultMeshDocuments(runtime.defineDocumentType);
|
||||||
|
const documents = [
|
||||||
|
providerAdvertisementDefinition,
|
||||||
|
interfaceBindingDefinition,
|
||||||
|
surfaceDefinition,
|
||||||
|
operatorStateDefinition,
|
||||||
|
commandBoundaryDefinition,
|
||||||
|
transportProfileDefinition,
|
||||||
|
];
|
||||||
await rm(cultMeshStorePath, { force: true });
|
await rm(cultMeshStorePath, { force: true });
|
||||||
const node = await createCultMeshNodeWithOwnedStoreReset(runtime.CultMesh, cultMeshStorePath, documents);
|
const node = await createCultMeshNodeWithOwnedStoreReset(runtime.CultMesh, cultMeshStorePath, documents);
|
||||||
await node.put(providerAdvertisementDefinition, snapshot.providerAdvertisement.providerId, snapshot.providerAdvertisement);
|
await node.put(providerAdvertisementDefinition, snapshot.providerAdvertisement.providerId, snapshot.providerAdvertisement);
|
||||||
|
|
@ -285,6 +307,9 @@ async function writeCultMeshStore(snapshot) {
|
||||||
updatedAt: snapshot.operatorState.updated_at,
|
updatedAt: snapshot.operatorState.updated_at,
|
||||||
surface: snapshot.operatorSurface,
|
surface: snapshot.operatorSurface,
|
||||||
});
|
});
|
||||||
|
await node.put(operatorStateDefinition, "weksa", snapshot.operatorState);
|
||||||
|
await node.put(commandBoundaryDefinition, "weksa", snapshot.commandBoundary);
|
||||||
|
await node.put(transportProfileDefinition, "weksa", snapshot.transportProfile);
|
||||||
await node.flush?.(true);
|
await node.flush?.(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -352,7 +377,41 @@ function defineCultMeshDocuments(defineDocumentType) {
|
||||||
name: (value) => value?.providerId || "provider",
|
name: (value) => value?.providerId || "provider",
|
||||||
schema: { parse: (value) => value },
|
schema: { parse: (value) => value },
|
||||||
});
|
});
|
||||||
return { providerAdvertisementDefinition, interfaceBindingDefinition, surfaceDefinition };
|
const operatorStateDefinition = defineDocumentType({
|
||||||
|
type: "weksa.operator_state",
|
||||||
|
schemaName: "weksa.operator_state",
|
||||||
|
schemaId: "weksa.operator_state.v0",
|
||||||
|
schemaVersion: "weksa.operator_state.v0",
|
||||||
|
global: false,
|
||||||
|
name: (value) => value?.daemon_id || value?.provider_id || "weksa",
|
||||||
|
schema: { parse: (value) => value },
|
||||||
|
});
|
||||||
|
const commandBoundaryDefinition = defineDocumentType({
|
||||||
|
type: "weksa.command_boundary",
|
||||||
|
schemaName: "weksa.command_boundary",
|
||||||
|
schemaId: "weksa.command_boundary.v1",
|
||||||
|
schemaVersion: "weksa.command_boundary.v1",
|
||||||
|
global: false,
|
||||||
|
name: (value) => value?.boundary_id || value?.daemon_id || "weksa",
|
||||||
|
schema: { parse: (value) => value },
|
||||||
|
});
|
||||||
|
const transportProfileDefinition = defineDocumentType({
|
||||||
|
type: "weksa.transport_profile",
|
||||||
|
schemaName: "weksa.transport_profile",
|
||||||
|
schemaId: "weksa.transport_profile.v1",
|
||||||
|
schemaVersion: "weksa.transport_profile.v1",
|
||||||
|
global: false,
|
||||||
|
name: (value) => value?.profile_id || value?.daemon_id || "weksa",
|
||||||
|
schema: { parse: (value) => value },
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
providerAdvertisementDefinition,
|
||||||
|
interfaceBindingDefinition,
|
||||||
|
surfaceDefinition,
|
||||||
|
operatorStateDefinition,
|
||||||
|
commandBoundaryDefinition,
|
||||||
|
transportProfileDefinition,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadProviderAdvertisement(updatedAt) {
|
function loadProviderAdvertisement(updatedAt) {
|
||||||
|
|
@ -362,6 +421,7 @@ function loadProviderAdvertisement(updatedAt) {
|
||||||
...fixture,
|
...fixture,
|
||||||
mode: "daemon-live",
|
mode: "daemon-live",
|
||||||
status: "active",
|
status: "active",
|
||||||
|
daemonId: "weksa",
|
||||||
updatedAt,
|
updatedAt,
|
||||||
canonicalService: "asgard.weksa",
|
canonicalService: "asgard.weksa",
|
||||||
locatedService: "asgard.starfire.weksa",
|
locatedService: "asgard.starfire.weksa",
|
||||||
|
|
@ -384,13 +444,74 @@ function loadProviderAdvertisement(updatedAt) {
|
||||||
],
|
],
|
||||||
health: {
|
health: {
|
||||||
state: "healthy",
|
state: "healthy",
|
||||||
endpoint: `http://${host}:${port}/health`,
|
endpoint: idunnHealthPublisher ? `${CULTNET_RUDP_PROTOCOL_ID}:idunn-health` : `http://${host}:${port}/health`,
|
||||||
witness: ".weksa/operator-state.cc",
|
witness: ".weksa/operator-state.cc",
|
||||||
checkedBy: "idunn.desired_daemon.v1",
|
checkedBy: "idunn.desired_daemon.v1",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function buildCommandBoundary(updatedAt) {
|
||||||
|
return {
|
||||||
|
schema: "weksa.command_boundary.v1",
|
||||||
|
boundary_id: "weksa",
|
||||||
|
daemon_id: "weksa",
|
||||||
|
provider_id: "weksa.intent.service",
|
||||||
|
service_id: "weksa.intent.service",
|
||||||
|
updated_at: updatedAt,
|
||||||
|
owner: "Weksa daemon",
|
||||||
|
lifecycle_authority: "idunn.local-command",
|
||||||
|
health_publication: {
|
||||||
|
contract: "weksa.cultnet-rudp-provider-health",
|
||||||
|
transport: CULTNET_RUDP_PROTOCOL_ID,
|
||||||
|
publication_source: "daemon-published",
|
||||||
|
state_owner: "Weksa daemon",
|
||||||
|
},
|
||||||
|
commands: [
|
||||||
|
{
|
||||||
|
command: "speech_provider.mimo.voicedesign",
|
||||||
|
ingress: "compatibility-http",
|
||||||
|
endpoint: `http://${host}:${port}/speech-provider/mimo/voicedesign`,
|
||||||
|
owner: "Weksa daemon",
|
||||||
|
input_schema: "weksa.mimo_tts_request.v0",
|
||||||
|
output_schema: "weksa.mimo_voicedesign_receipt.v0",
|
||||||
|
authority: "Weksa accepts the request, commits typed witnesses, and treats MiMo as an external renderer.",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
forbidden_writers: [
|
||||||
|
"HTTP clients may request commands but do not own Weksa intent state.",
|
||||||
|
"Odin, Eve, and renderers may lower Weksa surfaces but do not mutate command authority.",
|
||||||
|
],
|
||||||
|
compatibility: {
|
||||||
|
http: `http://${host}:${port}`,
|
||||||
|
status: "debug-and-command-lowering-only",
|
||||||
|
cut_line: "Replace speech_provider.mimo.voicedesign compatibility HTTP with a CultNet/RUDP command document ingress before deleting the HTTP command route.",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildTransportProfile(updatedAt) {
|
||||||
|
return {
|
||||||
|
schema: "weksa.transport_profile.v1",
|
||||||
|
profile_id: "weksa",
|
||||||
|
daemon_id: "weksa",
|
||||||
|
provider_id: "weksa.intent.service",
|
||||||
|
updated_at: updatedAt,
|
||||||
|
target_transport: CULTNET_RUDP_PROTOCOL_ID,
|
||||||
|
current_transport: idunnHealthPublisher
|
||||||
|
? "rudp-health-and-cultmesh-store + compatibility-http-command"
|
||||||
|
: "cultmesh-store + compatibility-http",
|
||||||
|
health_transport: idunnHealthPublisher ? CULTNET_RUDP_PROTOCOL_ID : "compatibility-http",
|
||||||
|
state_transport: "cultmesh-store",
|
||||||
|
command_transport: "compatibility-http",
|
||||||
|
compatibility: {
|
||||||
|
http: `http://${host}:${port}`,
|
||||||
|
endpoints_are_lowerings: true,
|
||||||
|
},
|
||||||
|
cut_line: "Weksa health and provider state are daemon-owned typed records; the remaining command ingress debt is the MiMo VoiceDesign HTTP route.",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
function loadLatestAffectTuning() {
|
function loadLatestAffectTuning() {
|
||||||
const root = resolve(repoRoot, ".weksa-runs/metame-affect-tuning");
|
const root = resolve(repoRoot, ".weksa-runs/metame-affect-tuning");
|
||||||
if (!existsSync(root)) {
|
if (!existsSync(root)) {
|
||||||
|
|
@ -440,7 +561,7 @@ async function inspectCultureCatalog() {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildOperatorSurface({ providerAdvertisement, operatorState, cultureCatalog, tuning }) {
|
function buildOperatorSurface({ providerAdvertisement, operatorState, commandBoundary, cultureCatalog, tuning }) {
|
||||||
return {
|
return {
|
||||||
schema: "gamecult.eve.surface.v1",
|
schema: "gamecult.eve.surface.v1",
|
||||||
providerId: providerAdvertisement.providerId,
|
providerId: providerAdvertisement.providerId,
|
||||||
|
|
@ -463,6 +584,7 @@ function buildOperatorSurface({ providerAdvertisement, operatorState, cultureCat
|
||||||
fact("culture profiles", String(cultureCatalog.profile_count)),
|
fact("culture profiles", String(cultureCatalog.profile_count)),
|
||||||
fact("target profiles", String(cultureCatalog.target_language_profile_count)),
|
fact("target profiles", String(cultureCatalog.target_language_profile_count)),
|
||||||
fact("commands", operatorState.readiness.command_ingress),
|
fact("commands", operatorState.readiness.command_ingress),
|
||||||
|
fact("command boundary", commandBoundary.boundary_id),
|
||||||
fact("mimo voicedesign", operatorState.readiness.mimo_voicedesign),
|
fact("mimo voicedesign", operatorState.readiness.mimo_voicedesign),
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue