@agimon-ai/doompi-minor-mode 0.0.1-alpha.100
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/LICENSE +21 -0
- package/README.md +3 -0
- package/dist/apiContracts.cjs +17 -0
- package/dist/apiContracts.cjs.map +1 -0
- package/dist/apiContracts.d.mts +53 -0
- package/dist/apiContracts.d.mts.map +1 -0
- package/dist/apiContracts.mjs +13 -0
- package/dist/apiContracts.mjs.map +1 -0
- package/dist/catalog-8apySKXB.mjs +222 -0
- package/dist/catalog-8apySKXB.mjs.map +1 -0
- package/dist/catalog-jTd7UXiI.cjs +227 -0
- package/dist/catalog-jTd7UXiI.cjs.map +1 -0
- package/dist/catalog.cjs +3 -0
- package/dist/catalog.d.mts +14 -0
- package/dist/catalog.d.mts.map +1 -0
- package/dist/catalog.mjs +2 -0
- package/dist/command-B5HZmmyU.cjs +11 -0
- package/dist/command-B5HZmmyU.cjs.map +1 -0
- package/dist/command-BvYpwiin.mjs +6 -0
- package/dist/command-BvYpwiin.mjs.map +1 -0
- package/dist/command-C4u3oOPT.mjs +128 -0
- package/dist/command-C4u3oOPT.mjs.map +1 -0
- package/dist/command-D9hQfJb_.cjs +151 -0
- package/dist/command-D9hQfJb_.cjs.map +1 -0
- package/dist/command.cjs +8 -0
- package/dist/command.d.mts +6 -0
- package/dist/command.d.mts.map +1 -0
- package/dist/command.mjs +3 -0
- package/dist/extensions/pi.cjs +181 -0
- package/dist/extensions/pi.cjs.map +1 -0
- package/dist/extensions/pi.d.mts +5 -0
- package/dist/extensions/pi.d.mts.map +1 -0
- package/dist/extensions/pi.mjs +176 -0
- package/dist/extensions/pi.mjs.map +1 -0
- package/dist/extensions/server.cjs +134 -0
- package/dist/extensions/server.cjs.map +1 -0
- package/dist/extensions/server.d.mts +5 -0
- package/dist/extensions/server.d.mts.map +1 -0
- package/dist/extensions/server.mjs +129 -0
- package/dist/extensions/server.mjs.map +1 -0
- package/dist/headlessCommand-BJhocUje.mjs +53 -0
- package/dist/headlessCommand-BJhocUje.mjs.map +1 -0
- package/dist/headlessCommand-CaFFcvJA.cjs +58 -0
- package/dist/headlessCommand-CaFFcvJA.cjs.map +1 -0
- package/dist/index-COS4uLcb.d.mts +24 -0
- package/dist/index-COS4uLcb.d.mts.map +1 -0
- package/dist/index-DEjyk6tg.d.mts +8 -0
- package/dist/index-DEjyk6tg.d.mts.map +1 -0
- package/dist/index-DSKnT657.d.mts +31 -0
- package/dist/index-DSKnT657.d.mts.map +1 -0
- package/dist/index.cjs +180 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +53 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +136 -0
- package/dist/index.mjs.map +1 -0
- package/dist/minorModeCommand.cjs +5 -0
- package/dist/minorModeCommand.d.mts +2 -0
- package/dist/minorModeCommand.mjs +2 -0
- package/dist/mode-BwRkDqO4.mjs +241 -0
- package/dist/mode-BwRkDqO4.mjs.map +1 -0
- package/dist/mode-Dft08ke8.cjs +444 -0
- package/dist/mode-Dft08ke8.cjs.map +1 -0
- package/dist/mode-EZWqhrYy.d.mts +492 -0
- package/dist/mode-EZWqhrYy.d.mts.map +1 -0
- package/dist/mode.cjs +36 -0
- package/dist/mode.d.mts +2 -0
- package/dist/mode.mjs +2 -0
- package/dist/modeDefinition-BcqEwTzh.mjs +46 -0
- package/dist/modeDefinition-BcqEwTzh.mjs.map +1 -0
- package/dist/modeDefinition-BtgwqXMo.cjs +51 -0
- package/dist/modeDefinition-BtgwqXMo.cjs.map +1 -0
- package/dist/modeDefinition.cjs +3 -0
- package/dist/modeDefinition.d.mts +2 -0
- package/dist/modeDefinition.mjs +2 -0
- package/dist/owner-BbCQufLu.cjs +14 -0
- package/dist/owner-BbCQufLu.cjs.map +1 -0
- package/dist/owner-Bs55c_qE.mjs +9 -0
- package/dist/owner-Bs55c_qE.mjs.map +1 -0
- package/dist/owner.cjs +3 -0
- package/dist/owner.d.mts +2 -0
- package/dist/owner.mjs +2 -0
- package/dist/projection-Cy1LWVIe.mjs +47 -0
- package/dist/projection-Cy1LWVIe.mjs.map +1 -0
- package/dist/projection-DYOm9Kev.cjs +58 -0
- package/dist/projection-DYOm9Kev.cjs.map +1 -0
- package/dist/projection.cjs +4 -0
- package/dist/projection.d.mts +12 -0
- package/dist/projection.d.mts.map +1 -0
- package/dist/projection.mjs +2 -0
- package/dist/reloadHandoff-C-GaCf0F.cjs +71 -0
- package/dist/reloadHandoff-C-GaCf0F.cjs.map +1 -0
- package/dist/reloadHandoff-D1QsS9qd.mjs +54 -0
- package/dist/reloadHandoff-D1QsS9qd.mjs.map +1 -0
- package/dist/reloadHandoff.cjs +5 -0
- package/dist/reloadHandoff.d.mts +11 -0
- package/dist/reloadHandoff.d.mts.map +1 -0
- package/dist/reloadHandoff.mjs +2 -0
- package/dist/validation-BuQc8UrL.mjs +81 -0
- package/dist/validation-BuQc8UrL.mjs.map +1 -0
- package/dist/validation-DRV8Dtoc.cjs +104 -0
- package/dist/validation-DRV8Dtoc.cjs.map +1 -0
- package/package.json +157 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modeDefinition-BtgwqXMo.cjs","names":[],"sources":["../src/services/modeDefinition/index.ts"],"sourcesContent":["import type {\n MinorModeArguments,\n MinorModeDescriptor,\n MinorModeOwnerActionResult,\n MinorModeOwnerHandle,\n MinorModeState,\n} from '../../schemas/mode';\n\nexport interface MinorModeExecution {\n readonly signal: AbortSignal;\n}\n\nexport interface MinorModeDefinition<TRuntime, TExecution extends MinorModeExecution = MinorModeExecution> {\n readonly descriptor: MinorModeDescriptor;\n state(runtime: TRuntime): MinorModeState;\n handleAction(\n runtime: TRuntime,\n actionId: string,\n argumentsValue: MinorModeArguments,\n execution: TExecution,\n ): MinorModeOwnerActionResult | void | Promise<MinorModeOwnerActionResult | void>;\n}\n\nexport interface MinorModeOwner<TExecution extends MinorModeExecution = MinorModeExecution> {\n readonly definition: {\n readonly descriptor: MinorModeDescriptor;\n readonly initialState: MinorModeState;\n handleAction(\n actionId: string,\n argumentsValue: MinorModeArguments,\n execution: TExecution,\n ): Promise<MinorModeOwnerActionResult | void>;\n };\n state(): MinorModeState;\n publish(): void;\n attach(handle: MinorModeOwnerHandle): void;\n detach(): void;\n subscribe(listener: () => void): () => void;\n}\n\nexport interface DefinedMinorMode<TRuntime, TExecution extends MinorModeExecution = MinorModeExecution> {\n readonly descriptor: MinorModeDescriptor;\n createOwner(runtime: TRuntime): MinorModeOwner<TExecution>;\n}\n\n/** Shares one typed mode definition across Pi and session-server owners. */\nexport function defineMinorMode<TRuntime, TExecution extends MinorModeExecution = MinorModeExecution>(\n mode: MinorModeDefinition<TRuntime, TExecution>,\n): DefinedMinorMode<TRuntime, TExecution> {\n return {\n descriptor: mode.descriptor,\n createOwner(runtime: TRuntime): MinorModeOwner<TExecution> {\n let handle: MinorModeOwnerHandle | undefined;\n const listeners = new Set<() => void>();\n const state = (): MinorModeState => mode.state(runtime);\n const publish = (): void => {\n handle?.publish(state());\n listeners.forEach((listener) => listener());\n };\n return {\n definition: {\n descriptor: mode.descriptor,\n initialState: state(),\n async handleAction(actionId: string, args: MinorModeArguments, execution: TExecution) {\n execution.signal.throwIfAborted();\n const result = await mode.handleAction(runtime, actionId, args, execution);\n publish();\n return result;\n },\n },\n state,\n publish,\n attach: (owner: MinorModeOwnerHandle) => {\n handle = owner;\n },\n detach: () => {\n handle = undefined;\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n },\n };\n}\n"],"mappings":";;AA8CA,SAAgB,gBACd,MACwC;CACxC,OAAO;EACL,YAAY,KAAK;EACjB,YAAY,SAA+C;GACzD,IAAI;GACJ,MAAM,4BAAY,IAAI,IAAgB;GACtC,MAAM,cAA8B,KAAK,MAAM,OAAO;GACtD,MAAM,gBAAsB;IAC1B,QAAQ,QAAQ,MAAM,CAAC;IACvB,UAAU,SAAS,aAAa,SAAS,CAAC;GAC5C;GACA,OAAO;IACL,YAAY;KACV,YAAY,KAAK;KACjB,cAAc,MAAM;KACpB,MAAM,aAAa,UAAkB,MAA0B,WAAuB;MACpF,UAAU,OAAO,eAAe;MAChC,MAAM,SAAS,MAAM,KAAK,aAAa,SAAS,UAAU,MAAM,SAAS;MACzE,QAAQ;MACR,OAAO;KACT;IACF;IACA;IACA;IACA,SAAS,UAAgC;KACvC,SAAS;IACX;IACA,cAAc;KACZ,SAAS,KAAA;IACX;IACA,UAAU,UAAU;KAClB,UAAU,IAAI,QAAQ;KACtB,aAAa;MACX,UAAU,OAAO,QAAQ;KAC3B;IACF;GACF;EACF;CACF;AACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//#region src/services/owner/index.ts
|
|
2
|
+
/** Register an owner directly with the injected session catalog. */
|
|
3
|
+
function registerMinorModeOwner(catalog, definition) {
|
|
4
|
+
return catalog.registerOwner(definition);
|
|
5
|
+
}
|
|
6
|
+
//#endregion
|
|
7
|
+
Object.defineProperty(exports, "registerMinorModeOwner", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function() {
|
|
10
|
+
return registerMinorModeOwner;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=owner-BbCQufLu.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-BbCQufLu.cjs","names":[],"sources":["../src/services/owner/index.ts"],"sourcesContent":["import type { DoomExtensionContext } from '@agimon-ai/doompi-core/runtimeConfig';\n\nimport type { MinorModeCatalogService, MinorModeOwnerDefinition, MinorModeOwnerHandle } from '../../schemas/mode';\n\n/** Register an owner directly with the injected session catalog. */\nexport function registerMinorModeOwner<ExtensionContext extends DoomExtensionContext>(\n catalog: MinorModeCatalogService,\n definition: MinorModeOwnerDefinition<ExtensionContext>,\n): MinorModeOwnerHandle {\n return catalog.registerOwner(definition);\n}\n"],"mappings":";;AAKA,SAAgB,uBACd,SACA,YACsB;CACtB,OAAO,QAAQ,cAAc,UAAU;AACzC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region src/services/owner/index.ts
|
|
2
|
+
/** Register an owner directly with the injected session catalog. */
|
|
3
|
+
function registerMinorModeOwner(catalog, definition) {
|
|
4
|
+
return catalog.registerOwner(definition);
|
|
5
|
+
}
|
|
6
|
+
//#endregion
|
|
7
|
+
export { registerMinorModeOwner as t };
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=owner-Bs55c_qE.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-Bs55c_qE.mjs","names":[],"sources":["../src/services/owner/index.ts"],"sourcesContent":["import type { DoomExtensionContext } from '@agimon-ai/doompi-core/runtimeConfig';\n\nimport type { MinorModeCatalogService, MinorModeOwnerDefinition, MinorModeOwnerHandle } from '../../schemas/mode';\n\n/** Register an owner directly with the injected session catalog. */\nexport function registerMinorModeOwner<ExtensionContext extends DoomExtensionContext>(\n catalog: MinorModeCatalogService,\n definition: MinorModeOwnerDefinition<ExtensionContext>,\n): MinorModeOwnerHandle {\n return catalog.registerOwner(definition);\n}\n"],"mappings":";;AAKA,SAAgB,uBACd,SACA,YACsB;CACtB,OAAO,QAAQ,cAAc,UAAU;AACzC"}
|
package/dist/owner.cjs
ADDED
package/dist/owner.d.mts
ADDED
package/dist/owner.mjs
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import "./mode-BwRkDqO4.mjs";
|
|
2
|
+
//#region src/services/projection/index.ts
|
|
3
|
+
/**
|
|
4
|
+
* The catalog as a client should see it: one entry per mode, sorted the way
|
|
5
|
+
* the leader menu sorts, with only the actions this session kind can take and
|
|
6
|
+
* none of the registration bookkeeping a client has no use for.
|
|
7
|
+
*/
|
|
8
|
+
function projectMinorModes(snapshot, kind) {
|
|
9
|
+
const modes = snapshot.modes.map((record) => ({
|
|
10
|
+
id: record.descriptor.id,
|
|
11
|
+
label: record.descriptor.label,
|
|
12
|
+
description: record.descriptor.description,
|
|
13
|
+
order: record.descriptor.order,
|
|
14
|
+
activation: record.state.activation,
|
|
15
|
+
condition: record.state.condition,
|
|
16
|
+
...record.state.detail ? { detail: record.state.detail } : {},
|
|
17
|
+
actions: record.descriptor.actions.filter((action) => action.contexts.includes(kind)).map((action) => {
|
|
18
|
+
const availability = record.state.actions.find((entry) => entry.id === action.id);
|
|
19
|
+
return {
|
|
20
|
+
id: action.id,
|
|
21
|
+
label: action.label,
|
|
22
|
+
description: action.description,
|
|
23
|
+
enabled: availability?.enabled !== false,
|
|
24
|
+
...availability?.disabledReason ? { disabledReason: availability.disabledReason } : {},
|
|
25
|
+
needsInput: action.parameters.some((parameter) => parameter.required)
|
|
26
|
+
};
|
|
27
|
+
})
|
|
28
|
+
})).sort((left, right) => left.order - right.order || left.label.localeCompare(right.label));
|
|
29
|
+
return {
|
|
30
|
+
version: 1,
|
|
31
|
+
revision: snapshot.revision,
|
|
32
|
+
modes
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Reads the latest valid persisted activation set; absence preserves caller defaults. */
|
|
36
|
+
function restoreMinorModeSelection(entries) {
|
|
37
|
+
for (const entry of [...entries].reverse()) {
|
|
38
|
+
if (!entry || typeof entry !== "object" || !("customType" in entry) || entry.customType !== "doom-minor-modes" || !("data" in entry)) continue;
|
|
39
|
+
const data = entry.data;
|
|
40
|
+
if (!data || typeof data !== "object" || !("modes" in data) || !Array.isArray(data.modes)) continue;
|
|
41
|
+
return [...new Set(data.modes.filter((mode) => mode && typeof mode === "object" && mode.activation === "active" && typeof mode.id === "string").map((mode) => mode.id))];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//#endregion
|
|
45
|
+
export { restoreMinorModeSelection as n, projectMinorModes as t };
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=projection-Cy1LWVIe.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection-Cy1LWVIe.mjs","names":[],"sources":["../src/services/projection/index.ts"],"sourcesContent":["import { DOOM_MINOR_MODE_ENTRY_TYPE } from '../../schemas/mode';\nimport type {\n MinorModeCatalogSnapshot,\n MinorModeProjection,\n MinorModeRecordProjection,\n MinorModeSessionKind,\n} from '../../schemas/mode';\n\n/**\n * The catalog as a client should see it: one entry per mode, sorted the way\n * the leader menu sorts, with only the actions this session kind can take and\n * none of the registration bookkeeping a client has no use for.\n */\nexport function projectMinorModes(snapshot: MinorModeCatalogSnapshot, kind: MinorModeSessionKind): MinorModeProjection {\n const modes: MinorModeRecordProjection[] = snapshot.modes\n .map((record) => ({\n id: record.descriptor.id,\n label: record.descriptor.label,\n description: record.descriptor.description,\n order: record.descriptor.order,\n activation: record.state.activation,\n condition: record.state.condition,\n ...(record.state.detail ? { detail: record.state.detail } : {}),\n actions: record.descriptor.actions\n .filter((action) => action.contexts.includes(kind))\n .map((action) => {\n const availability = record.state.actions.find((entry) => entry.id === action.id);\n return {\n id: action.id,\n label: action.label,\n description: action.description,\n enabled: availability?.enabled !== false,\n ...(availability?.disabledReason ? { disabledReason: availability.disabledReason } : {}),\n needsInput: action.parameters.some((parameter) => parameter.required),\n };\n }),\n }))\n .sort((left, right) => left.order - right.order || left.label.localeCompare(right.label));\n return { version: 1, revision: snapshot.revision, modes };\n}\n\n/** Reads the latest valid persisted activation set; absence preserves caller defaults. */\nexport function restoreMinorModeSelection(entries: readonly unknown[]): string[] | undefined {\n for (const entry of [...entries].reverse()) {\n if (\n !entry ||\n typeof entry !== 'object' ||\n !('customType' in entry) ||\n entry.customType !== DOOM_MINOR_MODE_ENTRY_TYPE ||\n !('data' in entry)\n )\n continue;\n const data = entry.data;\n if (!data || typeof data !== 'object' || !('modes' in data) || !Array.isArray(data.modes)) continue;\n return [\n ...new Set(\n data.modes\n .filter(\n (mode) => mode && typeof mode === 'object' && mode.activation === 'active' && typeof mode.id === 'string',\n )\n .map((mode) => mode.id as string),\n ),\n ];\n }\n return undefined;\n}\n"],"mappings":";;;;;;;AAaA,SAAgB,kBAAkB,UAAoC,MAAiD;CACrH,MAAM,QAAqC,SAAS,MACjD,KAAK,YAAY;EAChB,IAAI,OAAO,WAAW;EACtB,OAAO,OAAO,WAAW;EACzB,aAAa,OAAO,WAAW;EAC/B,OAAO,OAAO,WAAW;EACzB,YAAY,OAAO,MAAM;EACzB,WAAW,OAAO,MAAM;EACxB,GAAI,OAAO,MAAM,SAAS,EAAE,QAAQ,OAAO,MAAM,OAAO,IAAI,CAAC;EAC7D,SAAS,OAAO,WAAW,QACxB,QAAQ,WAAW,OAAO,SAAS,SAAS,IAAI,CAAC,CAAC,CAClD,KAAK,WAAW;GACf,MAAM,eAAe,OAAO,MAAM,QAAQ,MAAM,UAAU,MAAM,OAAO,OAAO,EAAE;GAChF,OAAO;IACL,IAAI,OAAO;IACX,OAAO,OAAO;IACd,aAAa,OAAO;IACpB,SAAS,cAAc,YAAY;IACnC,GAAI,cAAc,iBAAiB,EAAE,gBAAgB,aAAa,eAAe,IAAI,CAAC;IACtF,YAAY,OAAO,WAAW,MAAM,cAAc,UAAU,QAAQ;GACtE;EACF,CAAC;CACL,EAAE,CAAC,CACF,MAAM,MAAM,UAAU,KAAK,QAAQ,MAAM,SAAS,KAAK,MAAM,cAAc,MAAM,KAAK,CAAC;CAC1F,OAAO;EAAE,SAAS;EAAG,UAAU,SAAS;EAAU;CAAM;AAC1D;;AAGA,SAAgB,0BAA0B,SAAmD;CAC3F,KAAK,MAAM,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG;EAC1C,IACE,CAAC,SACD,OAAO,UAAU,YACjB,EAAE,gBAAgB,UAClB,MAAM,eAAA,sBACN,EAAE,UAAU,QAEZ;EACF,MAAM,OAAO,MAAM;EACnB,IAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,EAAE,WAAW,SAAS,CAAC,MAAM,QAAQ,KAAK,KAAK,GAAG;EAC3F,OAAO,CACL,GAAG,IAAI,IACL,KAAK,MACF,QACE,SAAS,QAAQ,OAAO,SAAS,YAAY,KAAK,eAAe,YAAY,OAAO,KAAK,OAAO,QACnG,CAAC,CACA,KAAK,SAAS,KAAK,EAAY,CACpC,CACF;CACF;AAEF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require("./mode-Dft08ke8.cjs");
|
|
2
|
+
//#region src/services/projection/index.ts
|
|
3
|
+
/**
|
|
4
|
+
* The catalog as a client should see it: one entry per mode, sorted the way
|
|
5
|
+
* the leader menu sorts, with only the actions this session kind can take and
|
|
6
|
+
* none of the registration bookkeeping a client has no use for.
|
|
7
|
+
*/
|
|
8
|
+
function projectMinorModes(snapshot, kind) {
|
|
9
|
+
const modes = snapshot.modes.map((record) => ({
|
|
10
|
+
id: record.descriptor.id,
|
|
11
|
+
label: record.descriptor.label,
|
|
12
|
+
description: record.descriptor.description,
|
|
13
|
+
order: record.descriptor.order,
|
|
14
|
+
activation: record.state.activation,
|
|
15
|
+
condition: record.state.condition,
|
|
16
|
+
...record.state.detail ? { detail: record.state.detail } : {},
|
|
17
|
+
actions: record.descriptor.actions.filter((action) => action.contexts.includes(kind)).map((action) => {
|
|
18
|
+
const availability = record.state.actions.find((entry) => entry.id === action.id);
|
|
19
|
+
return {
|
|
20
|
+
id: action.id,
|
|
21
|
+
label: action.label,
|
|
22
|
+
description: action.description,
|
|
23
|
+
enabled: availability?.enabled !== false,
|
|
24
|
+
...availability?.disabledReason ? { disabledReason: availability.disabledReason } : {},
|
|
25
|
+
needsInput: action.parameters.some((parameter) => parameter.required)
|
|
26
|
+
};
|
|
27
|
+
})
|
|
28
|
+
})).sort((left, right) => left.order - right.order || left.label.localeCompare(right.label));
|
|
29
|
+
return {
|
|
30
|
+
version: 1,
|
|
31
|
+
revision: snapshot.revision,
|
|
32
|
+
modes
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Reads the latest valid persisted activation set; absence preserves caller defaults. */
|
|
36
|
+
function restoreMinorModeSelection(entries) {
|
|
37
|
+
for (const entry of [...entries].reverse()) {
|
|
38
|
+
if (!entry || typeof entry !== "object" || !("customType" in entry) || entry.customType !== "doom-minor-modes" || !("data" in entry)) continue;
|
|
39
|
+
const data = entry.data;
|
|
40
|
+
if (!data || typeof data !== "object" || !("modes" in data) || !Array.isArray(data.modes)) continue;
|
|
41
|
+
return [...new Set(data.modes.filter((mode) => mode && typeof mode === "object" && mode.activation === "active" && typeof mode.id === "string").map((mode) => mode.id))];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//#endregion
|
|
45
|
+
Object.defineProperty(exports, "projectMinorModes", {
|
|
46
|
+
enumerable: true,
|
|
47
|
+
get: function() {
|
|
48
|
+
return projectMinorModes;
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
Object.defineProperty(exports, "restoreMinorModeSelection", {
|
|
52
|
+
enumerable: true,
|
|
53
|
+
get: function() {
|
|
54
|
+
return restoreMinorModeSelection;
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=projection-DYOm9Kev.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection-DYOm9Kev.cjs","names":[],"sources":["../src/services/projection/index.ts"],"sourcesContent":["import { DOOM_MINOR_MODE_ENTRY_TYPE } from '../../schemas/mode';\nimport type {\n MinorModeCatalogSnapshot,\n MinorModeProjection,\n MinorModeRecordProjection,\n MinorModeSessionKind,\n} from '../../schemas/mode';\n\n/**\n * The catalog as a client should see it: one entry per mode, sorted the way\n * the leader menu sorts, with only the actions this session kind can take and\n * none of the registration bookkeeping a client has no use for.\n */\nexport function projectMinorModes(snapshot: MinorModeCatalogSnapshot, kind: MinorModeSessionKind): MinorModeProjection {\n const modes: MinorModeRecordProjection[] = snapshot.modes\n .map((record) => ({\n id: record.descriptor.id,\n label: record.descriptor.label,\n description: record.descriptor.description,\n order: record.descriptor.order,\n activation: record.state.activation,\n condition: record.state.condition,\n ...(record.state.detail ? { detail: record.state.detail } : {}),\n actions: record.descriptor.actions\n .filter((action) => action.contexts.includes(kind))\n .map((action) => {\n const availability = record.state.actions.find((entry) => entry.id === action.id);\n return {\n id: action.id,\n label: action.label,\n description: action.description,\n enabled: availability?.enabled !== false,\n ...(availability?.disabledReason ? { disabledReason: availability.disabledReason } : {}),\n needsInput: action.parameters.some((parameter) => parameter.required),\n };\n }),\n }))\n .sort((left, right) => left.order - right.order || left.label.localeCompare(right.label));\n return { version: 1, revision: snapshot.revision, modes };\n}\n\n/** Reads the latest valid persisted activation set; absence preserves caller defaults. */\nexport function restoreMinorModeSelection(entries: readonly unknown[]): string[] | undefined {\n for (const entry of [...entries].reverse()) {\n if (\n !entry ||\n typeof entry !== 'object' ||\n !('customType' in entry) ||\n entry.customType !== DOOM_MINOR_MODE_ENTRY_TYPE ||\n !('data' in entry)\n )\n continue;\n const data = entry.data;\n if (!data || typeof data !== 'object' || !('modes' in data) || !Array.isArray(data.modes)) continue;\n return [\n ...new Set(\n data.modes\n .filter(\n (mode) => mode && typeof mode === 'object' && mode.activation === 'active' && typeof mode.id === 'string',\n )\n .map((mode) => mode.id as string),\n ),\n ];\n }\n return undefined;\n}\n"],"mappings":";;;;;;;AAaA,SAAgB,kBAAkB,UAAoC,MAAiD;CACrH,MAAM,QAAqC,SAAS,MACjD,KAAK,YAAY;EAChB,IAAI,OAAO,WAAW;EACtB,OAAO,OAAO,WAAW;EACzB,aAAa,OAAO,WAAW;EAC/B,OAAO,OAAO,WAAW;EACzB,YAAY,OAAO,MAAM;EACzB,WAAW,OAAO,MAAM;EACxB,GAAI,OAAO,MAAM,SAAS,EAAE,QAAQ,OAAO,MAAM,OAAO,IAAI,CAAC;EAC7D,SAAS,OAAO,WAAW,QACxB,QAAQ,WAAW,OAAO,SAAS,SAAS,IAAI,CAAC,CAAC,CAClD,KAAK,WAAW;GACf,MAAM,eAAe,OAAO,MAAM,QAAQ,MAAM,UAAU,MAAM,OAAO,OAAO,EAAE;GAChF,OAAO;IACL,IAAI,OAAO;IACX,OAAO,OAAO;IACd,aAAa,OAAO;IACpB,SAAS,cAAc,YAAY;IACnC,GAAI,cAAc,iBAAiB,EAAE,gBAAgB,aAAa,eAAe,IAAI,CAAC;IACtF,YAAY,OAAO,WAAW,MAAM,cAAc,UAAU,QAAQ;GACtE;EACF,CAAC;CACL,EAAE,CAAC,CACF,MAAM,MAAM,UAAU,KAAK,QAAQ,MAAM,SAAS,KAAK,MAAM,cAAc,MAAM,KAAK,CAAC;CAC1F,OAAO;EAAE,SAAS;EAAG,UAAU,SAAS;EAAU;CAAM;AAC1D;;AAGA,SAAgB,0BAA0B,SAAmD;CAC3F,KAAK,MAAM,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG;EAC1C,IACE,CAAC,SACD,OAAO,UAAU,YACjB,EAAE,gBAAgB,UAClB,MAAM,eAAA,sBACN,EAAE,UAAU,QAEZ;EACF,MAAM,OAAO,MAAM;EACnB,IAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,EAAE,WAAW,SAAS,CAAC,MAAM,QAAQ,KAAK,KAAK,GAAG;EAC3F,OAAO,CACL,GAAG,IAAI,IACL,KAAK,MACF,QACE,SAAS,QAAQ,OAAO,SAAS,YAAY,KAAK,eAAe,YAAY,OAAO,KAAK,OAAO,QACnG,CAAC,CACA,KAAK,SAAS,KAAK,EAAY,CACpC,CACF;CACF;AAEF"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_projection = require("./projection-DYOm9Kev.cjs");
|
|
3
|
+
exports.projectMinorModes = require_projection.projectMinorModes;
|
|
4
|
+
exports.restoreMinorModeSelection = require_projection.restoreMinorModeSelection;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { O as MinorModeCatalogSnapshot, V as MinorModeProjection, Y as MinorModeSessionKind } from "./mode-EZWqhrYy.mjs";
|
|
2
|
+
//#region src/services/projection/index.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* The catalog as a client should see it: one entry per mode, sorted the way
|
|
5
|
+
* the leader menu sorts, with only the actions this session kind can take and
|
|
6
|
+
* none of the registration bookkeeping a client has no use for.
|
|
7
|
+
*/
|
|
8
|
+
export declare function projectMinorModes(snapshot: MinorModeCatalogSnapshot, kind: MinorModeSessionKind): MinorModeProjection;
|
|
9
|
+
/** Reads the latest valid persisted activation set; absence preserves caller defaults. */
|
|
10
|
+
export declare function restoreMinorModeSelection(entries: readonly unknown[]): string[] | undefined;
|
|
11
|
+
//#endregion
|
|
12
|
+
//# sourceMappingURL=projection.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.d.mts","names":[],"sources":["../src/services/projection/index.ts"],"mappings":";;;;;;;wBAagB,kBAAkB,UAAU,0BAA0B,MAAM,uBAAuB;;wBA6BnF,0BAA0B"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
const require_mode = require("./mode-Dft08ke8.cjs");
|
|
2
|
+
let _agimon_ai_doompi_core_runtimeTransition = require("@agimon-ai/doompi-core/runtimeTransition");
|
|
3
|
+
//#region src/services/reloadHandoff/index.ts
|
|
4
|
+
const MINOR_MODE_RELOAD_HANDOFF_SYMBOL = Symbol.for("@agimon-ai/doompi.minor-mode-reload-handoff.v1");
|
|
5
|
+
const MINOR_MODE_RELOAD_HANDOFF_TTL_MS = 6e4;
|
|
6
|
+
function reloadHandoffRegistry() {
|
|
7
|
+
const globalRegistry = globalThis;
|
|
8
|
+
const existing = globalRegistry[MINOR_MODE_RELOAD_HANDOFF_SYMBOL];
|
|
9
|
+
if (existing) return existing;
|
|
10
|
+
const created = { records: /* @__PURE__ */ new Map() };
|
|
11
|
+
globalRegistry[MINOR_MODE_RELOAD_HANDOFF_SYMBOL] = created;
|
|
12
|
+
return created;
|
|
13
|
+
}
|
|
14
|
+
function pruneExpiredReloadHandoffs(now = Date.now()) {
|
|
15
|
+
for (const [sessionId, handoff] of reloadHandoffRegistry().records) if (handoff.expiresAt <= now) reloadHandoffRegistry().records.delete(sessionId);
|
|
16
|
+
}
|
|
17
|
+
function prepareMinorModeReloadHandoff(context, sessionId, transitionHostGeneration, operationId, snapshot) {
|
|
18
|
+
if (!snapshot?.modes.some(({ state }) => state.activation === "active" || state.activation === "activating")) return;
|
|
19
|
+
const coordinator = (0, _agimon_ai_doompi_core_runtimeTransition.readDoomTransitionCoordinator)(context);
|
|
20
|
+
const catalog = require_mode.readMinorModeCatalog(context);
|
|
21
|
+
if (!coordinator || coordinator.hostGeneration !== transitionHostGeneration || !catalog || catalog.generation !== snapshot.hostGeneration) throw new Error("Minor-mode reload handoff became stale before reload.");
|
|
22
|
+
pruneExpiredReloadHandoffs();
|
|
23
|
+
const token = `minor-mode-reload:${crypto.randomUUID()}`;
|
|
24
|
+
const record = {
|
|
25
|
+
token,
|
|
26
|
+
sessionId,
|
|
27
|
+
transitionHostGeneration,
|
|
28
|
+
operationId,
|
|
29
|
+
catalogHostGeneration: snapshot.hostGeneration,
|
|
30
|
+
snapshot: structuredClone(snapshot),
|
|
31
|
+
expiresAt: Date.now() + MINOR_MODE_RELOAD_HANDOFF_TTL_MS
|
|
32
|
+
};
|
|
33
|
+
reloadHandoffRegistry().records.set(sessionId, record);
|
|
34
|
+
return { discard() {
|
|
35
|
+
if (reloadHandoffRegistry().records.get(sessionId)?.token !== token) return false;
|
|
36
|
+
return reloadHandoffRegistry().records.delete(sessionId);
|
|
37
|
+
} };
|
|
38
|
+
}
|
|
39
|
+
function discardMinorModeReloadHandoff(sessionId) {
|
|
40
|
+
pruneExpiredReloadHandoffs();
|
|
41
|
+
return reloadHandoffRegistry().records.delete(sessionId);
|
|
42
|
+
}
|
|
43
|
+
function consumeMinorModeReloadHandoff(sessionId) {
|
|
44
|
+
pruneExpiredReloadHandoffs();
|
|
45
|
+
const handoff = reloadHandoffRegistry().records.get(sessionId);
|
|
46
|
+
if (!handoff) return void 0;
|
|
47
|
+
reloadHandoffRegistry().records.delete(sessionId);
|
|
48
|
+
if (handoff.sessionId !== sessionId || handoff.snapshot.hostGeneration !== handoff.catalogHostGeneration || !handoff.transitionHostGeneration || !handoff.operationId) return;
|
|
49
|
+
return structuredClone(handoff.snapshot);
|
|
50
|
+
}
|
|
51
|
+
//#endregion
|
|
52
|
+
Object.defineProperty(exports, "consumeMinorModeReloadHandoff", {
|
|
53
|
+
enumerable: true,
|
|
54
|
+
get: function() {
|
|
55
|
+
return consumeMinorModeReloadHandoff;
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
Object.defineProperty(exports, "discardMinorModeReloadHandoff", {
|
|
59
|
+
enumerable: true,
|
|
60
|
+
get: function() {
|
|
61
|
+
return discardMinorModeReloadHandoff;
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
Object.defineProperty(exports, "prepareMinorModeReloadHandoff", {
|
|
65
|
+
enumerable: true,
|
|
66
|
+
get: function() {
|
|
67
|
+
return prepareMinorModeReloadHandoff;
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
//# sourceMappingURL=reloadHandoff-C-GaCf0F.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reloadHandoff-C-GaCf0F.cjs","names":["readDoomTransitionCoordinator","readMinorModeCatalog"],"sources":["../src/services/reloadHandoff/index.ts"],"sourcesContent":["import { readDoomTransitionCoordinator } from '@agimon-ai/doompi-core/runtimeTransition';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { readMinorModeCatalog } from '../../schemas/mode';\nimport type { MinorModeCatalogSnapshot } from '../../schemas/mode';\n\nconst MINOR_MODE_RELOAD_HANDOFF_SYMBOL = Symbol.for('@agimon-ai/doompi.minor-mode-reload-handoff.v1');\nconst MINOR_MODE_RELOAD_HANDOFF_TTL_MS = 60_000;\n\ninterface StoredMinorModeReloadHandoff {\n readonly token: string;\n readonly sessionId: string;\n readonly transitionHostGeneration: string;\n readonly operationId: string;\n readonly catalogHostGeneration: string;\n readonly snapshot: MinorModeCatalogSnapshot;\n readonly expiresAt: number;\n}\n\ninterface MinorModeReloadHandoffRegistry {\n readonly records: Map<string, StoredMinorModeReloadHandoff>;\n}\n\nexport interface MinorModeReloadHandoffHandle {\n discard(): boolean;\n}\n\ninterface MinorModeReloadHandoffGlobal {\n [MINOR_MODE_RELOAD_HANDOFF_SYMBOL]?: MinorModeReloadHandoffRegistry;\n}\n\nfunction reloadHandoffRegistry(): MinorModeReloadHandoffRegistry {\n const globalRegistry = globalThis as MinorModeReloadHandoffGlobal;\n const existing = globalRegistry[MINOR_MODE_RELOAD_HANDOFF_SYMBOL];\n if (existing) return existing;\n const created: MinorModeReloadHandoffRegistry = { records: new Map() };\n globalRegistry[MINOR_MODE_RELOAD_HANDOFF_SYMBOL] = created;\n return created;\n}\n\nfunction pruneExpiredReloadHandoffs(now = Date.now()): void {\n for (const [sessionId, handoff] of reloadHandoffRegistry().records) {\n if (handoff.expiresAt <= now) reloadHandoffRegistry().records.delete(sessionId);\n }\n}\n\nexport function prepareMinorModeReloadHandoff(\n context: Context,\n sessionId: string,\n transitionHostGeneration: string,\n operationId: string,\n snapshot: MinorModeCatalogSnapshot | undefined,\n): MinorModeReloadHandoffHandle | undefined {\n if (!snapshot?.modes.some(({ state }) => state.activation === 'active' || state.activation === 'activating')) {\n return undefined;\n }\n const coordinator = readDoomTransitionCoordinator(context);\n const catalog = readMinorModeCatalog(context);\n if (\n !coordinator ||\n coordinator.hostGeneration !== transitionHostGeneration ||\n !catalog ||\n catalog.generation !== snapshot.hostGeneration\n ) {\n throw new Error('Minor-mode reload handoff became stale before reload.');\n }\n\n pruneExpiredReloadHandoffs();\n const token = `minor-mode-reload:${crypto.randomUUID()}`;\n const record: StoredMinorModeReloadHandoff = {\n token,\n sessionId,\n transitionHostGeneration,\n operationId,\n catalogHostGeneration: snapshot.hostGeneration,\n snapshot: structuredClone(snapshot),\n expiresAt: Date.now() + MINOR_MODE_RELOAD_HANDOFF_TTL_MS,\n };\n reloadHandoffRegistry().records.set(sessionId, record);\n\n return {\n discard() {\n const current = reloadHandoffRegistry().records.get(sessionId);\n if (current?.token !== token) return false;\n return reloadHandoffRegistry().records.delete(sessionId);\n },\n };\n}\n\nexport function discardMinorModeReloadHandoff(sessionId: string): boolean {\n pruneExpiredReloadHandoffs();\n return reloadHandoffRegistry().records.delete(sessionId);\n}\n\nexport function consumeMinorModeReloadHandoff(sessionId: string): MinorModeCatalogSnapshot | undefined {\n pruneExpiredReloadHandoffs();\n const handoff = reloadHandoffRegistry().records.get(sessionId);\n if (!handoff) return undefined;\n reloadHandoffRegistry().records.delete(sessionId);\n if (\n handoff.sessionId !== sessionId ||\n handoff.snapshot.hostGeneration !== handoff.catalogHostGeneration ||\n !handoff.transitionHostGeneration ||\n !handoff.operationId\n ) {\n return undefined;\n }\n return structuredClone(handoff.snapshot);\n}\n"],"mappings":";;;AAMA,MAAM,mCAAmC,OAAO,IAAI,gDAAgD;AACpG,MAAM,mCAAmC;AAwBzC,SAAS,wBAAwD;CAC/D,MAAM,iBAAiB;CACvB,MAAM,WAAW,eAAe;CAChC,IAAI,UAAU,OAAO;CACrB,MAAM,UAA0C,EAAE,yBAAS,IAAI,IAAI,EAAE;CACrE,eAAe,oCAAoC;CACnD,OAAO;AACT;AAEA,SAAS,2BAA2B,MAAM,KAAK,IAAI,GAAS;CAC1D,KAAK,MAAM,CAAC,WAAW,YAAY,sBAAsB,CAAC,CAAC,SACzD,IAAI,QAAQ,aAAa,KAAK,sBAAsB,CAAC,CAAC,QAAQ,OAAO,SAAS;AAElF;AAEA,SAAgB,8BACd,SACA,WACA,0BACA,aACA,UAC0C;CAC1C,IAAI,CAAC,UAAU,MAAM,MAAM,EAAE,YAAY,MAAM,eAAe,YAAY,MAAM,eAAe,YAAY,GACzG;CAEF,MAAM,eAAA,GAAcA,yCAAAA,8BAAAA,CAA8B,OAAO;CACzD,MAAM,UAAUC,aAAAA,qBAAqB,OAAO;CAC5C,IACE,CAAC,eACD,YAAY,mBAAmB,4BAC/B,CAAC,WACD,QAAQ,eAAe,SAAS,gBAEhC,MAAM,IAAI,MAAM,uDAAuD;CAGzE,2BAA2B;CAC3B,MAAM,QAAQ,qBAAqB,OAAO,WAAW;CACrD,MAAM,SAAuC;EAC3C;EACA;EACA;EACA;EACA,uBAAuB,SAAS;EAChC,UAAU,gBAAgB,QAAQ;EAClC,WAAW,KAAK,IAAI,IAAI;CAC1B;CACA,sBAAsB,CAAC,CAAC,QAAQ,IAAI,WAAW,MAAM;CAErD,OAAO,EACL,UAAU;EAER,IADgB,sBAAsB,CAAC,CAAC,QAAQ,IAAI,SAC1C,CAAC,EAAE,UAAU,OAAO,OAAO;EACrC,OAAO,sBAAsB,CAAC,CAAC,QAAQ,OAAO,SAAS;CACzD,EACF;AACF;AAEA,SAAgB,8BAA8B,WAA4B;CACxE,2BAA2B;CAC3B,OAAO,sBAAsB,CAAC,CAAC,QAAQ,OAAO,SAAS;AACzD;AAEA,SAAgB,8BAA8B,WAAyD;CACrG,2BAA2B;CAC3B,MAAM,UAAU,sBAAsB,CAAC,CAAC,QAAQ,IAAI,SAAS;CAC7D,IAAI,CAAC,SAAS,OAAO,KAAA;CACrB,sBAAsB,CAAC,CAAC,QAAQ,OAAO,SAAS;CAChD,IACE,QAAQ,cAAc,aACtB,QAAQ,SAAS,mBAAmB,QAAQ,yBAC5C,CAAC,QAAQ,4BACT,CAAC,QAAQ,aAET;CAEF,OAAO,gBAAgB,QAAQ,QAAQ;AACzC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { N as readMinorModeCatalog } from "./mode-BwRkDqO4.mjs";
|
|
2
|
+
import { readDoomTransitionCoordinator } from "@agimon-ai/doompi-core/runtimeTransition";
|
|
3
|
+
//#region src/services/reloadHandoff/index.ts
|
|
4
|
+
const MINOR_MODE_RELOAD_HANDOFF_SYMBOL = Symbol.for("@agimon-ai/doompi.minor-mode-reload-handoff.v1");
|
|
5
|
+
const MINOR_MODE_RELOAD_HANDOFF_TTL_MS = 6e4;
|
|
6
|
+
function reloadHandoffRegistry() {
|
|
7
|
+
const globalRegistry = globalThis;
|
|
8
|
+
const existing = globalRegistry[MINOR_MODE_RELOAD_HANDOFF_SYMBOL];
|
|
9
|
+
if (existing) return existing;
|
|
10
|
+
const created = { records: /* @__PURE__ */ new Map() };
|
|
11
|
+
globalRegistry[MINOR_MODE_RELOAD_HANDOFF_SYMBOL] = created;
|
|
12
|
+
return created;
|
|
13
|
+
}
|
|
14
|
+
function pruneExpiredReloadHandoffs(now = Date.now()) {
|
|
15
|
+
for (const [sessionId, handoff] of reloadHandoffRegistry().records) if (handoff.expiresAt <= now) reloadHandoffRegistry().records.delete(sessionId);
|
|
16
|
+
}
|
|
17
|
+
function prepareMinorModeReloadHandoff(context, sessionId, transitionHostGeneration, operationId, snapshot) {
|
|
18
|
+
if (!snapshot?.modes.some(({ state }) => state.activation === "active" || state.activation === "activating")) return;
|
|
19
|
+
const coordinator = readDoomTransitionCoordinator(context);
|
|
20
|
+
const catalog = readMinorModeCatalog(context);
|
|
21
|
+
if (!coordinator || coordinator.hostGeneration !== transitionHostGeneration || !catalog || catalog.generation !== snapshot.hostGeneration) throw new Error("Minor-mode reload handoff became stale before reload.");
|
|
22
|
+
pruneExpiredReloadHandoffs();
|
|
23
|
+
const token = `minor-mode-reload:${crypto.randomUUID()}`;
|
|
24
|
+
const record = {
|
|
25
|
+
token,
|
|
26
|
+
sessionId,
|
|
27
|
+
transitionHostGeneration,
|
|
28
|
+
operationId,
|
|
29
|
+
catalogHostGeneration: snapshot.hostGeneration,
|
|
30
|
+
snapshot: structuredClone(snapshot),
|
|
31
|
+
expiresAt: Date.now() + MINOR_MODE_RELOAD_HANDOFF_TTL_MS
|
|
32
|
+
};
|
|
33
|
+
reloadHandoffRegistry().records.set(sessionId, record);
|
|
34
|
+
return { discard() {
|
|
35
|
+
if (reloadHandoffRegistry().records.get(sessionId)?.token !== token) return false;
|
|
36
|
+
return reloadHandoffRegistry().records.delete(sessionId);
|
|
37
|
+
} };
|
|
38
|
+
}
|
|
39
|
+
function discardMinorModeReloadHandoff(sessionId) {
|
|
40
|
+
pruneExpiredReloadHandoffs();
|
|
41
|
+
return reloadHandoffRegistry().records.delete(sessionId);
|
|
42
|
+
}
|
|
43
|
+
function consumeMinorModeReloadHandoff(sessionId) {
|
|
44
|
+
pruneExpiredReloadHandoffs();
|
|
45
|
+
const handoff = reloadHandoffRegistry().records.get(sessionId);
|
|
46
|
+
if (!handoff) return void 0;
|
|
47
|
+
reloadHandoffRegistry().records.delete(sessionId);
|
|
48
|
+
if (handoff.sessionId !== sessionId || handoff.snapshot.hostGeneration !== handoff.catalogHostGeneration || !handoff.transitionHostGeneration || !handoff.operationId) return;
|
|
49
|
+
return structuredClone(handoff.snapshot);
|
|
50
|
+
}
|
|
51
|
+
//#endregion
|
|
52
|
+
export { discardMinorModeReloadHandoff as n, prepareMinorModeReloadHandoff as r, consumeMinorModeReloadHandoff as t };
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=reloadHandoff-D1QsS9qd.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reloadHandoff-D1QsS9qd.mjs","names":[],"sources":["../src/services/reloadHandoff/index.ts"],"sourcesContent":["import { readDoomTransitionCoordinator } from '@agimon-ai/doompi-core/runtimeTransition';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { readMinorModeCatalog } from '../../schemas/mode';\nimport type { MinorModeCatalogSnapshot } from '../../schemas/mode';\n\nconst MINOR_MODE_RELOAD_HANDOFF_SYMBOL = Symbol.for('@agimon-ai/doompi.minor-mode-reload-handoff.v1');\nconst MINOR_MODE_RELOAD_HANDOFF_TTL_MS = 60_000;\n\ninterface StoredMinorModeReloadHandoff {\n readonly token: string;\n readonly sessionId: string;\n readonly transitionHostGeneration: string;\n readonly operationId: string;\n readonly catalogHostGeneration: string;\n readonly snapshot: MinorModeCatalogSnapshot;\n readonly expiresAt: number;\n}\n\ninterface MinorModeReloadHandoffRegistry {\n readonly records: Map<string, StoredMinorModeReloadHandoff>;\n}\n\nexport interface MinorModeReloadHandoffHandle {\n discard(): boolean;\n}\n\ninterface MinorModeReloadHandoffGlobal {\n [MINOR_MODE_RELOAD_HANDOFF_SYMBOL]?: MinorModeReloadHandoffRegistry;\n}\n\nfunction reloadHandoffRegistry(): MinorModeReloadHandoffRegistry {\n const globalRegistry = globalThis as MinorModeReloadHandoffGlobal;\n const existing = globalRegistry[MINOR_MODE_RELOAD_HANDOFF_SYMBOL];\n if (existing) return existing;\n const created: MinorModeReloadHandoffRegistry = { records: new Map() };\n globalRegistry[MINOR_MODE_RELOAD_HANDOFF_SYMBOL] = created;\n return created;\n}\n\nfunction pruneExpiredReloadHandoffs(now = Date.now()): void {\n for (const [sessionId, handoff] of reloadHandoffRegistry().records) {\n if (handoff.expiresAt <= now) reloadHandoffRegistry().records.delete(sessionId);\n }\n}\n\nexport function prepareMinorModeReloadHandoff(\n context: Context,\n sessionId: string,\n transitionHostGeneration: string,\n operationId: string,\n snapshot: MinorModeCatalogSnapshot | undefined,\n): MinorModeReloadHandoffHandle | undefined {\n if (!snapshot?.modes.some(({ state }) => state.activation === 'active' || state.activation === 'activating')) {\n return undefined;\n }\n const coordinator = readDoomTransitionCoordinator(context);\n const catalog = readMinorModeCatalog(context);\n if (\n !coordinator ||\n coordinator.hostGeneration !== transitionHostGeneration ||\n !catalog ||\n catalog.generation !== snapshot.hostGeneration\n ) {\n throw new Error('Minor-mode reload handoff became stale before reload.');\n }\n\n pruneExpiredReloadHandoffs();\n const token = `minor-mode-reload:${crypto.randomUUID()}`;\n const record: StoredMinorModeReloadHandoff = {\n token,\n sessionId,\n transitionHostGeneration,\n operationId,\n catalogHostGeneration: snapshot.hostGeneration,\n snapshot: structuredClone(snapshot),\n expiresAt: Date.now() + MINOR_MODE_RELOAD_HANDOFF_TTL_MS,\n };\n reloadHandoffRegistry().records.set(sessionId, record);\n\n return {\n discard() {\n const current = reloadHandoffRegistry().records.get(sessionId);\n if (current?.token !== token) return false;\n return reloadHandoffRegistry().records.delete(sessionId);\n },\n };\n}\n\nexport function discardMinorModeReloadHandoff(sessionId: string): boolean {\n pruneExpiredReloadHandoffs();\n return reloadHandoffRegistry().records.delete(sessionId);\n}\n\nexport function consumeMinorModeReloadHandoff(sessionId: string): MinorModeCatalogSnapshot | undefined {\n pruneExpiredReloadHandoffs();\n const handoff = reloadHandoffRegistry().records.get(sessionId);\n if (!handoff) return undefined;\n reloadHandoffRegistry().records.delete(sessionId);\n if (\n handoff.sessionId !== sessionId ||\n handoff.snapshot.hostGeneration !== handoff.catalogHostGeneration ||\n !handoff.transitionHostGeneration ||\n !handoff.operationId\n ) {\n return undefined;\n }\n return structuredClone(handoff.snapshot);\n}\n"],"mappings":";;;AAMA,MAAM,mCAAmC,OAAO,IAAI,gDAAgD;AACpG,MAAM,mCAAmC;AAwBzC,SAAS,wBAAwD;CAC/D,MAAM,iBAAiB;CACvB,MAAM,WAAW,eAAe;CAChC,IAAI,UAAU,OAAO;CACrB,MAAM,UAA0C,EAAE,yBAAS,IAAI,IAAI,EAAE;CACrE,eAAe,oCAAoC;CACnD,OAAO;AACT;AAEA,SAAS,2BAA2B,MAAM,KAAK,IAAI,GAAS;CAC1D,KAAK,MAAM,CAAC,WAAW,YAAY,sBAAsB,CAAC,CAAC,SACzD,IAAI,QAAQ,aAAa,KAAK,sBAAsB,CAAC,CAAC,QAAQ,OAAO,SAAS;AAElF;AAEA,SAAgB,8BACd,SACA,WACA,0BACA,aACA,UAC0C;CAC1C,IAAI,CAAC,UAAU,MAAM,MAAM,EAAE,YAAY,MAAM,eAAe,YAAY,MAAM,eAAe,YAAY,GACzG;CAEF,MAAM,cAAc,8BAA8B,OAAO;CACzD,MAAM,UAAU,qBAAqB,OAAO;CAC5C,IACE,CAAC,eACD,YAAY,mBAAmB,4BAC/B,CAAC,WACD,QAAQ,eAAe,SAAS,gBAEhC,MAAM,IAAI,MAAM,uDAAuD;CAGzE,2BAA2B;CAC3B,MAAM,QAAQ,qBAAqB,OAAO,WAAW;CACrD,MAAM,SAAuC;EAC3C;EACA;EACA;EACA;EACA,uBAAuB,SAAS;EAChC,UAAU,gBAAgB,QAAQ;EAClC,WAAW,KAAK,IAAI,IAAI;CAC1B;CACA,sBAAsB,CAAC,CAAC,QAAQ,IAAI,WAAW,MAAM;CAErD,OAAO,EACL,UAAU;EAER,IADgB,sBAAsB,CAAC,CAAC,QAAQ,IAAI,SAC1C,CAAC,EAAE,UAAU,OAAO,OAAO;EACrC,OAAO,sBAAsB,CAAC,CAAC,QAAQ,OAAO,SAAS;CACzD,EACF;AACF;AAEA,SAAgB,8BAA8B,WAA4B;CACxE,2BAA2B;CAC3B,OAAO,sBAAsB,CAAC,CAAC,QAAQ,OAAO,SAAS;AACzD;AAEA,SAAgB,8BAA8B,WAAyD;CACrG,2BAA2B;CAC3B,MAAM,UAAU,sBAAsB,CAAC,CAAC,QAAQ,IAAI,SAAS;CAC7D,IAAI,CAAC,SAAS,OAAO,KAAA;CACrB,sBAAsB,CAAC,CAAC,QAAQ,OAAO,SAAS;CAChD,IACE,QAAQ,cAAc,aACtB,QAAQ,SAAS,mBAAmB,QAAQ,yBAC5C,CAAC,QAAQ,4BACT,CAAC,QAAQ,aAET;CAEF,OAAO,gBAAgB,QAAQ,QAAQ;AACzC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_reloadHandoff = require("./reloadHandoff-C-GaCf0F.cjs");
|
|
3
|
+
exports.consumeMinorModeReloadHandoff = require_reloadHandoff.consumeMinorModeReloadHandoff;
|
|
4
|
+
exports.discardMinorModeReloadHandoff = require_reloadHandoff.discardMinorModeReloadHandoff;
|
|
5
|
+
exports.prepareMinorModeReloadHandoff = require_reloadHandoff.prepareMinorModeReloadHandoff;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { O as MinorModeCatalogSnapshot } from "./mode-EZWqhrYy.mjs";
|
|
2
|
+
import { Context } from "@deepseek-ai/cordis";
|
|
3
|
+
//#region src/services/reloadHandoff/index.d.ts
|
|
4
|
+
export interface MinorModeReloadHandoffHandle {
|
|
5
|
+
discard(): boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function prepareMinorModeReloadHandoff(context: Context, sessionId: string, transitionHostGeneration: string, operationId: string, snapshot: MinorModeCatalogSnapshot | undefined): MinorModeReloadHandoffHandle | undefined;
|
|
8
|
+
export declare function discardMinorModeReloadHandoff(sessionId: string): boolean;
|
|
9
|
+
export declare function consumeMinorModeReloadHandoff(sessionId: string): MinorModeCatalogSnapshot | undefined;
|
|
10
|
+
//#endregion
|
|
11
|
+
//# sourceMappingURL=reloadHandoff.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reloadHandoff.d.mts","names":[],"sources":["../src/services/reloadHandoff/index.ts"],"mappings":";;;iBAuBiB;EACf;;wBAsBc,8BACd,SAAS,SACT,mBACA,kCACA,qBACA,UAAU,uCACT;wBAqCa,8BAA8B;wBAK9B,8BAA8B,oBAAoB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { a as MINOR_MODE_ERROR_CODE } from "./mode-BwRkDqO4.mjs";
|
|
2
|
+
import { DoomProtocolError } from "@agimon-ai/doompi-core/runtimeProtocol";
|
|
3
|
+
//#region src/services/validation/index.ts
|
|
4
|
+
function minorModeKey(identity) {
|
|
5
|
+
return `${identity.source}\u0000${identity.id}`;
|
|
6
|
+
}
|
|
7
|
+
function minorModeRegistrationRef(record) {
|
|
8
|
+
return {
|
|
9
|
+
source: record.descriptor.source,
|
|
10
|
+
id: record.descriptor.id,
|
|
11
|
+
ownerGeneration: record.ownerGeneration,
|
|
12
|
+
registrationId: record.registrationId
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function duplicateValue(values) {
|
|
16
|
+
const seen = /* @__PURE__ */ new Set();
|
|
17
|
+
for (const value of values) {
|
|
18
|
+
if (seen.has(value)) return value;
|
|
19
|
+
seen.add(value);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function validateMinorModeDefinition(descriptor, state) {
|
|
23
|
+
const duplicateAction = duplicateValue(descriptor.actions.map(({ id }) => id));
|
|
24
|
+
if (duplicateAction) return `Duplicate minor-mode action '${duplicateAction}'.`;
|
|
25
|
+
for (const action of descriptor.actions) {
|
|
26
|
+
const duplicateParameter = duplicateValue(action.parameters.map(({ name }) => name));
|
|
27
|
+
if (duplicateParameter) return `Duplicate parameter '${duplicateParameter}' for action '${action.id}'.`;
|
|
28
|
+
for (const parameter of action.parameters) {
|
|
29
|
+
if (parameter.kind === "string" && parameter.minLength !== void 0 && parameter.maxLength !== void 0 && parameter.minLength > parameter.maxLength) return `Parameter '${parameter.name}' has minLength greater than maxLength.`;
|
|
30
|
+
if (parameter.kind === "number" && parameter.minimum !== void 0 && parameter.maximum !== void 0 && parameter.minimum > parameter.maximum) return `Parameter '${parameter.name}' has minimum greater than maximum.`;
|
|
31
|
+
if (parameter.kind === "enum") {
|
|
32
|
+
const duplicateChoice = duplicateValue(parameter.choices.map(({ value }) => value));
|
|
33
|
+
if (duplicateChoice) return `Parameter '${parameter.name}' has duplicate choice '${duplicateChoice}'.`;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const duplicateAvailability = duplicateValue(state.actions.map(({ id }) => id));
|
|
38
|
+
if (duplicateAvailability) return `Duplicate action availability '${duplicateAvailability}'.`;
|
|
39
|
+
const descriptors = new Set(descriptor.actions.map(({ id }) => id));
|
|
40
|
+
const available = new Set(state.actions.map(({ id }) => id));
|
|
41
|
+
if (descriptors.size !== available.size || [...descriptors].some((id) => !available.has(id))) return "Minor-mode state must publish availability for every declared action.";
|
|
42
|
+
}
|
|
43
|
+
function invalidArguments(message) {
|
|
44
|
+
throw new DoomProtocolError({
|
|
45
|
+
code: MINOR_MODE_ERROR_CODE.invalidArguments,
|
|
46
|
+
message
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function validateMinorModeActionArguments(action, argumentsValue) {
|
|
50
|
+
const parameters = new Map(action.parameters.map((parameter) => [parameter.name, parameter]));
|
|
51
|
+
for (const name of Object.keys(argumentsValue)) if (!parameters.has(name)) invalidArguments(`Unknown argument '${name}' for action '${action.id}'.`);
|
|
52
|
+
for (const parameter of action.parameters) {
|
|
53
|
+
const value = argumentsValue[parameter.name];
|
|
54
|
+
if (value === void 0) {
|
|
55
|
+
if (parameter.required) invalidArguments(`Missing required argument '${parameter.name}'.`);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (parameter.kind === "string") {
|
|
59
|
+
if (typeof value !== "string") invalidArguments(`Argument '${parameter.name}' must be a string.`);
|
|
60
|
+
if (parameter.minLength !== void 0 && value.length < parameter.minLength) invalidArguments(`Argument '${parameter.name}' is shorter than ${parameter.minLength}.`);
|
|
61
|
+
if (parameter.maxLength !== void 0 && value.length > parameter.maxLength) invalidArguments(`Argument '${parameter.name}' is longer than ${parameter.maxLength}.`);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (parameter.kind === "number") {
|
|
65
|
+
if (typeof value !== "number" || !Number.isFinite(value)) invalidArguments(`Argument '${parameter.name}' must be a finite number.`);
|
|
66
|
+
if (parameter.integer && !Number.isInteger(value)) invalidArguments(`Argument '${parameter.name}' must be an integer.`);
|
|
67
|
+
if (parameter.minimum !== void 0 && value < parameter.minimum) invalidArguments(`Argument '${parameter.name}' must be at least ${parameter.minimum}.`);
|
|
68
|
+
if (parameter.maximum !== void 0 && value > parameter.maximum) invalidArguments(`Argument '${parameter.name}' must be at most ${parameter.maximum}.`);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (parameter.kind === "boolean") {
|
|
72
|
+
if (typeof value !== "boolean") invalidArguments(`Argument '${parameter.name}' must be a boolean.`);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (typeof value !== "string" || !parameter.choices.some((choice) => choice.value === value)) invalidArguments(`Argument '${parameter.name}' must be one of the declared choices.`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//#endregion
|
|
79
|
+
export { validateMinorModeDefinition as i, minorModeRegistrationRef as n, validateMinorModeActionArguments as r, minorModeKey as t };
|
|
80
|
+
|
|
81
|
+
//# sourceMappingURL=validation-BuQc8UrL.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-BuQc8UrL.mjs","names":[],"sources":["../src/services/validation/index.ts"],"sourcesContent":["import { DoomProtocolError } from '@agimon-ai/doompi-core/runtimeProtocol';\n\nimport {\n MINOR_MODE_ERROR_CODE,\n type MinorModeActionDescriptor,\n type MinorModeArguments,\n type MinorModeDescriptor,\n type MinorModeRecord,\n type MinorModeRegistrationRef,\n type MinorModeState,\n} from '../../schemas/mode';\n\nexport function minorModeKey(identity: Pick<MinorModeDescriptor, 'source' | 'id'>): string {\n return `${identity.source}\\u0000${identity.id}`;\n}\n\nexport function minorModeRegistrationRef(record: MinorModeRecord): MinorModeRegistrationRef {\n return {\n source: record.descriptor.source,\n id: record.descriptor.id,\n ownerGeneration: record.ownerGeneration,\n registrationId: record.registrationId,\n };\n}\n\nfunction duplicateValue(values: readonly string[]): string | undefined {\n const seen = new Set<string>();\n for (const value of values) {\n if (seen.has(value)) return value;\n seen.add(value);\n }\n return undefined;\n}\n\nexport function validateMinorModeDefinition(\n descriptor: MinorModeDescriptor,\n state: MinorModeState,\n): string | undefined {\n const duplicateAction = duplicateValue(descriptor.actions.map(({ id }) => id));\n if (duplicateAction) return `Duplicate minor-mode action '${duplicateAction}'.`;\n for (const action of descriptor.actions) {\n const duplicateParameter = duplicateValue(action.parameters.map(({ name }) => name));\n if (duplicateParameter) return `Duplicate parameter '${duplicateParameter}' for action '${action.id}'.`;\n for (const parameter of action.parameters) {\n if (\n parameter.kind === 'string' &&\n parameter.minLength !== undefined &&\n parameter.maxLength !== undefined &&\n parameter.minLength > parameter.maxLength\n ) {\n return `Parameter '${parameter.name}' has minLength greater than maxLength.`;\n }\n if (\n parameter.kind === 'number' &&\n parameter.minimum !== undefined &&\n parameter.maximum !== undefined &&\n parameter.minimum > parameter.maximum\n ) {\n return `Parameter '${parameter.name}' has minimum greater than maximum.`;\n }\n if (parameter.kind === 'enum') {\n const duplicateChoice = duplicateValue(parameter.choices.map(({ value }) => value));\n if (duplicateChoice) return `Parameter '${parameter.name}' has duplicate choice '${duplicateChoice}'.`;\n }\n }\n }\n const duplicateAvailability = duplicateValue(state.actions.map(({ id }) => id));\n if (duplicateAvailability) return `Duplicate action availability '${duplicateAvailability}'.`;\n const descriptors = new Set(descriptor.actions.map(({ id }) => id));\n const available = new Set(state.actions.map(({ id }) => id));\n if (descriptors.size !== available.size || [...descriptors].some((id) => !available.has(id))) {\n return 'Minor-mode state must publish availability for every declared action.';\n }\n return undefined;\n}\n\nfunction invalidArguments(message: string): never {\n throw new DoomProtocolError({ code: MINOR_MODE_ERROR_CODE.invalidArguments, message });\n}\n\nexport function validateMinorModeActionArguments(\n action: MinorModeActionDescriptor,\n argumentsValue: MinorModeArguments,\n): void {\n const parameters = new Map(action.parameters.map((parameter) => [parameter.name, parameter]));\n for (const name of Object.keys(argumentsValue)) {\n if (!parameters.has(name)) invalidArguments(`Unknown argument '${name}' for action '${action.id}'.`);\n }\n for (const parameter of action.parameters) {\n const value = argumentsValue[parameter.name];\n if (value === undefined) {\n if (parameter.required) invalidArguments(`Missing required argument '${parameter.name}'.`);\n continue;\n }\n if (parameter.kind === 'string') {\n if (typeof value !== 'string') invalidArguments(`Argument '${parameter.name}' must be a string.`);\n if (parameter.minLength !== undefined && value.length < parameter.minLength) {\n invalidArguments(`Argument '${parameter.name}' is shorter than ${parameter.minLength}.`);\n }\n if (parameter.maxLength !== undefined && value.length > parameter.maxLength) {\n invalidArguments(`Argument '${parameter.name}' is longer than ${parameter.maxLength}.`);\n }\n continue;\n }\n if (parameter.kind === 'number') {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n invalidArguments(`Argument '${parameter.name}' must be a finite number.`);\n }\n if (parameter.integer && !Number.isInteger(value)) {\n invalidArguments(`Argument '${parameter.name}' must be an integer.`);\n }\n if (parameter.minimum !== undefined && value < parameter.minimum) {\n invalidArguments(`Argument '${parameter.name}' must be at least ${parameter.minimum}.`);\n }\n if (parameter.maximum !== undefined && value > parameter.maximum) {\n invalidArguments(`Argument '${parameter.name}' must be at most ${parameter.maximum}.`);\n }\n continue;\n }\n if (parameter.kind === 'boolean') {\n if (typeof value !== 'boolean') invalidArguments(`Argument '${parameter.name}' must be a boolean.`);\n continue;\n }\n if (typeof value !== 'string' || !parameter.choices.some((choice) => choice.value === value)) {\n invalidArguments(`Argument '${parameter.name}' must be one of the declared choices.`);\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
const require_mode = require("./mode-Dft08ke8.cjs");
|
|
2
|
+
let _agimon_ai_doompi_core_runtimeProtocol = require("@agimon-ai/doompi-core/runtimeProtocol");
|
|
3
|
+
//#region src/services/validation/index.ts
|
|
4
|
+
function minorModeKey(identity) {
|
|
5
|
+
return `${identity.source}\u0000${identity.id}`;
|
|
6
|
+
}
|
|
7
|
+
function minorModeRegistrationRef(record) {
|
|
8
|
+
return {
|
|
9
|
+
source: record.descriptor.source,
|
|
10
|
+
id: record.descriptor.id,
|
|
11
|
+
ownerGeneration: record.ownerGeneration,
|
|
12
|
+
registrationId: record.registrationId
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function duplicateValue(values) {
|
|
16
|
+
const seen = /* @__PURE__ */ new Set();
|
|
17
|
+
for (const value of values) {
|
|
18
|
+
if (seen.has(value)) return value;
|
|
19
|
+
seen.add(value);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function validateMinorModeDefinition(descriptor, state) {
|
|
23
|
+
const duplicateAction = duplicateValue(descriptor.actions.map(({ id }) => id));
|
|
24
|
+
if (duplicateAction) return `Duplicate minor-mode action '${duplicateAction}'.`;
|
|
25
|
+
for (const action of descriptor.actions) {
|
|
26
|
+
const duplicateParameter = duplicateValue(action.parameters.map(({ name }) => name));
|
|
27
|
+
if (duplicateParameter) return `Duplicate parameter '${duplicateParameter}' for action '${action.id}'.`;
|
|
28
|
+
for (const parameter of action.parameters) {
|
|
29
|
+
if (parameter.kind === "string" && parameter.minLength !== void 0 && parameter.maxLength !== void 0 && parameter.minLength > parameter.maxLength) return `Parameter '${parameter.name}' has minLength greater than maxLength.`;
|
|
30
|
+
if (parameter.kind === "number" && parameter.minimum !== void 0 && parameter.maximum !== void 0 && parameter.minimum > parameter.maximum) return `Parameter '${parameter.name}' has minimum greater than maximum.`;
|
|
31
|
+
if (parameter.kind === "enum") {
|
|
32
|
+
const duplicateChoice = duplicateValue(parameter.choices.map(({ value }) => value));
|
|
33
|
+
if (duplicateChoice) return `Parameter '${parameter.name}' has duplicate choice '${duplicateChoice}'.`;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const duplicateAvailability = duplicateValue(state.actions.map(({ id }) => id));
|
|
38
|
+
if (duplicateAvailability) return `Duplicate action availability '${duplicateAvailability}'.`;
|
|
39
|
+
const descriptors = new Set(descriptor.actions.map(({ id }) => id));
|
|
40
|
+
const available = new Set(state.actions.map(({ id }) => id));
|
|
41
|
+
if (descriptors.size !== available.size || [...descriptors].some((id) => !available.has(id))) return "Minor-mode state must publish availability for every declared action.";
|
|
42
|
+
}
|
|
43
|
+
function invalidArguments(message) {
|
|
44
|
+
throw new _agimon_ai_doompi_core_runtimeProtocol.DoomProtocolError({
|
|
45
|
+
code: require_mode.MINOR_MODE_ERROR_CODE.invalidArguments,
|
|
46
|
+
message
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function validateMinorModeActionArguments(action, argumentsValue) {
|
|
50
|
+
const parameters = new Map(action.parameters.map((parameter) => [parameter.name, parameter]));
|
|
51
|
+
for (const name of Object.keys(argumentsValue)) if (!parameters.has(name)) invalidArguments(`Unknown argument '${name}' for action '${action.id}'.`);
|
|
52
|
+
for (const parameter of action.parameters) {
|
|
53
|
+
const value = argumentsValue[parameter.name];
|
|
54
|
+
if (value === void 0) {
|
|
55
|
+
if (parameter.required) invalidArguments(`Missing required argument '${parameter.name}'.`);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (parameter.kind === "string") {
|
|
59
|
+
if (typeof value !== "string") invalidArguments(`Argument '${parameter.name}' must be a string.`);
|
|
60
|
+
if (parameter.minLength !== void 0 && value.length < parameter.minLength) invalidArguments(`Argument '${parameter.name}' is shorter than ${parameter.minLength}.`);
|
|
61
|
+
if (parameter.maxLength !== void 0 && value.length > parameter.maxLength) invalidArguments(`Argument '${parameter.name}' is longer than ${parameter.maxLength}.`);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (parameter.kind === "number") {
|
|
65
|
+
if (typeof value !== "number" || !Number.isFinite(value)) invalidArguments(`Argument '${parameter.name}' must be a finite number.`);
|
|
66
|
+
if (parameter.integer && !Number.isInteger(value)) invalidArguments(`Argument '${parameter.name}' must be an integer.`);
|
|
67
|
+
if (parameter.minimum !== void 0 && value < parameter.minimum) invalidArguments(`Argument '${parameter.name}' must be at least ${parameter.minimum}.`);
|
|
68
|
+
if (parameter.maximum !== void 0 && value > parameter.maximum) invalidArguments(`Argument '${parameter.name}' must be at most ${parameter.maximum}.`);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (parameter.kind === "boolean") {
|
|
72
|
+
if (typeof value !== "boolean") invalidArguments(`Argument '${parameter.name}' must be a boolean.`);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (typeof value !== "string" || !parameter.choices.some((choice) => choice.value === value)) invalidArguments(`Argument '${parameter.name}' must be one of the declared choices.`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//#endregion
|
|
79
|
+
Object.defineProperty(exports, "minorModeKey", {
|
|
80
|
+
enumerable: true,
|
|
81
|
+
get: function() {
|
|
82
|
+
return minorModeKey;
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
Object.defineProperty(exports, "minorModeRegistrationRef", {
|
|
86
|
+
enumerable: true,
|
|
87
|
+
get: function() {
|
|
88
|
+
return minorModeRegistrationRef;
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
Object.defineProperty(exports, "validateMinorModeActionArguments", {
|
|
92
|
+
enumerable: true,
|
|
93
|
+
get: function() {
|
|
94
|
+
return validateMinorModeActionArguments;
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
Object.defineProperty(exports, "validateMinorModeDefinition", {
|
|
98
|
+
enumerable: true,
|
|
99
|
+
get: function() {
|
|
100
|
+
return validateMinorModeDefinition;
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=validation-DRV8Dtoc.cjs.map
|