@plurnk/plurnk-service 1.8.0 → 1.9.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/.env.defaults +20 -0
- package/INSTALL.md +14 -16
- package/README.md +1 -1
- package/SPEC.md +635 -296
- package/digest-sql/channel-dispositions/dispositions.sql +2 -2
- package/digest-sql/entry-dispositions/dispositions.sql +2 -2
- package/dist/Paths.d.ts +1 -2
- package/dist/Paths.d.ts.map +1 -1
- package/dist/Paths.js +1 -9
- package/dist/Paths.js.map +1 -1
- package/dist/build-info.json +1 -1
- package/dist/core/ChannelWrite.d.ts +8 -3
- package/dist/core/ChannelWrite.d.ts.map +1 -1
- package/dist/core/ChannelWrite.js +40 -8
- package/dist/core/ChannelWrite.js.map +1 -1
- package/dist/core/ChannelWrite.sql +17 -4
- package/dist/core/CoreSchemeServices.d.ts +7 -3
- package/dist/core/CoreSchemeServices.d.ts.map +1 -1
- package/dist/core/CoreSchemeServices.js +8 -1
- package/dist/core/CoreSchemeServices.js.map +1 -1
- package/dist/core/Dispatcher.d.ts +9 -1
- package/dist/core/Dispatcher.d.ts.map +1 -1
- package/dist/core/Dispatcher.js +321 -221
- package/dist/core/Dispatcher.js.map +1 -1
- package/dist/core/Engine.d.ts +13 -4
- package/dist/core/Engine.d.ts.map +1 -1
- package/dist/core/Engine.js +44 -22
- package/dist/core/Engine.js.map +1 -1
- package/dist/core/Engine.sql +101 -81
- package/dist/core/EntryAddressBinding.d.ts +32 -0
- package/dist/core/EntryAddressBinding.d.ts.map +1 -0
- package/dist/core/EntryAddressBinding.js +93 -0
- package/dist/core/EntryAddressBinding.js.map +1 -0
- package/dist/core/ExecutorRegistry.d.ts +4 -4
- package/dist/core/ExecutorRegistry.d.ts.map +1 -1
- package/dist/core/ExecutorRegistry.js +28 -28
- package/dist/core/ExecutorRegistry.js.map +1 -1
- package/dist/core/LogBody.d.ts.map +1 -1
- package/dist/core/LogBody.js +19 -1
- package/dist/core/LogBody.js.map +1 -1
- package/dist/core/OperatorConfig.d.ts.map +1 -1
- package/dist/core/OperatorConfig.js +5 -2
- package/dist/core/OperatorConfig.js.map +1 -1
- package/dist/core/OverflowTurn.d.ts.map +1 -1
- package/dist/core/OverflowTurn.js +5 -1
- package/dist/core/OverflowTurn.js.map +1 -1
- package/dist/core/Owner.js +1 -1
- package/dist/core/Owner.js.map +1 -1
- package/dist/core/PacketBuilder.d.ts +5 -1
- package/dist/core/PacketBuilder.d.ts.map +1 -1
- package/dist/core/PacketBuilder.js +21 -11
- package/dist/core/PacketBuilder.js.map +1 -1
- package/dist/core/ProposalLifecycle.d.ts +4 -1
- package/dist/core/ProposalLifecycle.d.ts.map +1 -1
- package/dist/core/ProposalLifecycle.js +85 -26
- package/dist/core/ProposalLifecycle.js.map +1 -1
- package/dist/core/ReasoningEvent.d.ts +13 -0
- package/dist/core/ReasoningEvent.d.ts.map +1 -0
- package/dist/core/ReasoningEvent.js +6 -0
- package/dist/core/ReasoningEvent.js.map +1 -0
- package/dist/core/ResourceMutations.d.ts +15 -19
- package/dist/core/ResourceMutations.d.ts.map +1 -1
- package/dist/core/ResourceMutations.js +113 -38
- package/dist/core/ResourceMutations.js.map +1 -1
- package/dist/core/SchemeRegistry.d.ts +12 -11
- package/dist/core/SchemeRegistry.d.ts.map +1 -1
- package/dist/core/SchemeRegistry.js +52 -47
- package/dist/core/SchemeRegistry.js.map +1 -1
- package/dist/core/ToolResources.d.ts.map +1 -1
- package/dist/core/ToolResources.js +20 -19
- package/dist/core/ToolResources.js.map +1 -1
- package/dist/core/Turn.d.ts +1 -1
- package/dist/core/Turn.d.ts.map +1 -1
- package/dist/core/TurnOps.d.ts +2 -2
- package/dist/core/TurnOps.d.ts.map +1 -1
- package/dist/core/TurnOps.js +14 -4
- package/dist/core/TurnOps.js.map +1 -1
- package/dist/core/TurnRunner.d.ts +46 -3
- package/dist/core/TurnRunner.d.ts.map +1 -1
- package/dist/core/TurnRunner.js +165 -78
- package/dist/core/TurnRunner.js.map +1 -1
- package/dist/core/WorkerName.d.ts +1 -0
- package/dist/core/WorkerName.d.ts.map +1 -1
- package/dist/core/WorkerName.js +2 -1
- package/dist/core/WorkerName.js.map +1 -1
- package/dist/core/WorkerName.sql +17 -2
- package/dist/core/WorkspaceGate.js +1 -1
- package/dist/core/WorkspaceGate.js.map +1 -1
- package/dist/core/caps/CapsResolve.d.ts +2 -2
- package/dist/core/caps/CapsResolve.d.ts.map +1 -1
- package/dist/core/caps/CapsResolve.js +5 -7
- package/dist/core/caps/CapsResolve.js.map +1 -1
- package/dist/core/caps/DbChannelCaps.d.ts +1 -1
- package/dist/core/caps/DbChannelCaps.d.ts.map +1 -1
- package/dist/core/caps/DbChannelCaps.js +13 -11
- package/dist/core/caps/DbChannelCaps.js.map +1 -1
- package/dist/core/caps/DbEntryCaps.d.ts +5 -5
- package/dist/core/caps/DbEntryCaps.d.ts.map +1 -1
- package/dist/core/caps/DbEntryCaps.js +27 -30
- package/dist/core/caps/DbEntryCaps.js.map +1 -1
- package/dist/core/caps/DbNotifyCaps.d.ts +1 -1
- package/dist/core/caps/DbNotifyCaps.d.ts.map +1 -1
- package/dist/core/caps/DbNotifyCaps.js +5 -3
- package/dist/core/caps/DbNotifyCaps.js.map +1 -1
- package/dist/core/caps/DbSubscriptionCaps.d.ts +3 -3
- package/dist/core/caps/DbSubscriptionCaps.d.ts.map +1 -1
- package/dist/core/caps/DbSubscriptionCaps.js +16 -26
- package/dist/core/caps/DbSubscriptionCaps.js.map +1 -1
- package/dist/core/caps/SchemeCtxImpl.d.ts +6 -4
- package/dist/core/caps/SchemeCtxImpl.d.ts.map +1 -1
- package/dist/core/caps/SchemeCtxImpl.js +37 -5
- package/dist/core/caps/SchemeCtxImpl.js.map +1 -1
- package/dist/core/file-creation-policy.d.ts +9 -0
- package/dist/core/file-creation-policy.d.ts.map +1 -0
- package/dist/core/file-creation-policy.js +25 -0
- package/dist/core/file-creation-policy.js.map +1 -0
- package/dist/core/fork.d.ts +4 -1
- package/dist/core/fork.d.ts.map +1 -1
- package/dist/core/fork.js +27 -15
- package/dist/core/fork.js.map +1 -1
- package/dist/core/fork.sql +35 -22
- package/dist/core/git-membership.d.ts +19 -1
- package/dist/core/git-membership.d.ts.map +1 -1
- package/dist/core/git-membership.js +225 -50
- package/dist/core/git-membership.js.map +1 -1
- package/dist/core/packet-wire.d.ts.map +1 -1
- package/dist/core/packet-wire.js +28 -19
- package/dist/core/packet-wire.js.map +1 -1
- package/dist/core/plurnk-uri.d.ts +13 -2
- package/dist/core/plurnk-uri.d.ts.map +1 -1
- package/dist/core/plurnk-uri.js +59 -21
- package/dist/core/plurnk-uri.js.map +1 -1
- package/dist/core/scheme-types.d.ts +1 -0
- package/dist/core/scheme-types.d.ts.map +1 -1
- package/dist/core/worker-ops.sql +10 -6
- package/dist/core/worker-settings.d.ts +1 -0
- package/dist/core/worker-settings.d.ts.map +1 -1
- package/dist/core/worker-settings.js +7 -0
- package/dist/core/worker-settings.js.map +1 -1
- package/dist/core/workspace-settings.d.ts +2 -0
- package/dist/core/workspace-settings.d.ts.map +1 -1
- package/dist/core/workspace-settings.js +5 -1
- package/dist/core/workspace-settings.js.map +1 -1
- package/dist/digest/Digest.d.ts.map +1 -1
- package/dist/digest/Digest.js +1 -1
- package/dist/digest/Digest.js.map +1 -1
- package/dist/digest/digest.sql +1 -1
- package/dist/schemes/Exec.d.ts +3 -2
- package/dist/schemes/Exec.d.ts.map +1 -1
- package/dist/schemes/Exec.js +55 -22
- package/dist/schemes/Exec.js.map +1 -1
- package/dist/schemes/ExecOutputScheme.d.ts.map +1 -1
- package/dist/schemes/ExecOutputScheme.js +5 -4
- package/dist/schemes/ExecOutputScheme.js.map +1 -1
- package/dist/schemes/File.d.ts.map +1 -1
- package/dist/schemes/File.js +170 -80
- package/dist/schemes/File.js.map +1 -1
- package/dist/schemes/Prompt.d.ts +2 -3
- package/dist/schemes/Prompt.d.ts.map +1 -1
- package/dist/schemes/Prompt.js +4 -7
- package/dist/schemes/Prompt.js.map +1 -1
- package/dist/schemes/Skill.d.ts.map +1 -1
- package/dist/schemes/Skill.js +3 -1
- package/dist/schemes/Skill.js.map +1 -1
- package/dist/schemes/Worker.d.ts.map +1 -1
- package/dist/schemes/Worker.js +95 -49
- package/dist/schemes/Worker.js.map +1 -1
- package/dist/schemes/_entry-crud.d.ts +5 -5
- package/dist/schemes/_entry-crud.d.ts.map +1 -1
- package/dist/schemes/_entry-crud.js +22 -17
- package/dist/schemes/_entry-crud.js.map +1 -1
- package/dist/schemes/_entry-crud.sql +58 -23
- package/dist/schemes/_entry-find.d.ts +3 -2
- package/dist/schemes/_entry-find.d.ts.map +1 -1
- package/dist/schemes/_entry-find.js +26 -25
- package/dist/schemes/_entry-find.js.map +1 -1
- package/dist/schemes/_entry-find.sql +10 -7
- package/dist/schemes/_entry-manifest.d.ts +2 -2
- package/dist/schemes/_entry-manifest.d.ts.map +1 -1
- package/dist/schemes/_entry-manifest.js +6 -5
- package/dist/schemes/_entry-manifest.js.map +1 -1
- package/dist/schemes/_entry-ops.d.ts +6 -5
- package/dist/schemes/_entry-ops.d.ts.map +1 -1
- package/dist/schemes/_entry-ops.js +39 -46
- package/dist/schemes/_entry-ops.js.map +1 -1
- package/dist/schemes/_entry-ops.sql +9 -6
- package/dist/schemes/_entry-send.d.ts +2 -2
- package/dist/schemes/_entry-send.d.ts.map +1 -1
- package/dist/schemes/_entry-send.js +16 -14
- package/dist/schemes/_entry-send.js.map +1 -1
- package/dist/schemes/_search-index.d.ts.map +1 -1
- package/dist/schemes/_search-index.js +2 -0
- package/dist/schemes/_search-index.js.map +1 -1
- package/dist/server/Daemon.d.ts +42 -10
- package/dist/server/Daemon.d.ts.map +1 -1
- package/dist/server/Daemon.js +326 -248
- package/dist/server/Daemon.js.map +1 -1
- package/dist/server/DaemonModule.d.ts +84 -19
- package/dist/server/DaemonModule.d.ts.map +1 -1
- package/dist/server/DrainSupervisor.d.ts +3 -1
- package/dist/server/DrainSupervisor.d.ts.map +1 -1
- package/dist/server/DrainSupervisor.js +11 -9
- package/dist/server/DrainSupervisor.js.map +1 -1
- package/dist/server/Functionality.d.ts +44 -0
- package/dist/server/Functionality.d.ts.map +1 -0
- package/dist/server/Functionality.js +422 -0
- package/dist/server/Functionality.js.map +1 -0
- package/dist/server/FunctionalityManager.d.ts +22 -0
- package/dist/server/FunctionalityManager.d.ts.map +1 -0
- package/dist/server/FunctionalityManager.js +121 -0
- package/dist/server/FunctionalityManager.js.map +1 -0
- package/dist/server/SkillsFunctionality.d.ts +61 -0
- package/dist/server/SkillsFunctionality.d.ts.map +1 -0
- package/dist/server/SkillsFunctionality.js +449 -0
- package/dist/server/SkillsFunctionality.js.map +1 -0
- package/dist/server/WorkerCapabilities.d.ts +21 -0
- package/dist/server/WorkerCapabilities.d.ts.map +1 -0
- package/dist/server/WorkerCapabilities.js +214 -0
- package/dist/server/WorkerCapabilities.js.map +1 -0
- package/dist/server/WorkerResidency.d.ts +40 -0
- package/dist/server/WorkerResidency.d.ts.map +1 -0
- package/dist/server/WorkerResidency.js +283 -0
- package/dist/server/WorkerResidency.js.map +1 -0
- package/dist/server/client-input.d.ts +1 -0
- package/dist/server/client-input.d.ts.map +1 -1
- package/dist/server/client-input.js +22 -1
- package/dist/server/client-input.js.map +1 -1
- package/dist/server/dispatch-as-plurnk.d.ts +2 -2
- package/dist/server/dispatch-as-plurnk.d.ts.map +1 -1
- package/dist/server/dispatch-as-plurnk.js +89 -25
- package/dist/server/dispatch-as-plurnk.js.map +1 -1
- package/dist/server/drain.sql +11 -6
- package/dist/server/envelope.d.ts +6 -1
- package/dist/server/envelope.d.ts.map +1 -1
- package/dist/server/envelope.js +8 -2
- package/dist/server/envelope.js.map +1 -1
- package/dist/server/envelope.sql +11 -3
- package/dist/server/lifecycle-recovery.sql +13 -16
- package/dist/server/loopDocs.d.ts +2 -1
- package/dist/server/loopDocs.d.ts.map +1 -1
- package/dist/server/loopDocs.js +67 -51
- package/dist/server/loopDocs.js.map +1 -1
- package/dist/server/loopDocs.sql +14 -10
- package/dist/server/module-discovery.d.ts +2 -2
- package/dist/server/module-discovery.d.ts.map +1 -1
- package/dist/server/module-discovery.js +27 -2
- package/dist/server/module-discovery.js.map +1 -1
- package/dist/server/seam-entry-read.sql +9 -7
- package/dist/server/seam-log-read.sql +1 -1
- package/dist/server/seam-loop.sql +10 -1
- package/dist/server/seam-proposal-list.sql +4 -2
- package/dist/server/worker-capabilities.sql +19 -0
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +11 -1
- package/dist/service.js.map +1 -1
- package/migrations/001_schema.sql +486 -136
- package/package.json +34 -32
- package/dist/server/skillDocs.d.ts +0 -9
- package/dist/server/skillDocs.d.ts.map +0 -1
- package/dist/server/skillDocs.js +0 -212
- package/dist/server/skillDocs.js.map +0 -1
- package/dist/server/skillDocs.sql +0 -14
- package/dist/server/workspace-capabilities.sql +0 -19
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
var _a;
|
|
2
|
+
// {§functionality-coordinator} — the one owner of the Worker Functionality
|
|
3
|
+
// lifecycle above the family adapters (Agent Skills, MCP, outbound A2A). It owns
|
|
4
|
+
// durable per-Worker state, lifecycle ordering, serialization, atomic
|
|
5
|
+
// publication, and both projections: worker-scoped client actions and a
|
|
6
|
+
// per-Worker generated executor family whose host verbs propose. An explicit
|
|
7
|
+
// client mutation and an accepted model proposal converge on `invoke`.
|
|
8
|
+
import { Validator } from "@plurnk/plurnk-contracts";
|
|
9
|
+
import FunctionalityManager, { FUNCTIONALITY_VERBS, functionalityRuntimeDecl, } from "./FunctionalityManager.js";
|
|
10
|
+
import Results, { OperationFailureError } from "../core/results.js";
|
|
11
|
+
import { generatedPathname } from "../core/plurnk-uri.js";
|
|
12
|
+
const STATE_VERSION = 1;
|
|
13
|
+
const FAMILY = /^[a-z][a-z0-9]*$/u;
|
|
14
|
+
const ALIAS = /^[a-z][a-z0-9-]*$/u;
|
|
15
|
+
const EMPTY_STATE = Object.freeze({ version: STATE_VERSION, definitions: Object.freeze({}) });
|
|
16
|
+
const SCHEMA = (name) => ({ $ref: `https://schemas.plurnk.xyz/v0/${name}.json` });
|
|
17
|
+
const ALIAS_INPUT = Object.freeze({
|
|
18
|
+
type: "object",
|
|
19
|
+
additionalProperties: false,
|
|
20
|
+
required: ["alias"],
|
|
21
|
+
properties: { alias: { type: "string", minLength: 1 } },
|
|
22
|
+
});
|
|
23
|
+
const EMPTY_INPUT = Object.freeze({ type: "object", additionalProperties: false, properties: {} });
|
|
24
|
+
const failure = (family, code, status, detail, extensions = {}) => new OperationFailureError(Results.failure("functionality", code, status, detail, {}, { family, retryable: status === 409 || status >= 500, ...extensions }));
|
|
25
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
26
|
+
class Functionality {
|
|
27
|
+
#host;
|
|
28
|
+
#adapters = new Map();
|
|
29
|
+
#owners = new Set();
|
|
30
|
+
#schemas = new Map();
|
|
31
|
+
#families = new Map();
|
|
32
|
+
#queues = new Map();
|
|
33
|
+
constructor(host) {
|
|
34
|
+
this.#host = host;
|
|
35
|
+
}
|
|
36
|
+
// {§functionality-adapter} — registration publishes the family's client
|
|
37
|
+
// actions and its Worker capability provider at once.
|
|
38
|
+
register(adapter) {
|
|
39
|
+
const { family, namespaceOwner } = adapter;
|
|
40
|
+
if (!FAMILY.test(family))
|
|
41
|
+
throw new Error(`Functionality family '${family}' must match ${FAMILY}.`);
|
|
42
|
+
if (this.#adapters.has(family))
|
|
43
|
+
throw new Error(`Functionality family '${family}' is already registered.`);
|
|
44
|
+
if (namespaceOwner.trim().length === 0)
|
|
45
|
+
throw new Error(`Functionality family '${family}' requires a namespace owner.`);
|
|
46
|
+
if (this.#owners.has(namespaceOwner))
|
|
47
|
+
throw new Error(`Functionality namespace owner '${namespaceOwner}' is already registered.`);
|
|
48
|
+
if (!isRecord(adapter.definitionSchema))
|
|
49
|
+
throw new Error(`Functionality family '${family}' requires a definition schema.`);
|
|
50
|
+
const schemas = Object.freeze({
|
|
51
|
+
list: EMPTY_INPUT,
|
|
52
|
+
discover: SCHEMA("FunctionalityDiscoverQuery"),
|
|
53
|
+
add: Object.freeze({
|
|
54
|
+
type: "object",
|
|
55
|
+
additionalProperties: false,
|
|
56
|
+
required: ["definition"],
|
|
57
|
+
properties: {
|
|
58
|
+
alias: { type: "string", minLength: 1 },
|
|
59
|
+
definition: adapter.definitionSchema,
|
|
60
|
+
},
|
|
61
|
+
}),
|
|
62
|
+
enable: ALIAS_INPUT,
|
|
63
|
+
disable: ALIAS_INPUT,
|
|
64
|
+
remove: ALIAS_INPUT,
|
|
65
|
+
});
|
|
66
|
+
this.#adapters.set(family, adapter);
|
|
67
|
+
this.#owners.add(namespaceOwner);
|
|
68
|
+
this.#schemas.set(family, schemas);
|
|
69
|
+
this.#host.registerWorkerCapabilityProvider(namespaceOwner, {
|
|
70
|
+
activate: (context) => this.#activate(adapter, context),
|
|
71
|
+
deactivate: (identity) => this.#deactivate(adapter, identity),
|
|
72
|
+
});
|
|
73
|
+
for (const verb of FUNCTIONALITY_VERBS) {
|
|
74
|
+
this.#host.registerModuleAction({
|
|
75
|
+
name: `worker.${family}.${verb}`,
|
|
76
|
+
scope: "worker",
|
|
77
|
+
inputSchema: schemas[verb],
|
|
78
|
+
outputSchema: SCHEMA(verb === "list"
|
|
79
|
+
? "FunctionalityListResult"
|
|
80
|
+
: verb === "discover"
|
|
81
|
+
? "FunctionalityDiscoverResult"
|
|
82
|
+
: "FunctionalityMutationResult"),
|
|
83
|
+
handler: async (params, context) => {
|
|
84
|
+
if (context.scope !== "worker")
|
|
85
|
+
throw new Error(`worker.${family}.${verb} requires a worker-scoped context.`);
|
|
86
|
+
const { workspaceId, workerId } = context;
|
|
87
|
+
return (await this.invoke(family, verb, params, { workspaceId, workerId }, "action")).body;
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
invoke: (verb, params, identity) => this.invoke(family, verb, params, identity, "action"),
|
|
93
|
+
refresh: (identity, options) => this.refresh(family, identity, options),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// Republish a family's unchanged state for one Worker — a live catalog
|
|
97
|
+
// change, not a lifecycle mutation. Serialized like every publication.
|
|
98
|
+
// `gate: "none"` publishes inside the caller's own held turn (turn admission
|
|
99
|
+
// refreshing a family before packet assembly) instead of contending for
|
|
100
|
+
// workspace exclusivity it could never win.
|
|
101
|
+
async refresh(family, identity, options = {}) {
|
|
102
|
+
const adapter = this.#adapter(family);
|
|
103
|
+
await this.#serialize(identity.workerId, family, async () => {
|
|
104
|
+
const current = this.#families.get(this.#key(identity.workerId, family));
|
|
105
|
+
if (current === undefined)
|
|
106
|
+
return;
|
|
107
|
+
await this.#publish(adapter, identity, current.state, {
|
|
108
|
+
failure: "publish-unavailable",
|
|
109
|
+
retain: () => this.#host.retainWorker(identity.workerId),
|
|
110
|
+
gate: options.gate ?? "wait",
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
families() {
|
|
115
|
+
return [...this.#adapters.keys()].toSorted();
|
|
116
|
+
}
|
|
117
|
+
// Await every queued publication (boundary publications included). Shutdown
|
|
118
|
+
// and tests settle before inspecting or closing durable state.
|
|
119
|
+
async settle(workerId) {
|
|
120
|
+
const pending = [...this.#queues]
|
|
121
|
+
.filter(([key]) => workerId === undefined || key.startsWith(`${workerId}:`))
|
|
122
|
+
.map(([, queue]) => queue.catch(() => undefined));
|
|
123
|
+
await Promise.all(pending);
|
|
124
|
+
}
|
|
125
|
+
// {§functionality-documents} — the family-generated documents of every
|
|
126
|
+
// published family for one Worker, addressed under its generated subtree.
|
|
127
|
+
documents(workerId) {
|
|
128
|
+
const out = [];
|
|
129
|
+
for (const [key, family] of this.#families) {
|
|
130
|
+
if (!key.startsWith(`${workerId}:`) || family.prepared === null)
|
|
131
|
+
continue;
|
|
132
|
+
for (const document of family.prepared.documents) {
|
|
133
|
+
out.push({ pathname: generatedPathname(document.pathname), content: document.content });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
// The one lifecycle entry for both projections ({§functionality-model-mutation}).
|
|
139
|
+
async invoke(family, verb, params, identity, caller) {
|
|
140
|
+
const adapter = this.#adapter(family);
|
|
141
|
+
const schema = this.#schemas.get(family)[verb];
|
|
142
|
+
const validation = Validator.validateJsonSchemaInstance(schema, params);
|
|
143
|
+
if (!validation.valid) {
|
|
144
|
+
throw failure(family, "arguments-invalid", 400, `${family} ${verb} arguments do not match their schema.`, {
|
|
145
|
+
errors: validation.errors,
|
|
146
|
+
recovery: `Conform the ${verb} arguments to the ${family} ${verb} input schema.`,
|
|
147
|
+
retryable: false,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
const input = params;
|
|
151
|
+
switch (verb) {
|
|
152
|
+
case "list": return { status: 200, body: await this.#list(adapter, identity) };
|
|
153
|
+
case "discover": return { status: 200, body: await this.#discover(adapter, input, identity) };
|
|
154
|
+
default: return this.#serialize(identity.workerId, family, () => this.#mutate(adapter, verb, input, identity, caller));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
#adapter(family) {
|
|
158
|
+
const adapter = this.#adapters.get(family);
|
|
159
|
+
if (adapter === undefined)
|
|
160
|
+
throw failure(family, "family-unknown", 404, `No Functionality family '${family}' is registered.`, { retryable: false });
|
|
161
|
+
return adapter;
|
|
162
|
+
}
|
|
163
|
+
#key(workerId, family) {
|
|
164
|
+
return `${workerId}:${family}`;
|
|
165
|
+
}
|
|
166
|
+
#serialize(workerId, family, work) {
|
|
167
|
+
const key = this.#key(workerId, family);
|
|
168
|
+
const previous = this.#queues.get(key) ?? Promise.resolve();
|
|
169
|
+
const next = previous.catch(() => undefined).then(work);
|
|
170
|
+
this.#queues.set(key, next);
|
|
171
|
+
return next;
|
|
172
|
+
}
|
|
173
|
+
async #activate(adapter, context) {
|
|
174
|
+
const identity = { workspaceId: context.workspaceId, workerId: context.workerId };
|
|
175
|
+
await this.#serialize(identity.workerId, adapter.family, async () => {
|
|
176
|
+
const state = await this.#loadState(adapter, identity.workerId);
|
|
177
|
+
await this.#publish(adapter, identity, state, { failure: "publish-unavailable", retain: context.retain, gate: "none" });
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
async #deactivate(adapter, identity) {
|
|
181
|
+
await this.#serialize(identity.workerId, adapter.family, async () => {
|
|
182
|
+
const key = this.#key(identity.workerId, adapter.family);
|
|
183
|
+
const family = this.#families.get(key);
|
|
184
|
+
this.#families.delete(key);
|
|
185
|
+
if (family?.prepared !== null && family?.prepared !== undefined) {
|
|
186
|
+
await adapter.teardown(family.prepared.snapshot, identity);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
async #loadState(adapter, workerId) {
|
|
191
|
+
const raw = await this.#host.readWorkerModuleState(workerId, adapter.namespaceOwner);
|
|
192
|
+
if (raw === null)
|
|
193
|
+
return EMPTY_STATE;
|
|
194
|
+
if (!isRecord(raw) || raw.version !== STATE_VERSION || !isRecord(raw.definitions)) {
|
|
195
|
+
throw new Error(`Functionality state for ${adapter.family} on worker ${workerId} is not a version ${STATE_VERSION} record.`);
|
|
196
|
+
}
|
|
197
|
+
const definitions = {};
|
|
198
|
+
for (const [alias, value] of Object.entries(raw.definitions)) {
|
|
199
|
+
if (!ALIAS.test(alias) || !isRecord(value))
|
|
200
|
+
throw new Error(`Functionality state for ${adapter.family} has an invalid alias '${alias}'.`);
|
|
201
|
+
const { origin, enabled, definition } = value;
|
|
202
|
+
if ((origin !== "service" && origin !== "worker") || typeof enabled !== "boolean") {
|
|
203
|
+
throw new Error(`Functionality state for ${adapter.family} alias '${alias}' is malformed.`);
|
|
204
|
+
}
|
|
205
|
+
if (origin === "worker") {
|
|
206
|
+
const result = Validator.validateJsonSchemaInstance(adapter.definitionSchema, definition);
|
|
207
|
+
if (!result.valid)
|
|
208
|
+
throw new Error(`Functionality state for ${adapter.family} alias '${alias}' holds an invalid definition.`);
|
|
209
|
+
definitions[alias] = { origin, enabled, definition: definition };
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
if (definition !== undefined)
|
|
213
|
+
throw new Error(`Functionality state for ${adapter.family} alias '${alias}' persists a service definition.`);
|
|
214
|
+
definitions[alias] = { origin, enabled };
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return { version: STATE_VERSION, definitions };
|
|
218
|
+
}
|
|
219
|
+
static #persisted(state) {
|
|
220
|
+
return Object.keys(state.definitions).length === 0 ? null : state;
|
|
221
|
+
}
|
|
222
|
+
async #effective(adapter, identity, state) {
|
|
223
|
+
const effective = new Map();
|
|
224
|
+
for (const service of await adapter.available(identity)) {
|
|
225
|
+
if (!ALIAS.test(service.alias))
|
|
226
|
+
throw new Error(`${adapter.family} service alias '${service.alias}' must match ${ALIAS}.`);
|
|
227
|
+
const record = state.definitions[service.alias];
|
|
228
|
+
const enabled = record?.origin === "service" ? record.enabled : service.enabled;
|
|
229
|
+
effective.set(service.alias, { alias: service.alias, origin: "service", definition: service.definition, enabled });
|
|
230
|
+
}
|
|
231
|
+
for (const [alias, record] of Object.entries(state.definitions)) {
|
|
232
|
+
if (record.origin !== "worker")
|
|
233
|
+
continue;
|
|
234
|
+
effective.set(alias, { alias, origin: "worker", definition: record.definition, enabled: record.enabled });
|
|
235
|
+
}
|
|
236
|
+
return new Map([...effective].toSorted(([left], [right]) => left.localeCompare(right)));
|
|
237
|
+
}
|
|
238
|
+
#projection(definition, outcome) {
|
|
239
|
+
if (!definition.enabled) {
|
|
240
|
+
return { alias: definition.alias, origin: definition.origin, state: "disabled", definition: definition.definition };
|
|
241
|
+
}
|
|
242
|
+
if (outcome === undefined)
|
|
243
|
+
throw new Error(`enabled ${definition.alias} has no preparation outcome`);
|
|
244
|
+
switch (outcome.state) {
|
|
245
|
+
case "active": return {
|
|
246
|
+
alias: definition.alias, origin: definition.origin, state: "active", definition: definition.definition,
|
|
247
|
+
...(outcome.detail === undefined ? {} : { detail: outcome.detail }),
|
|
248
|
+
};
|
|
249
|
+
case "unavailable": return { alias: definition.alias, origin: definition.origin, state: "unavailable", definition: definition.definition, problem: outcome.problem };
|
|
250
|
+
case "authorization-required": return { alias: definition.alias, origin: definition.origin, state: "authorization-required", definition: definition.definition, authorization: outcome.authorization };
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
async #list(adapter, identity) {
|
|
254
|
+
const family = this.#families.get(this.#key(identity.workerId, adapter.family));
|
|
255
|
+
if (family === undefined)
|
|
256
|
+
throw failure(adapter.family, "worker-not-resident", 409, `Worker ${identity.workerId} has no resident ${adapter.family} Functionality.`, { recovery: "Activate the Worker through an ordinary operation, then retry.", retryable: true });
|
|
257
|
+
const effective = await this.#effective(adapter, identity, family.state);
|
|
258
|
+
const outcomes = family.prepared?.outcomes ?? new Map();
|
|
259
|
+
return Validator.assertFunctionalityListResult({
|
|
260
|
+
family: adapter.family,
|
|
261
|
+
definitions: [...effective.values()].map((definition) => this.#projection(definition, outcomes.get(definition.alias))),
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
async #discover(adapter, query, identity) {
|
|
265
|
+
const candidates = await adapter.discover(query, identity);
|
|
266
|
+
return Validator.assertFunctionalityDiscoverResult({ family: adapter.family, candidates: [...candidates] });
|
|
267
|
+
}
|
|
268
|
+
async #mutate(adapter, verb, input, identity, caller) {
|
|
269
|
+
const key = this.#key(identity.workerId, adapter.family);
|
|
270
|
+
const family = this.#families.get(key);
|
|
271
|
+
if (family === undefined)
|
|
272
|
+
throw failure(adapter.family, "worker-not-resident", 409, `Worker ${identity.workerId} has no resident ${adapter.family} Functionality.`, { recovery: "Activate the Worker through an ordinary operation, then retry.", retryable: true });
|
|
273
|
+
const effective = await this.#effective(adapter, identity, family.state);
|
|
274
|
+
const definitions = { ...family.state.definitions };
|
|
275
|
+
let alias;
|
|
276
|
+
let status = 200;
|
|
277
|
+
let removed = false;
|
|
278
|
+
switch (verb) {
|
|
279
|
+
case "add": {
|
|
280
|
+
const admitted = await adapter.admit(input, identity);
|
|
281
|
+
alias = admitted.alias;
|
|
282
|
+
if (!ALIAS.test(alias))
|
|
283
|
+
throw failure(adapter.family, "alias-invalid", 400, `Alias '${alias}' must match ${ALIAS}.`, { alias, retryable: false });
|
|
284
|
+
// A worker definition may shadow a service definition of the same
|
|
285
|
+
// alias; removing it reveals the service baseline again, disabled.
|
|
286
|
+
if (effective.get(alias)?.origin === "worker")
|
|
287
|
+
throw failure(adapter.family, "alias-exists", 409, `'${alias}' is already this Worker's own definition.`, { alias, recovery: "Enable, disable, or remove the existing definition, or add under another alias.", retryable: false });
|
|
288
|
+
definitions[alias] = { origin: "worker", definition: admitted.definition, enabled: true };
|
|
289
|
+
status = 201;
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
case "enable":
|
|
293
|
+
case "disable": {
|
|
294
|
+
alias = input.alias;
|
|
295
|
+
const current = effective.get(alias);
|
|
296
|
+
if (current === undefined)
|
|
297
|
+
throw failure(adapter.family, "alias-unknown", 404, `'${alias}' is not available to this Worker.`, { alias, retryable: false });
|
|
298
|
+
definitions[alias] = current.origin === "worker"
|
|
299
|
+
? { origin: "worker", definition: current.definition, enabled: verb === "enable" }
|
|
300
|
+
: { origin: "service", enabled: verb === "enable" };
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
case "remove": {
|
|
304
|
+
alias = input.alias;
|
|
305
|
+
const current = effective.get(alias);
|
|
306
|
+
if (current === undefined)
|
|
307
|
+
throw failure(adapter.family, "alias-unknown", 404, `'${alias}' is not available to this Worker.`, { alias, retryable: false });
|
|
308
|
+
if (current.origin === "service")
|
|
309
|
+
throw failure(adapter.family, "alias-service-owned", 409, `'${alias}' is a service definition and cannot be removed here.`, { alias, recovery: `Disable it, or change the service configuration that contributes it.`, retryable: false });
|
|
310
|
+
await adapter.forget?.({ alias, definition: current.definition }, identity);
|
|
311
|
+
delete definitions[alias];
|
|
312
|
+
const revealed = (await adapter.available(identity)).some((service) => service.alias === alias);
|
|
313
|
+
if (revealed)
|
|
314
|
+
definitions[alias] = { origin: "service", enabled: false };
|
|
315
|
+
removed = true;
|
|
316
|
+
break;
|
|
317
|
+
}
|
|
318
|
+
default: throw new Error(`unreachable verb ${verb}`);
|
|
319
|
+
}
|
|
320
|
+
const nextState = { version: STATE_VERSION, definitions };
|
|
321
|
+
// Re-enabling an alias that is not active retries its preparation; an
|
|
322
|
+
// already-active alias keeps its live attachment.
|
|
323
|
+
const retry = verb === "enable" && family.prepared?.outcomes.get(alias)?.state !== "active";
|
|
324
|
+
const publication = await this.#publish(adapter, identity, nextState, {
|
|
325
|
+
failure: caller === "action" ? "reject" : "publish-unavailable",
|
|
326
|
+
retain: () => this.#host.retainWorker(identity.workerId),
|
|
327
|
+
gate: caller === "operation" ? "wait" : "try",
|
|
328
|
+
forceAlias: retry ? alias : null,
|
|
329
|
+
});
|
|
330
|
+
const effectiveAfter = await this.#effective(adapter, identity, nextState);
|
|
331
|
+
const definition = effectiveAfter.get(alias);
|
|
332
|
+
const projection = definition === undefined ? undefined : this.#projection(definition, publication.outcomes.get(alias));
|
|
333
|
+
const body = Validator.assertFunctionalityMutationResult({
|
|
334
|
+
status: projection?.state === "authorization-required" ? 202 : status,
|
|
335
|
+
family: adapter.family,
|
|
336
|
+
alias,
|
|
337
|
+
...(projection === undefined ? {} : { definition: projection }),
|
|
338
|
+
...(removed ? { removed: true } : {}),
|
|
339
|
+
});
|
|
340
|
+
return { status: body.status, body };
|
|
341
|
+
}
|
|
342
|
+
// {§functionality-publication} — prepare, publish runtimes and state in one
|
|
343
|
+
// host replacement, then commit; on any failure abort and keep the previous
|
|
344
|
+
// snapshot authoritative. A model caller's publication waits for its own
|
|
345
|
+
// turn boundary in the same serialized lane, so the next packet sees it.
|
|
346
|
+
async #publish(adapter, identity, nextState, options) {
|
|
347
|
+
const key = this.#key(identity.workerId, adapter.family);
|
|
348
|
+
const previous = this.#families.get(key)?.prepared ?? null;
|
|
349
|
+
const effective = await this.#effective(adapter, identity, nextState);
|
|
350
|
+
const enabled = new Map();
|
|
351
|
+
for (const definition of effective.values()) {
|
|
352
|
+
if (definition.enabled)
|
|
353
|
+
enabled.set(definition.alias, definition.definition);
|
|
354
|
+
}
|
|
355
|
+
const prepared = await adapter.prepare({
|
|
356
|
+
workspaceId: identity.workspaceId,
|
|
357
|
+
workerId: identity.workerId,
|
|
358
|
+
enabled,
|
|
359
|
+
previous: previous?.snapshot ?? null,
|
|
360
|
+
failure: options.failure,
|
|
361
|
+
retain: options.retain,
|
|
362
|
+
...(options.forceAlias ? { force: options.forceAlias } : {}),
|
|
363
|
+
});
|
|
364
|
+
for (const alias of enabled.keys()) {
|
|
365
|
+
if (!prepared.outcomes.has(alias))
|
|
366
|
+
throw new Error(`${adapter.family} preparation reported no outcome for enabled alias '${alias}'.`);
|
|
367
|
+
}
|
|
368
|
+
const manager = {
|
|
369
|
+
namespaceOwner: adapter.namespaceOwner,
|
|
370
|
+
decl: functionalityRuntimeDecl(adapter.family, adapter.summary),
|
|
371
|
+
executor: new FunctionalityManager({ family: adapter.family, workspaceId: identity.workspaceId, workerId: identity.workerId, coordinator: this }),
|
|
372
|
+
availability: { available: true, detail: "Worker Functionality manager" },
|
|
373
|
+
};
|
|
374
|
+
const runtimes = [manager, ...prepared.runtimes];
|
|
375
|
+
for (const runtime of prepared.runtimes) {
|
|
376
|
+
if (runtime.namespaceOwner !== adapter.namespaceOwner) {
|
|
377
|
+
await prepared.abort();
|
|
378
|
+
throw new Error(`${adapter.family} prepared a runtime owned by '${runtime.namespaceOwner}' instead of '${adapter.namespaceOwner}'.`);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
const commit = async () => {
|
|
382
|
+
// The host reconciles the Worker's documents inside the replacement,
|
|
383
|
+
// so the snapshot it reads must already be the next one; a failed
|
|
384
|
+
// replacement restores the previous snapshot before aborting.
|
|
385
|
+
const before = this.#families.get(key);
|
|
386
|
+
this.#families.set(key, { state: nextState, prepared });
|
|
387
|
+
try {
|
|
388
|
+
await this.#host.replaceWorkerCapabilities({
|
|
389
|
+
workspaceId: identity.workspaceId,
|
|
390
|
+
workerId: identity.workerId,
|
|
391
|
+
namespaceOwner: adapter.namespaceOwner,
|
|
392
|
+
state: _a.#persisted(nextState),
|
|
393
|
+
runtimes,
|
|
394
|
+
}, { gate: options.gate });
|
|
395
|
+
}
|
|
396
|
+
catch (cause) {
|
|
397
|
+
if (before === undefined)
|
|
398
|
+
this.#families.delete(key);
|
|
399
|
+
else
|
|
400
|
+
this.#families.set(key, before);
|
|
401
|
+
await prepared.abort();
|
|
402
|
+
throw cause;
|
|
403
|
+
}
|
|
404
|
+
await prepared.commit();
|
|
405
|
+
};
|
|
406
|
+
if (options.gate !== "wait") {
|
|
407
|
+
await commit();
|
|
408
|
+
return { outcomes: prepared.outcomes };
|
|
409
|
+
}
|
|
410
|
+
// Inside the caller's own turn the workspace is held by that turn:
|
|
411
|
+
// publication queues behind it in this family's lane and settles
|
|
412
|
+
// before the next packet. The caller learns the preparation outcome now.
|
|
413
|
+
const pending = (this.#queues.get(key) ?? Promise.resolve()).catch(() => undefined).then(commit);
|
|
414
|
+
this.#queues.set(key, pending.catch((cause) => {
|
|
415
|
+
console.error(`[plurnk] ${adapter.family} publication for worker ${identity.workerId} failed at its turn boundary:`, cause);
|
|
416
|
+
}));
|
|
417
|
+
return { outcomes: prepared.outcomes };
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
_a = Functionality;
|
|
421
|
+
export default Functionality;
|
|
422
|
+
//# sourceMappingURL=Functionality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Functionality.js","sourceRoot":"","sources":["../../src/server/Functionality.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { BaseExecutor } from "@plurnk/plurnk-execs";
|
|
2
|
+
import type { ChannelDecl, Effect, ExecArgs, ExecResult, RuntimeAvailability, RuntimeDecl, RuntimeToolRegistry } from "@plurnk/plurnk-execs";
|
|
3
|
+
import type Functionality from "./Functionality.ts";
|
|
4
|
+
export declare const FUNCTIONALITY_VERBS: readonly ["list", "discover", "add", "enable", "disable", "remove"];
|
|
5
|
+
export type FunctionalityVerb = (typeof FUNCTIONALITY_VERBS)[number];
|
|
6
|
+
export declare const isFunctionalityVerb: (value: string | null) => value is FunctionalityVerb;
|
|
7
|
+
export declare const functionalityRuntimeDecl: (family: string, summary: string) => RuntimeDecl;
|
|
8
|
+
export default class FunctionalityManager extends BaseExecutor {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(args: {
|
|
11
|
+
family: string;
|
|
12
|
+
workspaceId: number;
|
|
13
|
+
workerId: number;
|
|
14
|
+
coordinator: Functionality;
|
|
15
|
+
});
|
|
16
|
+
get channels(): Readonly<Record<string, ChannelDecl>>;
|
|
17
|
+
probe(): Promise<RuntimeAvailability>;
|
|
18
|
+
effect(target: string | null): Effect;
|
|
19
|
+
toolRegistry(): RuntimeToolRegistry;
|
|
20
|
+
run(args: ExecArgs): Promise<ExecResult>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=FunctionalityManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FunctionalityManager.d.ts","sourceRoot":"","sources":["../../src/server/FunctionalityManager.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE7I,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAC;AAGpD,eAAO,MAAM,mBAAmB,qEAAqF,CAAC;AACtH,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAoCrE,eAAO,MAAM,mBAAmB,UAAW,MAAM,GAAG,IAAI,KAAG,KAAK,IAAI,iBACY,CAAC;AAEjF,eAAO,MAAM,wBAAwB,WAAY,MAAM,WAAW,MAAM,KAAG,WASzE,CAAC;AAEH,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,YAAY;;IAK1D,YAAY,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,aAAa,CAAA;KAAE,EAKtG;IAED,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAEpD;IAEc,KAAK,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAEnD;IAEQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAI7C;IAED,YAAY,IAAI,mBAAmB,CAelC;IAEK,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CA0B7C;CACJ"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// {§functionality-model-projection} — the model-facing face of one managed
|
|
2
|
+
// Functionality family for one Worker. Published inside that Worker's own
|
|
3
|
+
// snapshot like every other family: its verbs are ordinary EXEC targets, its
|
|
4
|
+
// documents render through the common tool-document machinery, and a host verb
|
|
5
|
+
// proposes through the ordinary Exec proposal lifecycle. Acceptance calls the
|
|
6
|
+
// exact coordinator method a client action calls.
|
|
7
|
+
import { BaseExecutor } from "@plurnk/plurnk-execs";
|
|
8
|
+
import Results from "../core/results.js";
|
|
9
|
+
const CHANNEL = "results";
|
|
10
|
+
export const FUNCTIONALITY_VERBS = Object.freeze(["list", "discover", "add", "enable", "disable", "remove"]);
|
|
11
|
+
const READ_VERBS = new Set(["list", "discover"]);
|
|
12
|
+
const VERB_TEACHING = Object.freeze({
|
|
13
|
+
list: {
|
|
14
|
+
summary: "Project every definition with its origin, enabledness, and current state.",
|
|
15
|
+
signature: "",
|
|
16
|
+
details: "Read-only. Unavailable definitions carry their exact Problem.",
|
|
17
|
+
},
|
|
18
|
+
discover: {
|
|
19
|
+
summary: "Inspect a query or source and return inert candidates.",
|
|
20
|
+
signature: '{"query"?: string, "source"?: string}',
|
|
21
|
+
details: "Read-only. Discovery never installs, persists, enables, or executes a candidate; add one explicitly.",
|
|
22
|
+
},
|
|
23
|
+
add: {
|
|
24
|
+
summary: "Validate one exact definition, persist it for this Worker, prepare it, and enable it atomically.",
|
|
25
|
+
signature: '{"alias": string, "definition": object}',
|
|
26
|
+
details: "A host effect: it proposes and runs only on acceptance. The definition must conform to the family definition schema.",
|
|
27
|
+
},
|
|
28
|
+
enable: {
|
|
29
|
+
summary: "Prepare and publish one already-available definition.",
|
|
30
|
+
signature: '{"alias": string}',
|
|
31
|
+
details: "A host effect. Re-enabling an unavailable definition retries its preparation.",
|
|
32
|
+
},
|
|
33
|
+
disable: {
|
|
34
|
+
summary: "Withdraw the effective capability while keeping the definition available.",
|
|
35
|
+
signature: '{"alias": string}',
|
|
36
|
+
details: "A host effect. A disabled definition stays client-visible and model-invisible.",
|
|
37
|
+
},
|
|
38
|
+
remove: {
|
|
39
|
+
summary: "Disable and remove this Worker's own definition.",
|
|
40
|
+
signature: '{"alias": string}',
|
|
41
|
+
details: "A host effect. A lower-precedence service definition may become visible again, disabled. Service definitions cannot be removed; disable them.",
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
export const isFunctionalityVerb = (value) => value !== null && FUNCTIONALITY_VERBS.includes(value);
|
|
45
|
+
export const functionalityRuntimeDecl = (family, summary) => ({
|
|
46
|
+
name: family,
|
|
47
|
+
glyph: "🧩",
|
|
48
|
+
summary,
|
|
49
|
+
invocation: {
|
|
50
|
+
body: { role: "JSON arguments for the verb", required: false },
|
|
51
|
+
target: { role: "lifecycle verb", required: true, kind: "literal" },
|
|
52
|
+
example: { target: "list" },
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
export default class FunctionalityManager extends BaseExecutor {
|
|
56
|
+
#coordinator;
|
|
57
|
+
#workspaceId;
|
|
58
|
+
#workerId;
|
|
59
|
+
constructor(args) {
|
|
60
|
+
super({ runtime: args.family, glyph: "🧩" });
|
|
61
|
+
this.#coordinator = args.coordinator;
|
|
62
|
+
this.#workspaceId = args.workspaceId;
|
|
63
|
+
this.#workerId = args.workerId;
|
|
64
|
+
}
|
|
65
|
+
get channels() {
|
|
66
|
+
return { [CHANNEL]: { mimetype: "application/json" } };
|
|
67
|
+
}
|
|
68
|
+
async probe() {
|
|
69
|
+
return { available: true, detail: "Worker Functionality manager" };
|
|
70
|
+
}
|
|
71
|
+
effect(target) {
|
|
72
|
+
// An unknown verb is refused at run; gating it as host keeps an invalid
|
|
73
|
+
// invocation from ever running ungated.
|
|
74
|
+
return isFunctionalityVerb(target) && READ_VERBS.has(target) ? "read" : "host";
|
|
75
|
+
}
|
|
76
|
+
toolRegistry() {
|
|
77
|
+
return {
|
|
78
|
+
tools: FUNCTIONALITY_VERBS.map((verb) => ({
|
|
79
|
+
target: verb,
|
|
80
|
+
summary: VERB_TEACHING[verb].summary,
|
|
81
|
+
invocation: {
|
|
82
|
+
body: { role: "JSON arguments", required: VERB_TEACHING[verb].signature.length > 0 },
|
|
83
|
+
target: { role: "lifecycle verb", required: true, kind: "literal" },
|
|
84
|
+
...(VERB_TEACHING[verb].signature.length > 0
|
|
85
|
+
? { signature: VERB_TEACHING[verb].signature }
|
|
86
|
+
: { example: { target: verb } }),
|
|
87
|
+
},
|
|
88
|
+
details: VERB_TEACHING[verb].details,
|
|
89
|
+
})),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
async run(args) {
|
|
93
|
+
const verb = args.target;
|
|
94
|
+
if (!isFunctionalityVerb(verb)) {
|
|
95
|
+
return Results.failure("functionality", "verb-unknown", 400, `'${verb ?? ""}' is not a ${this.runtime} lifecycle verb.`, {}, {
|
|
96
|
+
recovery: `Select one of ${FUNCTIONALITY_VERBS.join(", ")}.`,
|
|
97
|
+
retryable: false,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
let params = {};
|
|
101
|
+
if (args.body.trim().length > 0) {
|
|
102
|
+
try {
|
|
103
|
+
params = JSON.parse(args.body);
|
|
104
|
+
}
|
|
105
|
+
catch (cause) {
|
|
106
|
+
return Results.failure("functionality", "arguments-not-json", 400, `The ${verb} body must be a JSON object.`, {}, {
|
|
107
|
+
recovery: `Supply ${VERB_TEACHING[verb].signature || "no body"}.`,
|
|
108
|
+
retryable: false,
|
|
109
|
+
cause: cause instanceof Error ? cause.message : String(cause),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const identity = { workspaceId: this.#workspaceId, workerId: this.#workerId };
|
|
114
|
+
const result = await this.#coordinator.invoke(this.runtime, verb, params, identity, "operation");
|
|
115
|
+
args.setState(CHANNEL, "active");
|
|
116
|
+
args.write(CHANNEL, JSON.stringify(result.body, null, 2), "application/json");
|
|
117
|
+
args.setState(CHANNEL, "closed");
|
|
118
|
+
return { status: result.status };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=FunctionalityManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FunctionalityManager.js","sourceRoot":"","sources":["../../src/server/FunctionalityManager.ts"],"names":[],"mappings":"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"}
|