@agimon-ai/doompi-minor-mode 0.0.1-alpha.70

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.
Files changed (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/dist/api-contracts.cjs +7 -0
  4. package/dist/api-contracts.d.cts +2 -0
  5. package/dist/api-contracts.d.mts +2 -0
  6. package/dist/api-contracts.mjs +2 -0
  7. package/dist/catalog.cjs +223 -0
  8. package/dist/catalog.cjs.map +1 -0
  9. package/dist/catalog.d.cts +14 -0
  10. package/dist/catalog.d.cts.map +1 -0
  11. package/dist/catalog.d.mts +14 -0
  12. package/dist/catalog.d.mts.map +1 -0
  13. package/dist/catalog.mjs +222 -0
  14. package/dist/catalog.mjs.map +1 -0
  15. package/dist/command.cjs +134 -0
  16. package/dist/command.cjs.map +1 -0
  17. package/dist/command.d.cts +25 -0
  18. package/dist/command.d.cts.map +1 -0
  19. package/dist/command.d.mts +25 -0
  20. package/dist/command.d.mts.map +1 -0
  21. package/dist/command.mjs +129 -0
  22. package/dist/command.mjs.map +1 -0
  23. package/dist/constants/command.cjs +6 -0
  24. package/dist/constants/command.cjs.map +1 -0
  25. package/dist/constants/command.d.cts +4 -0
  26. package/dist/constants/command.d.cts.map +1 -0
  27. package/dist/constants/command.d.mts +4 -0
  28. package/dist/constants/command.d.mts.map +1 -0
  29. package/dist/constants/command.mjs +6 -0
  30. package/dist/constants/command.mjs.map +1 -0
  31. package/dist/controllers/catalogRuntime.cjs +123 -0
  32. package/dist/controllers/catalogRuntime.cjs.map +1 -0
  33. package/dist/controllers/catalogRuntime.mjs +123 -0
  34. package/dist/controllers/catalogRuntime.mjs.map +1 -0
  35. package/dist/extensions/pi.cjs +7 -0
  36. package/dist/extensions/pi.cjs.map +1 -0
  37. package/dist/extensions/pi.d.cts +4 -0
  38. package/dist/extensions/pi.d.cts.map +1 -0
  39. package/dist/extensions/pi.d.mts +5 -0
  40. package/dist/extensions/pi.d.mts.map +1 -0
  41. package/dist/extensions/pi.mjs +8 -0
  42. package/dist/extensions/pi.mjs.map +1 -0
  43. package/dist/extensions/server.cjs +85 -0
  44. package/dist/extensions/server.cjs.map +1 -0
  45. package/dist/extensions/server.d.cts +4 -0
  46. package/dist/extensions/server.d.cts.map +1 -0
  47. package/dist/extensions/server.d.mts +5 -0
  48. package/dist/extensions/server.d.mts.map +1 -0
  49. package/dist/extensions/server.mjs +86 -0
  50. package/dist/extensions/server.mjs.map +1 -0
  51. package/dist/index.cjs +53 -0
  52. package/dist/index.d.cts +10 -0
  53. package/dist/index.d.mts +10 -0
  54. package/dist/index.mjs +9 -0
  55. package/dist/minor-mode-command.cjs +37 -0
  56. package/dist/minor-mode-command.cjs.map +1 -0
  57. package/dist/minor-mode-command.d.cts +9 -0
  58. package/dist/minor-mode-command.d.cts.map +1 -0
  59. package/dist/minor-mode-command.d.mts +9 -0
  60. package/dist/minor-mode-command.d.mts.map +1 -0
  61. package/dist/minor-mode-command.mjs +33 -0
  62. package/dist/minor-mode-command.mjs.map +1 -0
  63. package/dist/mode-definition.cjs +47 -0
  64. package/dist/mode-definition.cjs.map +1 -0
  65. package/dist/mode-definition.d.cts +30 -0
  66. package/dist/mode-definition.d.cts.map +1 -0
  67. package/dist/mode-definition.d.mts +30 -0
  68. package/dist/mode-definition.d.mts.map +1 -0
  69. package/dist/mode-definition.mjs +46 -0
  70. package/dist/mode-definition.mjs.map +1 -0
  71. package/dist/mode.cjs +275 -0
  72. package/dist/mode.cjs.map +1 -0
  73. package/dist/mode.d.cts +491 -0
  74. package/dist/mode.d.cts.map +1 -0
  75. package/dist/mode.d.mts +491 -0
  76. package/dist/mode.d.mts.map +1 -0
  77. package/dist/mode.mjs +241 -0
  78. package/dist/mode.mjs.map +1 -0
  79. package/dist/owner.cjs +10 -0
  80. package/dist/owner.cjs.map +1 -0
  81. package/dist/owner.d.cts +7 -0
  82. package/dist/owner.d.cts.map +1 -0
  83. package/dist/owner.d.mts +7 -0
  84. package/dist/owner.d.mts.map +1 -0
  85. package/dist/owner.mjs +9 -0
  86. package/dist/owner.mjs.map +1 -0
  87. package/dist/projection.cjs +49 -0
  88. package/dist/projection.cjs.map +1 -0
  89. package/dist/projection.d.cts +12 -0
  90. package/dist/projection.d.cts.map +1 -0
  91. package/dist/projection.d.mts +12 -0
  92. package/dist/projection.d.mts.map +1 -0
  93. package/dist/projection.mjs +47 -0
  94. package/dist/projection.mjs.map +1 -0
  95. package/dist/reload-handoff.cjs +57 -0
  96. package/dist/reload-handoff.cjs.map +1 -0
  97. package/dist/reload-handoff.d.cts +11 -0
  98. package/dist/reload-handoff.d.cts.map +1 -0
  99. package/dist/reload-handoff.d.mts +11 -0
  100. package/dist/reload-handoff.d.mts.map +1 -0
  101. package/dist/reload-handoff.mjs +54 -0
  102. package/dist/reload-handoff.mjs.map +1 -0
  103. package/dist/schemas/apiContracts.cjs +13 -0
  104. package/dist/schemas/apiContracts.cjs.map +1 -0
  105. package/dist/schemas/apiContracts.d.cts +53 -0
  106. package/dist/schemas/apiContracts.d.cts.map +1 -0
  107. package/dist/schemas/apiContracts.d.mts +53 -0
  108. package/dist/schemas/apiContracts.d.mts.map +1 -0
  109. package/dist/schemas/apiContracts.mjs +13 -0
  110. package/dist/schemas/apiContracts.mjs.map +1 -0
  111. package/dist/schemas/headless.d.cts +16 -0
  112. package/dist/schemas/headless.d.cts.map +1 -0
  113. package/dist/schemas/headless.d.mts +16 -0
  114. package/dist/schemas/headless.d.mts.map +1 -0
  115. package/dist/services/client/index.cjs +18 -0
  116. package/dist/services/client/index.cjs.map +1 -0
  117. package/dist/services/client/index.d.cts +12 -0
  118. package/dist/services/client/index.d.cts.map +1 -0
  119. package/dist/services/client/index.d.mts +12 -0
  120. package/dist/services/client/index.d.mts.map +1 -0
  121. package/dist/services/client/index.mjs +18 -0
  122. package/dist/services/client/index.mjs.map +1 -0
  123. package/dist/services/headlessCommand/index.cjs +53 -0
  124. package/dist/services/headlessCommand/index.cjs.map +1 -0
  125. package/dist/services/headlessCommand/index.d.cts +6 -0
  126. package/dist/services/headlessCommand/index.d.cts.map +1 -0
  127. package/dist/services/headlessCommand/index.d.mts +6 -0
  128. package/dist/services/headlessCommand/index.d.mts.map +1 -0
  129. package/dist/services/headlessCommand/index.mjs +53 -0
  130. package/dist/services/headlessCommand/index.mjs.map +1 -0
  131. package/dist/services/piRegistration/index.cjs +86 -0
  132. package/dist/services/piRegistration/index.cjs.map +1 -0
  133. package/dist/services/piRegistration/index.d.cts +15 -0
  134. package/dist/services/piRegistration/index.d.cts.map +1 -0
  135. package/dist/services/piRegistration/index.d.mts +15 -0
  136. package/dist/services/piRegistration/index.d.mts.map +1 -0
  137. package/dist/services/piRegistration/index.mjs +86 -0
  138. package/dist/services/piRegistration/index.mjs.map +1 -0
  139. package/dist/services/serverRegistration/index.cjs +35 -0
  140. package/dist/services/serverRegistration/index.cjs.map +1 -0
  141. package/dist/services/serverRegistration/index.d.cts +7 -0
  142. package/dist/services/serverRegistration/index.d.cts.map +1 -0
  143. package/dist/services/serverRegistration/index.d.mts +7 -0
  144. package/dist/services/serverRegistration/index.d.mts.map +1 -0
  145. package/dist/services/serverRegistration/index.mjs +35 -0
  146. package/dist/services/serverRegistration/index.mjs.map +1 -0
  147. package/dist/services/validation/index.cjs +84 -0
  148. package/dist/services/validation/index.cjs.map +1 -0
  149. package/dist/services/validation/index.d.cts +8 -0
  150. package/dist/services/validation/index.d.cts.map +1 -0
  151. package/dist/services/validation/index.d.mts +8 -0
  152. package/dist/services/validation/index.d.mts.map +1 -0
  153. package/dist/services/validation/index.mjs +81 -0
  154. package/dist/services/validation/index.mjs.map +1 -0
  155. package/package.json +157 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/piRegistration/index.ts"],"mappings":";;;;;KAaK,iBAAiB,YAAY,yBAAyB,sBAAsB;YACrE,0BACR,eAAe,4BAA4B,qBAC3C,WAAW;iBACE;EACf,qBAAqB;EACrB,UAAU;;;wBAII,aACd,gBAAgB,4BAA4B,qCAC1C,SAAS"}
@@ -0,0 +1,86 @@
1
+ import { DOOM_MINOR_MODE_CATALOG_SERVICE, requireMinorModeCatalog } from "../../mode.mjs";
2
+ import { registerMinorModeOwner } from "../../owner.mjs";
3
+ //#region src/services/piRegistration/index.ts
4
+ /** Registers static or live owners for the injected catalog's lifetime. */
5
+ function piMinorModes(modes) {
6
+ return (context) => {
7
+ if (!modes) return;
8
+ context.inject([DOOM_MINOR_MODE_CATALOG_SERVICE], (child) => {
9
+ const controller = new AbortController();
10
+ const signal = controller.signal;
11
+ child.effect(() => () => controller.abort());
12
+ const catalog = requireMinorModeCatalog(child);
13
+ const mounted = /* @__PURE__ */ new Map();
14
+ let disposed = false;
15
+ let reconciling = false;
16
+ let pending = false;
17
+ let subscribing = true;
18
+ const reconcile = () => {
19
+ pending = true;
20
+ if (disposed || signal.aborted || subscribing || reconciling) return;
21
+ reconciling = true;
22
+ try {
23
+ do {
24
+ pending = false;
25
+ const snapshot = "snapshot" in modes ? modes.snapshot() : modes;
26
+ const next = /* @__PURE__ */ new Map();
27
+ for (const declaration of snapshot) {
28
+ const definition = "definition" in declaration ? declaration.definition : declaration;
29
+ const key = JSON.stringify([definition.descriptor.source, definition.descriptor.id]);
30
+ if (next.has(key)) throw new Error(`Duplicate live minor mode: ${definition.descriptor.source}/${definition.descriptor.id}`);
31
+ next.set(key, declaration);
32
+ }
33
+ for (const [key, entry] of mounted) {
34
+ if (next.get(key) === entry.declaration) continue;
35
+ mounted.delete(key);
36
+ entry.release();
37
+ }
38
+ for (const [key, declaration] of next) {
39
+ if (mounted.has(key)) continue;
40
+ const owner = "definition" in declaration ? declaration : void 0;
41
+ const handle = registerMinorModeOwner(catalog, owner ? owner.definition : declaration);
42
+ mounted.set(key, {
43
+ declaration,
44
+ release() {
45
+ try {
46
+ owner?.detach();
47
+ } finally {
48
+ handle.dispose();
49
+ }
50
+ }
51
+ });
52
+ owner?.attach(handle);
53
+ }
54
+ } while (pending && !disposed && !signal.aborted);
55
+ } finally {
56
+ reconciling = false;
57
+ }
58
+ };
59
+ child.effect(() => () => {
60
+ disposed = true;
61
+ const entries = [...mounted.values()];
62
+ mounted.clear();
63
+ const errors = [];
64
+ for (const entry of entries) try {
65
+ entry.release();
66
+ } catch (error) {
67
+ errors.push(error);
68
+ }
69
+ if (errors.length) throw new AggregateError(errors, "Minor mode cleanup failed.");
70
+ });
71
+ if ("subscribe" in modes) {
72
+ const unsubscribe = modes.subscribe(reconcile);
73
+ child.effect(() => () => {
74
+ disposed = true;
75
+ unsubscribe();
76
+ });
77
+ }
78
+ subscribing = false;
79
+ reconcile();
80
+ });
81
+ };
82
+ }
83
+ //#endregion
84
+ export { piMinorModes };
85
+
86
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/services/piRegistration/index.ts"],"sourcesContent":["import type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n requireMinorModeCatalog,\n type MinorModeOwnerActionContext,\n type MinorModeOwnerDefinition,\n type MinorModeOwnerHandle,\n} from '../../schemas/mode';\nimport type { MinorModeOwner } from '../modeDefinition';\nimport { registerMinorModeOwner } from '../owner';\n\ntype ModeRegistrar = (definition: MinorModeOwnerDefinition<ExtensionContext>) => MinorModeOwnerHandle;\nexport type PiMinorModeContribution =\n | MinorModeOwner<MinorModeOwnerActionContext<ExtensionContext>>\n | Parameters<ModeRegistrar>[0];\nexport interface PiMinorModeCollection {\n snapshot(): readonly PiMinorModeContribution[];\n subscribe(listener: () => void): () => void;\n}\n\n/** Registers static or live owners for the injected catalog's lifetime. */\nexport function piMinorModes(\n modes: readonly PiMinorModeContribution[] | PiMinorModeCollection | undefined,\n): (context: Context) => void {\n return (context) => {\n if (!modes) return;\n context.inject([DOOM_MINOR_MODE_CATALOG_SERVICE], (child) => {\n const controller = new AbortController();\n const signal = controller.signal;\n child.effect(() => () => controller.abort());\n const catalog = requireMinorModeCatalog(child);\n const mounted = new Map<string, { declaration: PiMinorModeContribution; release(): void }>();\n let disposed = false;\n let reconciling = false;\n let pending = false;\n let subscribing = true;\n const reconcile = (): void => {\n pending = true;\n if (disposed || signal.aborted || subscribing || reconciling) return;\n reconciling = true;\n try {\n do {\n pending = false;\n const snapshot = 'snapshot' in modes ? modes.snapshot() : modes;\n const next = new Map<string, PiMinorModeContribution>();\n for (const declaration of snapshot) {\n const definition = 'definition' in declaration ? declaration.definition : declaration;\n const key = JSON.stringify([definition.descriptor.source, definition.descriptor.id]);\n if (next.has(key))\n throw new Error(\n `Duplicate live minor mode: ${definition.descriptor.source}/${definition.descriptor.id}`,\n );\n next.set(key, declaration);\n }\n for (const [key, entry] of mounted) {\n if (next.get(key) === entry.declaration) continue;\n mounted.delete(key);\n entry.release();\n }\n for (const [key, declaration] of next) {\n if (mounted.has(key)) continue;\n const owner = 'definition' in declaration ? declaration : undefined;\n const handle = registerMinorModeOwner(\n catalog,\n owner ? owner.definition : (declaration as Parameters<ModeRegistrar>[0]),\n );\n mounted.set(key, {\n declaration,\n release() {\n try {\n owner?.detach();\n } finally {\n handle.dispose();\n }\n },\n });\n owner?.attach(handle);\n }\n } while (pending && !disposed && !signal.aborted);\n } finally {\n reconciling = false;\n }\n };\n child.effect(() => () => {\n disposed = true;\n const entries = [...mounted.values()];\n mounted.clear();\n const errors: unknown[] = [];\n for (const entry of entries) {\n try {\n entry.release();\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length) throw new AggregateError(errors, 'Minor mode cleanup failed.');\n });\n if ('subscribe' in modes) {\n const unsubscribe = modes.subscribe(reconcile);\n child.effect(() => () => {\n disposed = true;\n unsubscribe();\n });\n }\n subscribing = false;\n reconcile();\n });\n };\n}\n"],"mappings":";;;;AAuBA,SAAgB,aACd,OAC4B;CAC5B,QAAQ,YAAY;EAClB,IAAI,CAAC,OAAO;EACZ,QAAQ,OAAO,CAAC,+BAA+B,IAAI,UAAU;GAC3D,MAAM,aAAa,IAAI,gBAAgB;GACvC,MAAM,SAAS,WAAW;GAC1B,MAAM,mBAAmB,WAAW,MAAM,CAAC;GAC3C,MAAM,UAAU,wBAAwB,KAAK;GAC7C,MAAM,0BAAU,IAAI,IAAuE;GAC3F,IAAI,WAAW;GACf,IAAI,cAAc;GAClB,IAAI,UAAU;GACd,IAAI,cAAc;GAClB,MAAM,kBAAwB;IAC5B,UAAU;IACV,IAAI,YAAY,OAAO,WAAW,eAAe,aAAa;IAC9D,cAAc;IACd,IAAI;KACF,GAAG;MACD,UAAU;MACV,MAAM,WAAW,cAAc,QAAQ,MAAM,SAAS,IAAI;MAC1D,MAAM,uBAAO,IAAI,IAAqC;MACtD,KAAK,MAAM,eAAe,UAAU;OAClC,MAAM,aAAa,gBAAgB,cAAc,YAAY,aAAa;OAC1E,MAAM,MAAM,KAAK,UAAU,CAAC,WAAW,WAAW,QAAQ,WAAW,WAAW,EAAE,CAAC;OACnF,IAAI,KAAK,IAAI,GAAG,GACd,MAAM,IAAI,MACR,8BAA8B,WAAW,WAAW,OAAO,GAAG,WAAW,WAAW,IACtF;OACF,KAAK,IAAI,KAAK,WAAW;MAC3B;MACA,KAAK,MAAM,CAAC,KAAK,UAAU,SAAS;OAClC,IAAI,KAAK,IAAI,GAAG,MAAM,MAAM,aAAa;OACzC,QAAQ,OAAO,GAAG;OAClB,MAAM,QAAQ;MAChB;MACA,KAAK,MAAM,CAAC,KAAK,gBAAgB,MAAM;OACrC,IAAI,QAAQ,IAAI,GAAG,GAAG;OACtB,MAAM,QAAQ,gBAAgB,cAAc,cAAc,KAAA;OAC1D,MAAM,SAAS,uBACb,SACA,QAAQ,MAAM,aAAc,WAC9B;OACA,QAAQ,IAAI,KAAK;QACf;QACA,UAAU;SACR,IAAI;UACF,OAAO,OAAO;SAChB,UAAU;UACR,OAAO,QAAQ;SACjB;QACF;OACF,CAAC;OACD,OAAO,OAAO,MAAM;MACtB;KACF,SAAS,WAAW,CAAC,YAAY,CAAC,OAAO;IAC3C,UAAU;KACR,cAAc;IAChB;GACF;GACA,MAAM,mBAAmB;IACvB,WAAW;IACX,MAAM,UAAU,CAAC,GAAG,QAAQ,OAAO,CAAC;IACpC,QAAQ,MAAM;IACd,MAAM,SAAoB,CAAC;IAC3B,KAAK,MAAM,SAAS,SAClB,IAAI;KACF,MAAM,QAAQ;IAChB,SAAS,OAAO;KACd,OAAO,KAAK,KAAK;IACnB;IAEF,IAAI,OAAO,QAAQ,MAAM,IAAI,eAAe,QAAQ,4BAA4B;GAClF,CAAC;GACD,IAAI,eAAe,OAAO;IACxB,MAAM,cAAc,MAAM,UAAU,SAAS;IAC7C,MAAM,mBAAmB;KACvB,WAAW;KACX,YAAY;IACd,CAAC;GACH;GACA,cAAc;GACd,UAAU;EACZ,CAAC;CACH;AACF"}
@@ -0,0 +1,35 @@
1
+ const require_mode = require("../../mode.cjs");
2
+ let _agimon_ai_doompi_core_headless = require("@agimon-ai/doompi-core/headless");
3
+ //#region src/services/serverRegistration/index.ts
4
+ function serverMinorModes(modes) {
5
+ return (context) => {
6
+ context.inject([_agimon_ai_doompi_core_headless.DOOM_HEADLESS_HOST_SERVICE, require_mode.DOOM_MINOR_MODE_CATALOG_SERVICE], (child) => {
7
+ const agent = (0, _agimon_ai_doompi_core_headless.requireDoomHeadlessHost)(child);
8
+ const owner = (0, _agimon_ai_doompi_core_headless.readDoomHeadlessOwner)(child);
9
+ if (!owner) throw new Error("A minor mode must have descriptor-owned package identity");
10
+ const catalog = require_mode.requireMinorModeCatalog(child);
11
+ for (const mode of modes) {
12
+ const definition = "definition" in mode ? mode.definition : mode;
13
+ const handle = catalog.registerOwner({
14
+ ...definition,
15
+ handleAction(id, args, execution) {
16
+ agent.assertActive(owner.packageName);
17
+ return definition.handleAction(id, args, {
18
+ ...execution,
19
+ context: agent.context
20
+ });
21
+ }
22
+ });
23
+ child.effect(() => () => handle.dispose());
24
+ if ("definition" in mode) {
25
+ child.effect(() => () => mode.detach());
26
+ mode.attach(handle);
27
+ }
28
+ }
29
+ });
30
+ };
31
+ }
32
+ //#endregion
33
+ exports.serverMinorModes = serverMinorModes;
34
+
35
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["DOOM_HEADLESS_HOST_SERVICE","DOOM_MINOR_MODE_CATALOG_SERVICE","requireDoomHeadlessHost","readDoomHeadlessOwner","requireMinorModeCatalog"],"sources":["../../../src/services/serverRegistration/index.ts"],"sourcesContent":["import {\n DOOM_HEADLESS_HOST_SERVICE,\n requireDoomHeadlessHost,\n readDoomHeadlessOwner,\n} from '@agimon-ai/doompi-core/headless';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport type { DoomHeadlessMinorMode } from '../../schemas/headless';\nimport { DOOM_MINOR_MODE_CATALOG_SERVICE, requireMinorModeCatalog } from '../../schemas/mode';\nimport type { MinorModeOwner } from '../modeDefinition';\n\nexport function serverMinorModes(\n modes: readonly (DoomHeadlessMinorMode | MinorModeOwner<Parameters<DoomHeadlessMinorMode['handleAction']>[2]>)[],\n): (context: Context) => void {\n return (context) => {\n context.inject([DOOM_HEADLESS_HOST_SERVICE, DOOM_MINOR_MODE_CATALOG_SERVICE], (child) => {\n const agent = requireDoomHeadlessHost(child);\n const owner = readDoomHeadlessOwner(child);\n if (!owner) throw new Error('A minor mode must have descriptor-owned package identity');\n const catalog = requireMinorModeCatalog(child);\n for (const mode of modes) {\n const definition = 'definition' in mode ? mode.definition : mode;\n const handle = catalog.registerOwner({\n ...definition,\n handleAction(id, args, execution) {\n agent.assertActive(owner.packageName);\n return definition.handleAction(id, args, { ...execution, context: agent.context });\n },\n });\n child.effect(() => () => handle.dispose());\n if ('definition' in mode) {\n child.effect(() => () => mode.detach());\n mode.attach(handle);\n }\n }\n });\n };\n}\n"],"mappings":";;;AAWA,SAAgB,iBACd,OAC4B;CAC5B,QAAQ,YAAY;EAClB,QAAQ,OAAO,CAACA,gCAAAA,4BAA4BC,aAAAA,+BAA+B,IAAI,UAAU;GACvF,MAAM,SAAA,GAAQC,gCAAAA,wBAAAA,CAAwB,KAAK;GAC3C,MAAM,SAAA,GAAQC,gCAAAA,sBAAAA,CAAsB,KAAK;GACzC,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,0DAA0D;GACtF,MAAM,UAAUC,aAAAA,wBAAwB,KAAK;GAC7C,KAAK,MAAM,QAAQ,OAAO;IACxB,MAAM,aAAa,gBAAgB,OAAO,KAAK,aAAa;IAC5D,MAAM,SAAS,QAAQ,cAAc;KACnC,GAAG;KACH,aAAa,IAAI,MAAM,WAAW;MAChC,MAAM,aAAa,MAAM,WAAW;MACpC,OAAO,WAAW,aAAa,IAAI,MAAM;OAAE,GAAG;OAAW,SAAS,MAAM;MAAQ,CAAC;KACnF;IACF,CAAC;IACD,MAAM,mBAAmB,OAAO,QAAQ,CAAC;IACzC,IAAI,gBAAgB,MAAM;KACxB,MAAM,mBAAmB,KAAK,OAAO,CAAC;KACtC,KAAK,OAAO,MAAM;IACpB;GACF;EACF,CAAC;CACH;AACF"}
@@ -0,0 +1,7 @@
1
+ import { MinorModeOwner } from "../../mode-definition.cjs";
2
+ import { DoomHeadlessMinorMode } from "../../schemas/headless.cjs";
3
+ import { Context } from "@deepseek-ai/cordis";
4
+ //#region src/services/serverRegistration/index.d.ts
5
+ export declare function serverMinorModes(modes: readonly (DoomHeadlessMinorMode | MinorModeOwner<Parameters<DoomHeadlessMinorMode['handleAction']>[2]>)[]): (context: Context) => void;
6
+ //#endregion
7
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/services/serverRegistration/index.ts"],"mappings":";;;;wBAWgB,iBACd,iBAAiB,wBAAwB,eAAe,WAAW,iDACjE,SAAS"}
@@ -0,0 +1,7 @@
1
+ import { MinorModeOwner } from "../../mode-definition.mjs";
2
+ import { DoomHeadlessMinorMode } from "../../schemas/headless.mjs";
3
+ import { Context } from "@deepseek-ai/cordis";
4
+ //#region src/services/serverRegistration/index.d.ts
5
+ export declare function serverMinorModes(modes: readonly (DoomHeadlessMinorMode | MinorModeOwner<Parameters<DoomHeadlessMinorMode['handleAction']>[2]>)[]): (context: Context) => void;
6
+ //#endregion
7
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/serverRegistration/index.ts"],"mappings":";;;;wBAWgB,iBACd,iBAAiB,wBAAwB,eAAe,WAAW,iDACjE,SAAS"}
@@ -0,0 +1,35 @@
1
+ import { DOOM_MINOR_MODE_CATALOG_SERVICE, requireMinorModeCatalog } from "../../mode.mjs";
2
+ import { DOOM_HEADLESS_HOST_SERVICE, readDoomHeadlessOwner, requireDoomHeadlessHost } from "@agimon-ai/doompi-core/headless";
3
+ //#region src/services/serverRegistration/index.ts
4
+ function serverMinorModes(modes) {
5
+ return (context) => {
6
+ context.inject([DOOM_HEADLESS_HOST_SERVICE, DOOM_MINOR_MODE_CATALOG_SERVICE], (child) => {
7
+ const agent = requireDoomHeadlessHost(child);
8
+ const owner = readDoomHeadlessOwner(child);
9
+ if (!owner) throw new Error("A minor mode must have descriptor-owned package identity");
10
+ const catalog = requireMinorModeCatalog(child);
11
+ for (const mode of modes) {
12
+ const definition = "definition" in mode ? mode.definition : mode;
13
+ const handle = catalog.registerOwner({
14
+ ...definition,
15
+ handleAction(id, args, execution) {
16
+ agent.assertActive(owner.packageName);
17
+ return definition.handleAction(id, args, {
18
+ ...execution,
19
+ context: agent.context
20
+ });
21
+ }
22
+ });
23
+ child.effect(() => () => handle.dispose());
24
+ if ("definition" in mode) {
25
+ child.effect(() => () => mode.detach());
26
+ mode.attach(handle);
27
+ }
28
+ }
29
+ });
30
+ };
31
+ }
32
+ //#endregion
33
+ export { serverMinorModes };
34
+
35
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/services/serverRegistration/index.ts"],"sourcesContent":["import {\n DOOM_HEADLESS_HOST_SERVICE,\n requireDoomHeadlessHost,\n readDoomHeadlessOwner,\n} from '@agimon-ai/doompi-core/headless';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport type { DoomHeadlessMinorMode } from '../../schemas/headless';\nimport { DOOM_MINOR_MODE_CATALOG_SERVICE, requireMinorModeCatalog } from '../../schemas/mode';\nimport type { MinorModeOwner } from '../modeDefinition';\n\nexport function serverMinorModes(\n modes: readonly (DoomHeadlessMinorMode | MinorModeOwner<Parameters<DoomHeadlessMinorMode['handleAction']>[2]>)[],\n): (context: Context) => void {\n return (context) => {\n context.inject([DOOM_HEADLESS_HOST_SERVICE, DOOM_MINOR_MODE_CATALOG_SERVICE], (child) => {\n const agent = requireDoomHeadlessHost(child);\n const owner = readDoomHeadlessOwner(child);\n if (!owner) throw new Error('A minor mode must have descriptor-owned package identity');\n const catalog = requireMinorModeCatalog(child);\n for (const mode of modes) {\n const definition = 'definition' in mode ? mode.definition : mode;\n const handle = catalog.registerOwner({\n ...definition,\n handleAction(id, args, execution) {\n agent.assertActive(owner.packageName);\n return definition.handleAction(id, args, { ...execution, context: agent.context });\n },\n });\n child.effect(() => () => handle.dispose());\n if ('definition' in mode) {\n child.effect(() => () => mode.detach());\n mode.attach(handle);\n }\n }\n });\n };\n}\n"],"mappings":";;;AAWA,SAAgB,iBACd,OAC4B;CAC5B,QAAQ,YAAY;EAClB,QAAQ,OAAO,CAAC,4BAA4B,+BAA+B,IAAI,UAAU;GACvF,MAAM,QAAQ,wBAAwB,KAAK;GAC3C,MAAM,QAAQ,sBAAsB,KAAK;GACzC,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,0DAA0D;GACtF,MAAM,UAAU,wBAAwB,KAAK;GAC7C,KAAK,MAAM,QAAQ,OAAO;IACxB,MAAM,aAAa,gBAAgB,OAAO,KAAK,aAAa;IAC5D,MAAM,SAAS,QAAQ,cAAc;KACnC,GAAG;KACH,aAAa,IAAI,MAAM,WAAW;MAChC,MAAM,aAAa,MAAM,WAAW;MACpC,OAAO,WAAW,aAAa,IAAI,MAAM;OAAE,GAAG;OAAW,SAAS,MAAM;MAAQ,CAAC;KACnF;IACF,CAAC;IACD,MAAM,mBAAmB,OAAO,QAAQ,CAAC;IACzC,IAAI,gBAAgB,MAAM;KACxB,MAAM,mBAAmB,KAAK,OAAO,CAAC;KACtC,KAAK,OAAO,MAAM;IACpB;GACF;EACF,CAAC;CACH;AACF"}
@@ -0,0 +1,84 @@
1
+ const require_mode = require("../../mode.cjs");
2
+ let _agimon_ai_doompi_core_runtime_protocol = require("@agimon-ai/doompi-core/runtime-protocol");
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_runtime_protocol.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
+ exports.minorModeKey = minorModeKey;
80
+ exports.minorModeRegistrationRef = minorModeRegistrationRef;
81
+ exports.validateMinorModeActionArguments = validateMinorModeActionArguments;
82
+ exports.validateMinorModeDefinition = validateMinorModeDefinition;
83
+
84
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["DoomProtocolError","MINOR_MODE_ERROR_CODE"],"sources":["../../../src/services/validation/index.ts"],"sourcesContent":["import { DoomProtocolError } from '@agimon-ai/doompi-core/runtime-protocol';\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,8 @@
1
+ import { MinorModeActionDescriptor, MinorModeArguments, MinorModeDescriptor, MinorModeRecord, MinorModeRegistrationRef, MinorModeState } from "../../mode.cjs";
2
+ //#region src/services/validation/index.d.ts
3
+ export declare function minorModeKey(identity: Pick<MinorModeDescriptor, 'source' | 'id'>): string;
4
+ export declare function minorModeRegistrationRef(record: MinorModeRecord): MinorModeRegistrationRef;
5
+ export declare function validateMinorModeDefinition(descriptor: MinorModeDescriptor, state: MinorModeState): string | undefined;
6
+ export declare function validateMinorModeActionArguments(action: MinorModeActionDescriptor, argumentsValue: MinorModeArguments): void;
7
+ //#endregion
8
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/services/validation/index.ts"],"mappings":";;wBAYgB,aAAa,UAAU,KAAK;wBAI5B,yBAAyB,QAAQ,kBAAkB;wBAkBnD,4BACd,YAAY,qBACZ,OAAO;wBA4CO,iCACd,QAAQ,2BACR,gBAAgB"}
@@ -0,0 +1,8 @@
1
+ import { MinorModeActionDescriptor, MinorModeArguments, MinorModeDescriptor, MinorModeRecord, MinorModeRegistrationRef, MinorModeState } from "../../mode.mjs";
2
+ //#region src/services/validation/index.d.ts
3
+ export declare function minorModeKey(identity: Pick<MinorModeDescriptor, 'source' | 'id'>): string;
4
+ export declare function minorModeRegistrationRef(record: MinorModeRecord): MinorModeRegistrationRef;
5
+ export declare function validateMinorModeDefinition(descriptor: MinorModeDescriptor, state: MinorModeState): string | undefined;
6
+ export declare function validateMinorModeActionArguments(action: MinorModeActionDescriptor, argumentsValue: MinorModeArguments): void;
7
+ //#endregion
8
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/validation/index.ts"],"mappings":";;wBAYgB,aAAa,UAAU,KAAK;wBAI5B,yBAAyB,QAAQ,kBAAkB;wBAkBnD,4BACd,YAAY,qBACZ,OAAO;wBA4CO,iCACd,QAAQ,2BACR,gBAAgB"}
@@ -0,0 +1,81 @@
1
+ import { MINOR_MODE_ERROR_CODE } from "../../mode.mjs";
2
+ import { DoomProtocolError } from "@agimon-ai/doompi-core/runtime-protocol";
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 { minorModeKey, minorModeRegistrationRef, validateMinorModeActionArguments, validateMinorModeDefinition };
80
+
81
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/services/validation/index.ts"],"sourcesContent":["import { DoomProtocolError } from '@agimon-ai/doompi-core/runtime-protocol';\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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"}
package/package.json ADDED
@@ -0,0 +1,157 @@
1
+ {
2
+ "name": "@agimon-ai/doompi-minor-mode",
3
+ "version": "0.0.1-alpha.70",
4
+ "description": "Minor-mode ownership, catalog, commands, and session lifecycle.",
5
+ "keywords": [
6
+ "ai",
7
+ "coding-agent",
8
+ "developer-tools",
9
+ "doompi",
10
+ "layer-composition",
11
+ "major-mode",
12
+ "pi-coding-agent",
13
+ "pi-extension",
14
+ "pi-package",
15
+ "session-reload"
16
+ ],
17
+ "homepage": "https://agimon.ai",
18
+ "bugs": {
19
+ "url": "https://github.com/AgiFlow/doompi/issues"
20
+ },
21
+ "license": "MIT",
22
+ "author": "Vuong Ngo",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/AgiFlow/doompi.git",
26
+ "directory": "packages/core/doompi-minor-mode"
27
+ },
28
+ "files": [
29
+ "dist",
30
+ "llms.txt",
31
+ "src/prompts",
32
+ "README.md",
33
+ "LICENSE",
34
+ "package.json"
35
+ ],
36
+ "type": "module",
37
+ "main": "./dist/index.cjs",
38
+ "types": "./dist/index.d.mts",
39
+ "jsnext:main": "./dist/index.mjs",
40
+ "exports": {
41
+ ".": {
42
+ "types": "./dist/index.d.mts",
43
+ "import": "./dist/index.mjs",
44
+ "require": "./dist/index.cjs"
45
+ },
46
+ "./command": {
47
+ "types": "./dist/command.d.mts",
48
+ "import": "./dist/command.mjs",
49
+ "require": "./dist/command.cjs"
50
+ },
51
+ "./catalog": {
52
+ "types": "./dist/catalog.d.mts",
53
+ "import": "./dist/catalog.mjs",
54
+ "require": "./dist/catalog.cjs"
55
+ },
56
+ "./projection": {
57
+ "types": "./dist/projection.d.mts",
58
+ "import": "./dist/projection.mjs",
59
+ "require": "./dist/projection.cjs"
60
+ },
61
+ "./reload-handoff": {
62
+ "types": "./dist/reload-handoff.d.mts",
63
+ "import": "./dist/reload-handoff.mjs",
64
+ "require": "./dist/reload-handoff.cjs"
65
+ },
66
+ "./minor-mode-command": {
67
+ "types": "./dist/minor-mode-command.d.mts",
68
+ "import": "./dist/minor-mode-command.mjs",
69
+ "require": "./dist/minor-mode-command.cjs"
70
+ },
71
+ "./mode": {
72
+ "types": "./dist/mode.d.mts",
73
+ "import": "./dist/mode.mjs",
74
+ "require": "./dist/mode.cjs"
75
+ },
76
+ "./mode-definition": {
77
+ "types": "./dist/mode-definition.d.mts",
78
+ "import": "./dist/mode-definition.mjs",
79
+ "require": "./dist/mode-definition.cjs"
80
+ },
81
+ "./owner": {
82
+ "types": "./dist/owner.d.mts",
83
+ "import": "./dist/owner.mjs",
84
+ "require": "./dist/owner.cjs"
85
+ },
86
+ "./extensions/pi": {
87
+ "types": "./dist/extensions/pi.d.mts",
88
+ "import": "./dist/extensions/pi.mjs",
89
+ "require": "./dist/extensions/pi.cjs"
90
+ },
91
+ "./package.json": "./package.json",
92
+ "./extensions/server": {
93
+ "types": "./dist/extensions/server.d.mts",
94
+ "import": "./dist/extensions/server.mjs",
95
+ "require": "./dist/extensions/server.cjs"
96
+ }
97
+ },
98
+ "publishConfig": {
99
+ "access": "public"
100
+ },
101
+ "dependencies": {
102
+ "@deepseek-ai/cordis": "4.0.2",
103
+ "typebox": "1.3.25",
104
+ "@agimon-ai/doompi-core": "0.0.1-alpha.70",
105
+ "@agimon-ai/doompi-telemetry": "0.0.1-alpha.68"
106
+ },
107
+ "devDependencies": {
108
+ "@deepseek-ai/cordis": "4.0.2",
109
+ "@earendil-works/pi-coding-agent": "0.85.1",
110
+ "@earendil-works/pi-tui": "0.85.1",
111
+ "@types/node": "26.4.1",
112
+ "@vitest/coverage-v8": "5.0.0",
113
+ "tsdown": "0.23.0",
114
+ "typescript": "7.0.2",
115
+ "vitest": "5.0.0",
116
+ "@agimon-ai/vibe-lint-plugin-doom-extension": "0.0.1-alpha.66"
117
+ },
118
+ "peerDependencies": {
119
+ "@earendil-works/pi-coding-agent": "0.85.1",
120
+ "@earendil-works/pi-tui": "0.85.1"
121
+ },
122
+ "peerDependenciesMeta": {
123
+ "@earendil-works/pi-coding-agent": {
124
+ "optional": true
125
+ },
126
+ "@earendil-works/pi-tui": {
127
+ "optional": true
128
+ }
129
+ },
130
+ "engines": {
131
+ "node": ">=22.19.0"
132
+ },
133
+ "doompiServer": {
134
+ "entry": "./src/extensions/server.ts",
135
+ "dist": "./dist/extensions/server.mjs",
136
+ "scopes": [
137
+ "session"
138
+ ],
139
+ "required": true,
140
+ "contracts": {
141
+ "entry": "./src/exports/apiContracts.ts",
142
+ "dist": "./dist/api-contracts.mjs"
143
+ }
144
+ },
145
+ "pi": {
146
+ "extensions": [
147
+ "./dist/extensions/pi.mjs"
148
+ ]
149
+ },
150
+ "scripts": {
151
+ "build": "tsdown",
152
+ "test": "vitest --run",
153
+ "typecheck": "tsc --noEmit",
154
+ "lint": "oxlint . && oxfmt . --check",
155
+ "fixcode": "oxlint . --fix && oxfmt ."
156
+ }
157
+ }