@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
package/dist/mode.mjs ADDED
@@ -0,0 +1,241 @@
1
+ import { Type } from "typebox";
2
+ //#region src/schemas/mode.ts
3
+ const MINOR_MODE_CATALOG_SOURCE = "@agimon-ai/doompi/mode-catalog";
4
+ const DOOM_MINOR_MODE_CATALOG_SERVICE = "doom/minor-mode-catalog";
5
+ const MINOR_MODE_TOOL_NAME = "minor_mode";
6
+ const MINOR_MODE_ACTION_TIMEOUT_MS = 3e4;
7
+ const MINOR_MODE_MAX_RECORDS = 128;
8
+ const MINOR_MODE_MAX_ACTIONS = 16;
9
+ const MINOR_MODE_MAX_PARAMETERS = 16;
10
+ const MINOR_MODE_MAX_ENUM_CHOICES = 32;
11
+ const MINOR_MODE_MAX_ARGUMENT_LENGTH = 4096;
12
+ const MAX_SOURCE_LENGTH = 128;
13
+ const MAX_ID_LENGTH = 128;
14
+ const MAX_GENERATION_LENGTH = 256;
15
+ const MAX_LABEL_LENGTH = 48;
16
+ const MAX_DESCRIPTION_LENGTH = 240;
17
+ const MAX_DETAIL_LENGTH = 160;
18
+ const MINOR_MODE_ERROR_CODE = {
19
+ actionAborted: "MINOR_MODE_ACTION_ABORTED",
20
+ actionDisabled: "MINOR_MODE_ACTION_DISABLED",
21
+ actionNotFound: "MINOR_MODE_ACTION_NOT_FOUND",
22
+ actionTimeout: "MINOR_MODE_ACTION_TIMEOUT",
23
+ invalidArguments: "MINOR_MODE_INVALID_ARGUMENTS",
24
+ modeBusy: "MINOR_MODE_BUSY",
25
+ modeNotFound: "MINOR_MODE_NOT_FOUND",
26
+ ownerFailed: "MINOR_MODE_OWNER_FAILED",
27
+ registrationConflict: "MINOR_MODE_REGISTRATION_CONFLICT",
28
+ sessionReplaced: "MINOR_MODE_SESSION_REPLACED",
29
+ staleRegistration: "MINOR_MODE_STALE_REGISTRATION",
30
+ unsupportedContext: "MINOR_MODE_UNSUPPORTED_CONTEXT"
31
+ };
32
+ const MinorModeSourceSchema = Type.String({
33
+ minLength: 1,
34
+ maxLength: MAX_SOURCE_LENGTH,
35
+ pattern: "^[A-Za-z0-9@][A-Za-z0-9@/._:-]*$"
36
+ });
37
+ const MinorModeIdSchema = Type.String({
38
+ minLength: 1,
39
+ maxLength: MAX_ID_LENGTH,
40
+ pattern: "^[a-z0-9][a-z0-9._:-]*$"
41
+ });
42
+ const MinorModeParameterNameSchema = Type.String({
43
+ minLength: 1,
44
+ maxLength: MAX_ID_LENGTH,
45
+ pattern: "^[a-z][A-Za-z0-9._:-]*$"
46
+ });
47
+ const GenerationSchema = Type.String({
48
+ minLength: 1,
49
+ maxLength: MAX_GENERATION_LENGTH
50
+ });
51
+ const LabelSchema = Type.String({
52
+ minLength: 1,
53
+ maxLength: MAX_LABEL_LENGTH
54
+ });
55
+ const DescriptionSchema = Type.String({
56
+ minLength: 1,
57
+ maxLength: MAX_DESCRIPTION_LENGTH
58
+ });
59
+ const OperationIdSchema = Type.String({
60
+ minLength: 1,
61
+ maxLength: MAX_GENERATION_LENGTH
62
+ });
63
+ const ModeTextColorSchema = Type.Union([
64
+ Type.Literal("accent"),
65
+ Type.Literal("warning"),
66
+ Type.Literal("mdHeading"),
67
+ Type.Literal("muted"),
68
+ Type.Literal("dim")
69
+ ]);
70
+ const MinorModeSessionKindSchema = Type.Union([Type.Literal("tui"), Type.Literal("headless")]);
71
+ const MinorModeActivationSchema = Type.Union([
72
+ Type.Literal("inactive"),
73
+ Type.Literal("activating"),
74
+ Type.Literal("active"),
75
+ Type.Literal("deactivating")
76
+ ]);
77
+ const MinorModeConditionSchema = Type.Union([
78
+ Type.Literal("ready"),
79
+ Type.Literal("paused"),
80
+ Type.Literal("blocked"),
81
+ Type.Literal("limited"),
82
+ Type.Literal("queued"),
83
+ Type.Literal("degraded"),
84
+ Type.Literal("failed")
85
+ ]);
86
+ const MinorModeScalarSchema = Type.Union([
87
+ Type.String({ maxLength: MINOR_MODE_MAX_ARGUMENT_LENGTH }),
88
+ Type.Number(),
89
+ Type.Boolean()
90
+ ]);
91
+ const ParameterBase = {
92
+ name: MinorModeParameterNameSchema,
93
+ label: LabelSchema,
94
+ description: Type.Optional(DescriptionSchema),
95
+ required: Type.Boolean()
96
+ };
97
+ const MinorModeActionParameterSchema = Type.Union([
98
+ Type.Object({
99
+ ...ParameterBase,
100
+ kind: Type.Literal("string"),
101
+ minLength: Type.Optional(Type.Integer({
102
+ minimum: 0,
103
+ maximum: MINOR_MODE_MAX_ARGUMENT_LENGTH
104
+ })),
105
+ maxLength: Type.Optional(Type.Integer({
106
+ minimum: 1,
107
+ maximum: MINOR_MODE_MAX_ARGUMENT_LENGTH
108
+ }))
109
+ }, { additionalProperties: false }),
110
+ Type.Object({
111
+ ...ParameterBase,
112
+ kind: Type.Literal("number"),
113
+ integer: Type.Optional(Type.Boolean()),
114
+ minimum: Type.Optional(Type.Number()),
115
+ maximum: Type.Optional(Type.Number())
116
+ }, { additionalProperties: false }),
117
+ Type.Object({
118
+ ...ParameterBase,
119
+ kind: Type.Literal("boolean")
120
+ }, { additionalProperties: false }),
121
+ Type.Object({
122
+ ...ParameterBase,
123
+ kind: Type.Literal("enum"),
124
+ choices: Type.Array(Type.Object({
125
+ value: Type.String({
126
+ minLength: 1,
127
+ maxLength: MAX_ID_LENGTH
128
+ }),
129
+ label: LabelSchema
130
+ }, { additionalProperties: false }), {
131
+ minItems: 1,
132
+ maxItems: 32
133
+ })
134
+ }, { additionalProperties: false })
135
+ ]);
136
+ const MinorModeActionDescriptorSchema = Type.Object({
137
+ id: MinorModeIdSchema,
138
+ label: LabelSchema,
139
+ description: DescriptionSchema,
140
+ contexts: Type.Array(MinorModeSessionKindSchema, {
141
+ minItems: 1,
142
+ maxItems: 2,
143
+ uniqueItems: true
144
+ }),
145
+ parameters: Type.Array(MinorModeActionParameterSchema, { maxItems: 16 })
146
+ }, { additionalProperties: false });
147
+ const MinorModeDescriptorSchema = Type.Object({
148
+ source: MinorModeSourceSchema,
149
+ id: MinorModeIdSchema,
150
+ label: LabelSchema,
151
+ description: DescriptionSchema,
152
+ order: Type.Integer({
153
+ minimum: 0,
154
+ maximum: 1e3
155
+ }),
156
+ actions: Type.Array(MinorModeActionDescriptorSchema, { maxItems: 16 })
157
+ }, { additionalProperties: false });
158
+ const MinorModeActionAvailabilitySchema = Type.Object({
159
+ id: MinorModeIdSchema,
160
+ enabled: Type.Boolean(),
161
+ disabledReason: Type.Optional(Type.String({
162
+ minLength: 1,
163
+ maxLength: MAX_DETAIL_LENGTH
164
+ }))
165
+ }, { additionalProperties: false });
166
+ const MinorModeStateSchema = Type.Object({
167
+ activation: MinorModeActivationSchema,
168
+ condition: MinorModeConditionSchema,
169
+ detail: Type.Optional(Type.String({
170
+ minLength: 1,
171
+ maxLength: MAX_DETAIL_LENGTH
172
+ })),
173
+ color: Type.Optional(ModeTextColorSchema),
174
+ modelContextVariant: Type.Optional(Type.String({
175
+ minLength: 1,
176
+ maxLength: MAX_ID_LENGTH
177
+ })),
178
+ actions: Type.Array(MinorModeActionAvailabilitySchema, { maxItems: 16 })
179
+ }, { additionalProperties: false });
180
+ const MinorModeRegistrationRefSchema = Type.Object({
181
+ source: MinorModeSourceSchema,
182
+ id: MinorModeIdSchema,
183
+ ownerGeneration: GenerationSchema,
184
+ registrationId: GenerationSchema
185
+ }, { additionalProperties: false });
186
+ const MinorModeRecordSchema = Type.Object({
187
+ descriptor: MinorModeDescriptorSchema,
188
+ state: MinorModeStateSchema,
189
+ ownerGeneration: GenerationSchema,
190
+ registrationId: GenerationSchema,
191
+ stateRevision: Type.Integer({ minimum: 0 })
192
+ }, { additionalProperties: false });
193
+ const MinorModeCatalogSnapshotSchema = Type.Object({
194
+ hostGeneration: GenerationSchema,
195
+ revision: Type.Integer({ minimum: 0 }),
196
+ modes: Type.Array(MinorModeRecordSchema, { maxItems: 128 })
197
+ }, { additionalProperties: false });
198
+ const MinorModeArgumentsSchema = Type.Record(MinorModeParameterNameSchema, MinorModeScalarSchema, { maxProperties: 16 });
199
+ const MinorModeToolInputSchema = Type.Object({
200
+ action: Type.Union([Type.Literal("list"), Type.Literal("invoke")]),
201
+ source: Type.Optional(MinorModeSourceSchema),
202
+ id: Type.Optional(MinorModeIdSchema),
203
+ ownerGeneration: Type.Optional(GenerationSchema),
204
+ registrationId: Type.Optional(GenerationSchema),
205
+ modeAction: Type.Optional(MinorModeIdSchema),
206
+ arguments: Type.Optional(MinorModeArgumentsSchema)
207
+ }, { additionalProperties: false });
208
+ const MinorModeToolResultSchema = Type.Unknown();
209
+ const MinorModeActionRequestSchema = Type.Object({
210
+ operationId: OperationIdSchema,
211
+ mode: MinorModeRegistrationRefSchema,
212
+ actionId: MinorModeIdSchema,
213
+ arguments: MinorModeArgumentsSchema
214
+ }, { additionalProperties: false });
215
+ const MinorModeActionResponseSchema = Type.Object({
216
+ operationId: OperationIdSchema,
217
+ catalogRevision: Type.Integer({ minimum: 0 }),
218
+ mode: MinorModeRecordSchema,
219
+ message: Type.Optional(Type.String({
220
+ minLength: 1,
221
+ maxLength: MAX_DETAIL_LENGTH
222
+ }))
223
+ }, { additionalProperties: false });
224
+ /**
225
+ * The custom session entry the catalog host journals whenever its projection
226
+ * changes. It rides Pi's entry_appended frames, so any RPC client (the web
227
+ * cockpit) sees minor-mode state live and on replay without a new protocol.
228
+ */
229
+ const DOOM_MINOR_MODE_ENTRY_TYPE = "doom-minor-modes";
230
+ function readMinorModeCatalog(context) {
231
+ return context.get(DOOM_MINOR_MODE_CATALOG_SERVICE);
232
+ }
233
+ function requireMinorModeCatalog(context) {
234
+ const catalog = readMinorModeCatalog(context);
235
+ if (!catalog) throw new Error("Doom minor-mode catalog is unavailable.");
236
+ return catalog;
237
+ }
238
+ //#endregion
239
+ export { DOOM_MINOR_MODE_CATALOG_SERVICE, DOOM_MINOR_MODE_ENTRY_TYPE, MINOR_MODE_ACTION_TIMEOUT_MS, MINOR_MODE_CATALOG_SOURCE, MINOR_MODE_ERROR_CODE, MINOR_MODE_MAX_ACTIONS, MINOR_MODE_MAX_ARGUMENT_LENGTH, MINOR_MODE_MAX_ENUM_CHOICES, MINOR_MODE_MAX_PARAMETERS, MINOR_MODE_MAX_RECORDS, MINOR_MODE_TOOL_NAME, MinorModeActionAvailabilitySchema, MinorModeActionDescriptorSchema, MinorModeActionParameterSchema, MinorModeActionRequestSchema, MinorModeActionResponseSchema, MinorModeActivationSchema, MinorModeArgumentsSchema, MinorModeCatalogSnapshotSchema, MinorModeConditionSchema, MinorModeDescriptorSchema, MinorModeIdSchema, MinorModeParameterNameSchema, MinorModeRecordSchema, MinorModeRegistrationRefSchema, MinorModeScalarSchema, MinorModeSessionKindSchema, MinorModeSourceSchema, MinorModeStateSchema, MinorModeToolInputSchema, MinorModeToolResultSchema, ModeTextColorSchema, readMinorModeCatalog, requireMinorModeCatalog };
240
+
241
+ //# sourceMappingURL=mode.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode.mjs","names":[],"sources":["../src/schemas/mode.ts"],"sourcesContent":["import type { DoomExtensionContext } from '@agimon-ai/doompi-core/runtime-config';\nimport type { Context } from '@deepseek-ai/cordis';\nimport { type Static, Type } from 'typebox';\n\nexport const MINOR_MODE_CATALOG_SOURCE = '@agimon-ai/doompi/mode-catalog';\nexport const DOOM_MINOR_MODE_CATALOG_SERVICE = 'doom/minor-mode-catalog';\nexport const MINOR_MODE_TOOL_NAME = 'minor_mode';\nexport const MINOR_MODE_ACTION_TIMEOUT_MS = 30_000;\nexport const MINOR_MODE_MAX_RECORDS = 128;\nexport const MINOR_MODE_MAX_ACTIONS = 16;\nexport const MINOR_MODE_MAX_PARAMETERS = 16;\nexport const MINOR_MODE_MAX_ENUM_CHOICES = 32;\nexport const MINOR_MODE_MAX_ARGUMENT_LENGTH = 4_096;\n\nconst MAX_SOURCE_LENGTH = 128;\nconst MAX_ID_LENGTH = 128;\nconst MAX_GENERATION_LENGTH = 256;\nconst MAX_LABEL_LENGTH = 48;\nconst MAX_DESCRIPTION_LENGTH = 240;\nconst MAX_DETAIL_LENGTH = 160;\n\nexport const MINOR_MODE_ERROR_CODE = {\n actionAborted: 'MINOR_MODE_ACTION_ABORTED',\n actionDisabled: 'MINOR_MODE_ACTION_DISABLED',\n actionNotFound: 'MINOR_MODE_ACTION_NOT_FOUND',\n actionTimeout: 'MINOR_MODE_ACTION_TIMEOUT',\n invalidArguments: 'MINOR_MODE_INVALID_ARGUMENTS',\n modeBusy: 'MINOR_MODE_BUSY',\n modeNotFound: 'MINOR_MODE_NOT_FOUND',\n ownerFailed: 'MINOR_MODE_OWNER_FAILED',\n registrationConflict: 'MINOR_MODE_REGISTRATION_CONFLICT',\n sessionReplaced: 'MINOR_MODE_SESSION_REPLACED',\n staleRegistration: 'MINOR_MODE_STALE_REGISTRATION',\n unsupportedContext: 'MINOR_MODE_UNSUPPORTED_CONTEXT',\n} as const;\n\nexport const MinorModeSourceSchema = Type.String({\n minLength: 1,\n maxLength: MAX_SOURCE_LENGTH,\n pattern: '^[A-Za-z0-9@][A-Za-z0-9@/._:-]*$',\n});\nexport const MinorModeIdSchema = Type.String({\n minLength: 1,\n maxLength: MAX_ID_LENGTH,\n pattern: '^[a-z0-9][a-z0-9._:-]*$',\n});\nexport const MinorModeParameterNameSchema = Type.String({\n minLength: 1,\n maxLength: MAX_ID_LENGTH,\n pattern: '^[a-z][A-Za-z0-9._:-]*$',\n});\nconst GenerationSchema = Type.String({ minLength: 1, maxLength: MAX_GENERATION_LENGTH });\nconst LabelSchema = Type.String({ minLength: 1, maxLength: MAX_LABEL_LENGTH });\nconst DescriptionSchema = Type.String({ minLength: 1, maxLength: MAX_DESCRIPTION_LENGTH });\nconst OperationIdSchema = Type.String({ minLength: 1, maxLength: MAX_GENERATION_LENGTH });\n\nexport const ModeTextColorSchema = Type.Union([\n Type.Literal('accent'),\n Type.Literal('warning'),\n Type.Literal('mdHeading'),\n Type.Literal('muted'),\n Type.Literal('dim'),\n]);\nexport type ModeTextColor = Static<typeof ModeTextColorSchema>;\n\nexport const MinorModeSessionKindSchema = Type.Union([Type.Literal('tui'), Type.Literal('headless')]);\nexport type MinorModeSessionKind = Static<typeof MinorModeSessionKindSchema>;\n\nexport const MinorModeActivationSchema = Type.Union([\n Type.Literal('inactive'),\n Type.Literal('activating'),\n Type.Literal('active'),\n Type.Literal('deactivating'),\n]);\nexport type MinorModeActivation = Static<typeof MinorModeActivationSchema>;\n\nexport const MinorModeConditionSchema = Type.Union([\n Type.Literal('ready'),\n Type.Literal('paused'),\n Type.Literal('blocked'),\n Type.Literal('limited'),\n Type.Literal('queued'),\n Type.Literal('degraded'),\n Type.Literal('failed'),\n]);\nexport type MinorModeCondition = Static<typeof MinorModeConditionSchema>;\n\nexport const MinorModeScalarSchema = Type.Union([\n Type.String({ maxLength: MINOR_MODE_MAX_ARGUMENT_LENGTH }),\n Type.Number(),\n Type.Boolean(),\n]);\nexport type MinorModeScalar = Static<typeof MinorModeScalarSchema>;\n\nconst ParameterBase = {\n name: MinorModeParameterNameSchema,\n label: LabelSchema,\n description: Type.Optional(DescriptionSchema),\n required: Type.Boolean(),\n};\n\nexport const MinorModeActionParameterSchema = Type.Union([\n Type.Object(\n {\n ...ParameterBase,\n kind: Type.Literal('string'),\n minLength: Type.Optional(Type.Integer({ minimum: 0, maximum: MINOR_MODE_MAX_ARGUMENT_LENGTH })),\n maxLength: Type.Optional(Type.Integer({ minimum: 1, maximum: MINOR_MODE_MAX_ARGUMENT_LENGTH })),\n },\n { additionalProperties: false },\n ),\n Type.Object(\n {\n ...ParameterBase,\n kind: Type.Literal('number'),\n integer: Type.Optional(Type.Boolean()),\n minimum: Type.Optional(Type.Number()),\n maximum: Type.Optional(Type.Number()),\n },\n { additionalProperties: false },\n ),\n Type.Object({ ...ParameterBase, kind: Type.Literal('boolean') }, { additionalProperties: false }),\n Type.Object(\n {\n ...ParameterBase,\n kind: Type.Literal('enum'),\n choices: Type.Array(\n Type.Object(\n {\n value: Type.String({ minLength: 1, maxLength: MAX_ID_LENGTH }),\n label: LabelSchema,\n },\n { additionalProperties: false },\n ),\n { minItems: 1, maxItems: MINOR_MODE_MAX_ENUM_CHOICES },\n ),\n },\n { additionalProperties: false },\n ),\n]);\nexport type MinorModeActionParameter = Static<typeof MinorModeActionParameterSchema>;\n\nexport const MinorModeActionDescriptorSchema = Type.Object(\n {\n id: MinorModeIdSchema,\n label: LabelSchema,\n description: DescriptionSchema,\n contexts: Type.Array(MinorModeSessionKindSchema, { minItems: 1, maxItems: 2, uniqueItems: true }),\n parameters: Type.Array(MinorModeActionParameterSchema, { maxItems: MINOR_MODE_MAX_PARAMETERS }),\n },\n { additionalProperties: false },\n);\nexport type MinorModeActionDescriptor = Static<typeof MinorModeActionDescriptorSchema>;\n\nexport const MinorModeDescriptorSchema = Type.Object(\n {\n source: MinorModeSourceSchema,\n id: MinorModeIdSchema,\n label: LabelSchema,\n description: DescriptionSchema,\n order: Type.Integer({ minimum: 0, maximum: 1_000 }),\n actions: Type.Array(MinorModeActionDescriptorSchema, { maxItems: MINOR_MODE_MAX_ACTIONS }),\n },\n { additionalProperties: false },\n);\nexport type MinorModeDescriptor = Static<typeof MinorModeDescriptorSchema>;\n\nexport const MinorModeActionAvailabilitySchema = Type.Object(\n {\n id: MinorModeIdSchema,\n enabled: Type.Boolean(),\n disabledReason: Type.Optional(Type.String({ minLength: 1, maxLength: MAX_DETAIL_LENGTH })),\n },\n { additionalProperties: false },\n);\nexport type MinorModeActionAvailability = Static<typeof MinorModeActionAvailabilitySchema>;\n\nexport const MinorModeStateSchema = Type.Object(\n {\n activation: MinorModeActivationSchema,\n condition: MinorModeConditionSchema,\n detail: Type.Optional(Type.String({ minLength: 1, maxLength: MAX_DETAIL_LENGTH })),\n color: Type.Optional(ModeTextColorSchema),\n modelContextVariant: Type.Optional(Type.String({ minLength: 1, maxLength: MAX_ID_LENGTH })),\n actions: Type.Array(MinorModeActionAvailabilitySchema, { maxItems: MINOR_MODE_MAX_ACTIONS }),\n },\n { additionalProperties: false },\n);\nexport type MinorModeState = Static<typeof MinorModeStateSchema>;\n\nexport const MinorModeRegistrationRefSchema = Type.Object(\n {\n source: MinorModeSourceSchema,\n id: MinorModeIdSchema,\n ownerGeneration: GenerationSchema,\n registrationId: GenerationSchema,\n },\n { additionalProperties: false },\n);\nexport type MinorModeRegistrationRef = Static<typeof MinorModeRegistrationRefSchema>;\n\nexport const MinorModeRecordSchema = Type.Object(\n {\n descriptor: MinorModeDescriptorSchema,\n state: MinorModeStateSchema,\n ownerGeneration: GenerationSchema,\n registrationId: GenerationSchema,\n stateRevision: Type.Integer({ minimum: 0 }),\n },\n { additionalProperties: false },\n);\nexport type MinorModeRecord = Static<typeof MinorModeRecordSchema>;\n\nexport const MinorModeCatalogSnapshotSchema = Type.Object(\n {\n hostGeneration: GenerationSchema,\n revision: Type.Integer({ minimum: 0 }),\n modes: Type.Array(MinorModeRecordSchema, { maxItems: MINOR_MODE_MAX_RECORDS }),\n },\n { additionalProperties: false },\n);\nexport type MinorModeCatalogSnapshot = Static<typeof MinorModeCatalogSnapshotSchema>;\n\nexport const MinorModeArgumentsSchema = Type.Record(MinorModeParameterNameSchema, MinorModeScalarSchema, {\n maxProperties: MINOR_MODE_MAX_PARAMETERS,\n});\nexport type MinorModeArguments = Static<typeof MinorModeArgumentsSchema>;\n\nexport const MinorModeToolInputSchema = Type.Object(\n {\n action: Type.Union([Type.Literal('list'), Type.Literal('invoke')]),\n source: Type.Optional(MinorModeSourceSchema),\n id: Type.Optional(MinorModeIdSchema),\n ownerGeneration: Type.Optional(GenerationSchema),\n registrationId: Type.Optional(GenerationSchema),\n modeAction: Type.Optional(MinorModeIdSchema),\n arguments: Type.Optional(MinorModeArgumentsSchema),\n },\n { additionalProperties: false },\n);\nexport type MinorModeToolInput = Static<typeof MinorModeToolInputSchema>;\nexport const MinorModeToolResultSchema = Type.Unknown();\n\nexport const MinorModeActionRequestSchema = Type.Object(\n {\n operationId: OperationIdSchema,\n mode: MinorModeRegistrationRefSchema,\n actionId: MinorModeIdSchema,\n arguments: MinorModeArgumentsSchema,\n },\n { additionalProperties: false },\n);\nexport type MinorModeActionRequest = Static<typeof MinorModeActionRequestSchema>;\n\nexport const MinorModeActionResponseSchema = Type.Object(\n {\n operationId: OperationIdSchema,\n catalogRevision: Type.Integer({ minimum: 0 }),\n mode: MinorModeRecordSchema,\n message: Type.Optional(Type.String({ minLength: 1, maxLength: MAX_DETAIL_LENGTH })),\n },\n { additionalProperties: false },\n);\nexport type MinorModeActionResponse = Static<typeof MinorModeActionResponseSchema>;\n\n/**\n * The custom session entry the catalog host journals whenever its projection\n * changes. It rides Pi's entry_appended frames, so any RPC client (the web\n * cockpit) sees minor-mode state live and on replay without a new protocol.\n */\nexport const DOOM_MINOR_MODE_ENTRY_TYPE = 'doom-minor-modes';\n\nexport interface MinorModeActionProjection {\n readonly id: string;\n readonly label: string;\n readonly description: string;\n readonly enabled: boolean;\n readonly disabledReason?: string;\n /** Whether invoking it needs arguments a client must ask for first. */\n readonly needsInput: boolean;\n}\n\nexport interface MinorModeRecordProjection {\n readonly id: string;\n readonly label: string;\n readonly description: string;\n readonly order: number;\n readonly activation: MinorModeActivation;\n readonly condition: MinorModeCondition;\n readonly detail?: string;\n readonly actions: readonly MinorModeActionProjection[];\n}\n\nexport interface MinorModeProjection {\n readonly version: 1;\n readonly revision: number;\n readonly modes: readonly MinorModeRecordProjection[];\n}\n\nexport interface MinorModeOwnerActionResult {\n message?: string;\n}\n\nexport interface MinorModeOwnerActionContext<ExtensionContext extends DoomExtensionContext> {\n context: ExtensionContext;\n operationId: string;\n sessionKind: MinorModeSessionKind;\n signal: AbortSignal;\n}\n\nexport interface MinorModeOwnerDefinition<ExtensionContext extends DoomExtensionContext> {\n descriptor: MinorModeDescriptor;\n initialState: MinorModeState;\n handleAction(\n actionId: string,\n argumentsValue: MinorModeArguments,\n execution: MinorModeOwnerActionContext<ExtensionContext>,\n ): MinorModeOwnerActionResult | void | Promise<MinorModeOwnerActionResult | void>;\n onError?(error: unknown): void;\n}\n\nexport interface MinorModeOwnerHandle {\n getState(): MinorModeState;\n publish(state: MinorModeState): void;\n dispose(): void;\n}\n\nexport interface MinorModeInvokeOptions {\n readonly signal?: AbortSignal;\n}\n\n/** Direct session-local catalog shared through Cordis. */\nexport interface MinorModeCatalogService {\n readonly generation: string;\n getSnapshot(): MinorModeCatalogSnapshot;\n list(): MinorModeRecord[];\n subscribe(listener: () => void): () => void;\n registerOwner<ExtensionContext extends DoomExtensionContext>(\n definition: MinorModeOwnerDefinition<ExtensionContext>,\n ): MinorModeOwnerHandle;\n invoke(\n request: MinorModeActionRequest,\n requesterSource: string,\n signal?: AbortSignal,\n ): Promise<MinorModeActionResponse>;\n dispose(): void;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'doom/minor-mode-catalog': MinorModeCatalogService;\n }\n}\n\nexport function readMinorModeCatalog(context: Context): MinorModeCatalogService | undefined {\n return context.get(DOOM_MINOR_MODE_CATALOG_SERVICE) as MinorModeCatalogService | undefined;\n}\n\nexport function requireMinorModeCatalog(context: Context): MinorModeCatalogService {\n const catalog = readMinorModeCatalog(context);\n if (!catalog) throw new Error('Doom minor-mode catalog is unavailable.');\n return catalog;\n}\n"],"mappings":"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"}
package/dist/owner.cjs ADDED
@@ -0,0 +1,10 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region src/services/owner/index.ts
3
+ /** Register an owner directly with the injected session catalog. */
4
+ function registerMinorModeOwner(catalog, definition) {
5
+ return catalog.registerOwner(definition);
6
+ }
7
+ //#endregion
8
+ exports.registerMinorModeOwner = registerMinorModeOwner;
9
+
10
+ //# sourceMappingURL=owner.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner.cjs","names":[],"sources":["../src/services/owner/index.ts"],"sourcesContent":["import type { DoomExtensionContext } from '@agimon-ai/doompi-core/runtime-config';\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,7 @@
1
+ import { MinorModeCatalogService, MinorModeOwnerDefinition, MinorModeOwnerHandle } from "./mode.cjs";
2
+ import { DoomExtensionContext } from "@agimon-ai/doompi-core/runtime-config";
3
+ //#region src/services/owner/index.d.ts
4
+ /** Register an owner directly with the injected session catalog. */
5
+ export declare function registerMinorModeOwner<ExtensionContext extends DoomExtensionContext>(catalog: MinorModeCatalogService, definition: MinorModeOwnerDefinition<ExtensionContext>): MinorModeOwnerHandle;
6
+ //#endregion
7
+ //# sourceMappingURL=owner.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner.d.cts","names":[],"sources":["../src/services/owner/index.ts"],"mappings":";;;;wBAKgB,uBAAuB,yBAAyB,sBAC9D,SAAS,yBACT,YAAY,yBAAyB,oBACpC"}
@@ -0,0 +1,7 @@
1
+ import { MinorModeCatalogService, MinorModeOwnerDefinition, MinorModeOwnerHandle } from "./mode.mjs";
2
+ import { DoomExtensionContext } from "@agimon-ai/doompi-core/runtime-config";
3
+ //#region src/services/owner/index.d.ts
4
+ /** Register an owner directly with the injected session catalog. */
5
+ export declare function registerMinorModeOwner<ExtensionContext extends DoomExtensionContext>(catalog: MinorModeCatalogService, definition: MinorModeOwnerDefinition<ExtensionContext>): MinorModeOwnerHandle;
6
+ //#endregion
7
+ //# sourceMappingURL=owner.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner.d.mts","names":[],"sources":["../src/services/owner/index.ts"],"mappings":";;;;wBAKgB,uBAAuB,yBAAyB,sBAC9D,SAAS,yBACT,YAAY,yBAAyB,oBACpC"}
package/dist/owner.mjs ADDED
@@ -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 };
8
+
9
+ //# sourceMappingURL=owner.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner.mjs","names":[],"sources":["../src/services/owner/index.ts"],"sourcesContent":["import type { DoomExtensionContext } from '@agimon-ai/doompi-core/runtime-config';\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,49 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("./mode.cjs");
3
+ //#region src/services/projection/index.ts
4
+ /**
5
+ * The catalog as a client should see it: one entry per mode, sorted the way
6
+ * the leader menu sorts, with only the actions this session kind can take and
7
+ * none of the registration bookkeeping a client has no use for.
8
+ */
9
+ function projectMinorModes(snapshot, kind) {
10
+ const modes = snapshot.modes.map((record) => ({
11
+ id: record.descriptor.id,
12
+ label: record.descriptor.label,
13
+ description: record.descriptor.description,
14
+ order: record.descriptor.order,
15
+ activation: record.state.activation,
16
+ condition: record.state.condition,
17
+ ...record.state.detail ? { detail: record.state.detail } : {},
18
+ actions: record.descriptor.actions.filter((action) => action.contexts.includes(kind)).map((action) => {
19
+ const availability = record.state.actions.find((entry) => entry.id === action.id);
20
+ return {
21
+ id: action.id,
22
+ label: action.label,
23
+ description: action.description,
24
+ enabled: availability?.enabled !== false,
25
+ ...availability?.disabledReason ? { disabledReason: availability.disabledReason } : {},
26
+ needsInput: action.parameters.some((parameter) => parameter.required)
27
+ };
28
+ })
29
+ })).sort((left, right) => left.order - right.order || left.label.localeCompare(right.label));
30
+ return {
31
+ version: 1,
32
+ revision: snapshot.revision,
33
+ modes
34
+ };
35
+ }
36
+ /** Reads the latest valid persisted activation set; absence preserves caller defaults. */
37
+ function restoreMinorModeSelection(entries) {
38
+ for (const entry of [...entries].reverse()) {
39
+ if (!entry || typeof entry !== "object" || !("customType" in entry) || entry.customType !== "doom-minor-modes" || !("data" in entry)) continue;
40
+ const data = entry.data;
41
+ if (!data || typeof data !== "object" || !("modes" in data) || !Array.isArray(data.modes)) continue;
42
+ return [...new Set(data.modes.filter((mode) => mode && typeof mode === "object" && mode.activation === "active" && typeof mode.id === "string").map((mode) => mode.id))];
43
+ }
44
+ }
45
+ //#endregion
46
+ exports.projectMinorModes = projectMinorModes;
47
+ exports.restoreMinorModeSelection = restoreMinorModeSelection;
48
+
49
+ //# sourceMappingURL=projection.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.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,12 @@
1
+ import { MinorModeCatalogSnapshot, MinorModeProjection, MinorModeSessionKind } from "./mode.cjs";
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.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.d.cts","names":[],"sources":["../src/services/projection/index.ts"],"mappings":";;;;;;;wBAagB,kBAAkB,UAAU,0BAA0B,MAAM,uBAAuB;;wBA6BnF,0BAA0B"}
@@ -0,0 +1,12 @@
1
+ import { MinorModeCatalogSnapshot, MinorModeProjection, MinorModeSessionKind } from "./mode.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,47 @@
1
+ import "./mode.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 { projectMinorModes, restoreMinorModeSelection };
46
+
47
+ //# sourceMappingURL=projection.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.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,57 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_mode = require("./mode.cjs");
3
+ let _agimon_ai_doompi_core_runtime_transition = require("@agimon-ai/doompi-core/runtime-transition");
4
+ //#region src/services/reloadHandoff/index.ts
5
+ const MINOR_MODE_RELOAD_HANDOFF_SYMBOL = Symbol.for("@agimon-ai/doompi.minor-mode-reload-handoff.v1");
6
+ const MINOR_MODE_RELOAD_HANDOFF_TTL_MS = 6e4;
7
+ function reloadHandoffRegistry() {
8
+ const globalRegistry = globalThis;
9
+ const existing = globalRegistry[MINOR_MODE_RELOAD_HANDOFF_SYMBOL];
10
+ if (existing) return existing;
11
+ const created = { records: /* @__PURE__ */ new Map() };
12
+ globalRegistry[MINOR_MODE_RELOAD_HANDOFF_SYMBOL] = created;
13
+ return created;
14
+ }
15
+ function pruneExpiredReloadHandoffs(now = Date.now()) {
16
+ for (const [sessionId, handoff] of reloadHandoffRegistry().records) if (handoff.expiresAt <= now) reloadHandoffRegistry().records.delete(sessionId);
17
+ }
18
+ function prepareMinorModeReloadHandoff(context, sessionId, transitionHostGeneration, operationId, snapshot) {
19
+ if (!snapshot?.modes.some(({ state }) => state.activation === "active" || state.activation === "activating")) return;
20
+ const coordinator = (0, _agimon_ai_doompi_core_runtime_transition.readDoomTransitionCoordinator)(context);
21
+ const catalog = require_mode.readMinorModeCatalog(context);
22
+ if (!coordinator || coordinator.hostGeneration !== transitionHostGeneration || !catalog || catalog.generation !== snapshot.hostGeneration) throw new Error("Minor-mode reload handoff became stale before reload.");
23
+ pruneExpiredReloadHandoffs();
24
+ const token = `minor-mode-reload:${crypto.randomUUID()}`;
25
+ const record = {
26
+ token,
27
+ sessionId,
28
+ transitionHostGeneration,
29
+ operationId,
30
+ catalogHostGeneration: snapshot.hostGeneration,
31
+ snapshot: structuredClone(snapshot),
32
+ expiresAt: Date.now() + MINOR_MODE_RELOAD_HANDOFF_TTL_MS
33
+ };
34
+ reloadHandoffRegistry().records.set(sessionId, record);
35
+ return { discard() {
36
+ if (reloadHandoffRegistry().records.get(sessionId)?.token !== token) return false;
37
+ return reloadHandoffRegistry().records.delete(sessionId);
38
+ } };
39
+ }
40
+ function discardMinorModeReloadHandoff(sessionId) {
41
+ pruneExpiredReloadHandoffs();
42
+ return reloadHandoffRegistry().records.delete(sessionId);
43
+ }
44
+ function consumeMinorModeReloadHandoff(sessionId) {
45
+ pruneExpiredReloadHandoffs();
46
+ const handoff = reloadHandoffRegistry().records.get(sessionId);
47
+ if (!handoff) return void 0;
48
+ reloadHandoffRegistry().records.delete(sessionId);
49
+ if (handoff.sessionId !== sessionId || handoff.snapshot.hostGeneration !== handoff.catalogHostGeneration || !handoff.transitionHostGeneration || !handoff.operationId) return;
50
+ return structuredClone(handoff.snapshot);
51
+ }
52
+ //#endregion
53
+ exports.consumeMinorModeReloadHandoff = consumeMinorModeReloadHandoff;
54
+ exports.discardMinorModeReloadHandoff = discardMinorModeReloadHandoff;
55
+ exports.prepareMinorModeReloadHandoff = prepareMinorModeReloadHandoff;
56
+
57
+ //# sourceMappingURL=reload-handoff.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reload-handoff.cjs","names":["readDoomTransitionCoordinator","readMinorModeCatalog"],"sources":["../src/services/reloadHandoff/index.ts"],"sourcesContent":["import { readDoomTransitionCoordinator } from '@agimon-ai/doompi-core/runtime-transition';\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,0CAAAA,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,11 @@
1
+ import { MinorModeCatalogSnapshot } from "./mode.cjs";
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=reload-handoff.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reload-handoff.d.cts","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,11 @@
1
+ import { MinorModeCatalogSnapshot } from "./mode.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=reload-handoff.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reload-handoff.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"}