@agimon-ai/doompi-loop 0.0.1-alpha.80 → 0.0.1-alpha.82

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 (146) hide show
  1. package/dist/{src/schemas/apiContracts.cjs → apiContracts.cjs} +5 -1
  2. package/dist/apiContracts.cjs.map +1 -0
  3. package/dist/{src/schemas/apiContracts.d.mts.map → apiContracts.d.mts.map} +1 -1
  4. package/dist/{src/schemas/apiContracts.mjs → apiContracts.mjs} +1 -1
  5. package/dist/apiContracts.mjs.map +1 -0
  6. package/dist/extensions/pi.cjs +596 -13
  7. package/dist/extensions/pi.cjs.map +1 -1
  8. package/dist/extensions/pi.d.mts +1 -1
  9. package/dist/extensions/pi.d.mts.map +1 -1
  10. package/dist/extensions/pi.mjs +590 -7
  11. package/dist/extensions/pi.mjs.map +1 -1
  12. package/dist/extensions/server.cjs +326 -14
  13. package/dist/extensions/server.cjs.map +1 -1
  14. package/dist/extensions/server.d.mts +1 -1
  15. package/dist/extensions/server.d.mts.map +1 -1
  16. package/dist/extensions/server.mjs +320 -8
  17. package/dist/extensions/server.mjs.map +1 -1
  18. package/dist/index.d.mts +1 -1
  19. package/dist/{src/schemas/loopLaunchers.cjs → loopLaunchers-BtcLH_xN.cjs} +19 -4
  20. package/dist/loopLaunchers-BtcLH_xN.cjs.map +1 -0
  21. package/dist/{src/schemas/loopLaunchers.d.cts → loopLaunchers-CPUUrDzQ.d.mts} +12 -11
  22. package/dist/loopLaunchers-CPUUrDzQ.d.mts.map +1 -0
  23. package/dist/{src/schemas/loopLaunchers.mjs → loopLaunchers-cCniFbVA.mjs} +2 -2
  24. package/dist/loopLaunchers-cCniFbVA.mjs.map +1 -0
  25. package/dist/loopLaunchers.cjs +1 -1
  26. package/dist/loopLaunchers.d.mts +1 -1
  27. package/dist/loopLaunchers.mjs +1 -1
  28. package/dist/{src/services/loopLaunchers/index.mjs → loopView-CLIBhqYC.cjs} +64 -2
  29. package/dist/loopView-CLIBhqYC.cjs.map +1 -0
  30. package/dist/{src/services/loopLaunchers/index.cjs → loopView-CmuIEbUa.mjs} +23 -2
  31. package/dist/loopView-CmuIEbUa.mjs.map +1 -0
  32. package/package.json +16 -15
  33. package/dist/api-contracts.cjs +0 -7
  34. package/dist/api-contracts.d.cts +0 -2
  35. package/dist/api-contracts.d.mts +0 -2
  36. package/dist/api-contracts.mjs +0 -2
  37. package/dist/extensions/pi.d.cts +0 -5
  38. package/dist/extensions/pi.d.cts.map +0 -1
  39. package/dist/extensions/server.d.cts +0 -5
  40. package/dist/extensions/server.d.cts.map +0 -1
  41. package/dist/index.d.cts +0 -2
  42. package/dist/loopLaunchers.d.cts +0 -2
  43. package/dist/src/constants/loop.cjs +0 -12
  44. package/dist/src/constants/loop.cjs.map +0 -1
  45. package/dist/src/constants/loop.mjs +0 -9
  46. package/dist/src/constants/loop.mjs.map +0 -1
  47. package/dist/src/constants/piLoop.cjs +0 -16
  48. package/dist/src/constants/piLoop.cjs.map +0 -1
  49. package/dist/src/constants/piLoop.mjs +0 -11
  50. package/dist/src/constants/piLoop.mjs.map +0 -1
  51. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.cli.cjs +0 -26
  52. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.cli.cjs.map +0 -1
  53. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.cli.mjs +0 -26
  54. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.cli.mjs.map +0 -1
  55. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.cjs +0 -7
  56. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.cjs.map +0 -1
  57. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.mjs +0 -7
  58. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.mjs.map +0 -1
  59. package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.cli.cjs +0 -6
  60. package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.cli.cjs.map +0 -1
  61. package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.cli.mjs +0 -7
  62. package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.cli.mjs.map +0 -1
  63. package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.server.cjs +0 -6
  64. package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.server.cjs.map +0 -1
  65. package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.server.mjs +0 -7
  66. package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.server.mjs.map +0 -1
  67. package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.cli.cjs +0 -6
  68. package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.cli.cjs.map +0 -1
  69. package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.cli.mjs +0 -7
  70. package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.cli.mjs.map +0 -1
  71. package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.server.cjs +0 -6
  72. package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.server.cjs.map +0 -1
  73. package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.server.mjs +0 -7
  74. package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.server.mjs.map +0 -1
  75. package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.cjs +0 -6
  76. package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.cjs.map +0 -1
  77. package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.mjs +0 -7
  78. package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.mjs.map +0 -1
  79. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.cjs +0 -6
  80. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.cjs.map +0 -1
  81. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.mjs +0 -7
  82. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.mjs.map +0 -1
  83. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.server.cjs +0 -6
  84. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.server.cjs.map +0 -1
  85. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.server.mjs +0 -7
  86. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.server.mjs.map +0 -1
  87. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.cjs +0 -6
  88. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.cjs.map +0 -1
  89. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.mjs +0 -7
  90. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.mjs.map +0 -1
  91. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.cjs +0 -6
  92. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.cjs.map +0 -1
  93. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.mjs +0 -7
  94. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.mjs.map +0 -1
  95. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs +0 -14
  96. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs.map +0 -1
  97. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs +0 -15
  98. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs.map +0 -1
  99. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs +0 -17
  100. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs.map +0 -1
  101. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs +0 -18
  102. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs.map +0 -1
  103. package/dist/src/schemas/apiContracts.cjs.map +0 -1
  104. package/dist/src/schemas/apiContracts.d.cts +0 -53
  105. package/dist/src/schemas/apiContracts.d.cts.map +0 -1
  106. package/dist/src/schemas/apiContracts.mjs.map +0 -1
  107. package/dist/src/schemas/loopLaunchers.cjs.map +0 -1
  108. package/dist/src/schemas/loopLaunchers.d.cts.map +0 -1
  109. package/dist/src/schemas/loopLaunchers.d.mts +0 -60
  110. package/dist/src/schemas/loopLaunchers.d.mts.map +0 -1
  111. package/dist/src/schemas/loopLaunchers.mjs.map +0 -1
  112. package/dist/src/services/defaultLoopLauncher/index.cjs +0 -92
  113. package/dist/src/services/defaultLoopLauncher/index.cjs.map +0 -1
  114. package/dist/src/services/defaultLoopLauncher/index.mjs +0 -92
  115. package/dist/src/services/defaultLoopLauncher/index.mjs.map +0 -1
  116. package/dist/src/services/loopCommand/index.cjs +0 -15
  117. package/dist/src/services/loopCommand/index.cjs.map +0 -1
  118. package/dist/src/services/loopCommand/index.mjs +0 -15
  119. package/dist/src/services/loopCommand/index.mjs.map +0 -1
  120. package/dist/src/services/loopLaunchers/index.cjs.map +0 -1
  121. package/dist/src/services/loopLaunchers/index.mjs.map +0 -1
  122. package/dist/src/services/serverRuntime/index.cjs +0 -293
  123. package/dist/src/services/serverRuntime/index.cjs.map +0 -1
  124. package/dist/src/services/serverRuntime/index.mjs +0 -293
  125. package/dist/src/services/serverRuntime/index.mjs.map +0 -1
  126. package/dist/src/tui/leader.cjs +0 -36
  127. package/dist/src/tui/leader.cjs.map +0 -1
  128. package/dist/src/tui/leader.mjs +0 -36
  129. package/dist/src/tui/leader.mjs.map +0 -1
  130. package/dist/src/tui/loopListOverlay.cjs +0 -101
  131. package/dist/src/tui/loopListOverlay.cjs.map +0 -1
  132. package/dist/src/tui/loopListOverlay.mjs +0 -100
  133. package/dist/src/tui/loopListOverlay.mjs.map +0 -1
  134. package/dist/src/tui/loopRuntime.cjs +0 -256
  135. package/dist/src/tui/loopRuntime.cjs.map +0 -1
  136. package/dist/src/tui/loopRuntime.mjs +0 -256
  137. package/dist/src/tui/loopRuntime.mjs.map +0 -1
  138. package/dist/src/tui/startLoopOverlay.cjs +0 -71
  139. package/dist/src/tui/startLoopOverlay.cjs.map +0 -1
  140. package/dist/src/tui/startLoopOverlay.mjs +0 -70
  141. package/dist/src/tui/startLoopOverlay.mjs.map +0 -1
  142. package/dist/src/types/loopView.cjs +0 -19
  143. package/dist/src/types/loopView.cjs.map +0 -1
  144. package/dist/src/types/loopView.mjs +0 -18
  145. package/dist/src/types/loopView.mjs.map +0 -1
  146. /package/dist/{src/schemas/apiContracts.d.mts → apiContracts.d.mts} +0 -0
@@ -1,11 +1,323 @@
1
- import root_server_default from "../src/extensions/workspaces/sessions/(backend)/root.server.mjs";
2
- import loop_server_default from "../src/extensions/workspaces/sessions/(backend)/command/loop.server.mjs";
3
- import loops_server_default from "../src/extensions/workspaces/sessions/(backend)/command/loops.server.mjs";
4
- import session_shutdown_server_default from "../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.mjs";
5
- import session_start_server_default from "../src/extensions/workspaces/sessions/(backend)/hook/session-start.server.mjs";
6
- import doompi_use_loop_server_default from "../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.mjs";
7
- import { composeRootHooks } from "@agimon-ai/doompi-core/extension-file";
8
- import { defineServerPlugin } from "@agimon-ai/doompi-core/server-facet";
1
+ import { a as LIST_COMMAND_NAME, n as formatLoopStatusView, r as createDoomLoopLaunchersService, s as START_COMMAND_NAME, t as LOOP_VIEW_STATUS_KEY } from "../loopView-CmuIEbUa.mjs";
2
+ import { composeRootHooks, defineRoot, defineRoutedContribution } from "@agimon-ai/doompi-core/extensionFile";
3
+ import { defineMinorMode, serverMinorModes } from "@agimon-ai/doompi-minor-mode";
4
+ import { defineServerPlugin, readPackageResource } from "@agimon-ai/doompi-core/serverFacet";
5
+ //#region src/services/serverRuntime/index.ts
6
+ const SOURCE = "@agimon-ai/doompi-loop";
7
+ const MODE_ID = "loop.active";
8
+ const DEFAULT_LAUNCHER_ID = "doompi.default";
9
+ const DEFAULT_INTERVAL_SECONDS = 300;
10
+ const MIN_INTERVAL_SECONDS = 30;
11
+ const MAX_INTERVAL_SECONDS = 3600;
12
+ function notify(context, body, level = "info") {
13
+ return Promise.resolve(context.client.notify({
14
+ body,
15
+ level
16
+ }));
17
+ }
18
+ function numberInput(value, fallback) {
19
+ if (typeof value !== "string" || value.trim() === "") return fallback;
20
+ const parsed = Number(value);
21
+ if (!Number.isInteger(parsed) || parsed < MIN_INTERVAL_SECONDS || parsed > MAX_INTERVAL_SECONDS) throw new Error(`Interval must be between ${MIN_INTERVAL_SECONDS} and ${MAX_INTERVAL_SECONDS} seconds.`);
22
+ return parsed;
23
+ }
24
+ function createSessionState(host) {
25
+ let launchers;
26
+ let defaultRegistration;
27
+ let unsubscribe;
28
+ let modeOwner;
29
+ const modeSelected = () => (host.context.selection.state?.["minor-mode"] ?? []).includes(MODE_ID);
30
+ const modeState = () => {
31
+ const launcherCount = launchers?.listLaunchers().length ?? 0;
32
+ const active = (launchers?.listInstances().length ?? 0) > 0;
33
+ const canStart = launcherCount > 0 || !modeSelected();
34
+ return {
35
+ activation: active ? "active" : "inactive",
36
+ condition: launchers?.listInstances().some(({ state }) => state !== "running") ? "queued" : "ready",
37
+ ...active ? {
38
+ detail: `${launchers?.listInstances().length} active`,
39
+ color: "warning"
40
+ } : {},
41
+ actions: [{
42
+ id: "start",
43
+ enabled: canStart,
44
+ ...canStart ? {} : { disabledReason: "No loop launchers are registered." }
45
+ }, {
46
+ id: "stop",
47
+ enabled: active,
48
+ ...active ? {} : { disabledReason: "No loops are active." }
49
+ }]
50
+ };
51
+ };
52
+ /**
53
+ * The instances the activity dock lists.
54
+ *
55
+ * An empty list publishes an empty value rather than nothing, because the key
56
+ * being present is what keeps the group on screen as a launcher. The group
57
+ * declares no `hideWhenEmpty`, so an empty value is a header with no rows.
58
+ */
59
+ const publishView = () => host.context.client.setStatus(LOOP_VIEW_STATUS_KEY, formatLoopStatusView(launchers?.listInstances() ?? []));
60
+ /** Both surfaces a loop shows up on: the minor-mode catalog and the activity dock. */
61
+ const publishMode = () => {
62
+ modeOwner?.publish();
63
+ publishView();
64
+ };
65
+ const startActivity = async (execution) => {
66
+ if (launchers !== void 0) return async () => void 0;
67
+ const dependencies = {
68
+ generation: `${execution.sessionId}:loop-launchers`,
69
+ createInstanceId: () => crypto.randomUUID(),
70
+ timestamp: () => (/* @__PURE__ */ new Date()).toISOString()
71
+ };
72
+ const service = createDoomLoopLaunchersService(dependencies);
73
+ const registration = service.register({
74
+ id: DEFAULT_LAUNCHER_ID,
75
+ source: SOURCE,
76
+ label: "Default loop",
77
+ description: "Run a prompt in this session on an interval.",
78
+ async launch({ instanceId, signal }) {
79
+ const promptValue = await execution.client.request({
80
+ kind: "input",
81
+ title: "Loop prompt",
82
+ multiline: true
83
+ }, signal);
84
+ const prompt = typeof promptValue === "string" ? promptValue.trim() : "";
85
+ if (!prompt || signal.aborted) return void 0;
86
+ const interval = numberInput(await execution.client.request({
87
+ kind: "input",
88
+ title: "Loop interval in seconds",
89
+ initialValue: String(DEFAULT_INTERVAL_SECONDS)
90
+ }, signal), DEFAULT_INTERVAL_SECONDS);
91
+ let stopped = false;
92
+ const tick = () => {
93
+ if (stopped || signal.aborted) return;
94
+ execution.session.prompt(prompt).catch((error) => {
95
+ notify(execution, `Loop pass failed: ${error instanceof Error ? error.message : String(error)}`, "warning");
96
+ });
97
+ };
98
+ const timer = setInterval(tick, interval * 1e3);
99
+ timer.unref?.();
100
+ tick();
101
+ return {
102
+ instanceId,
103
+ label: "Default loop",
104
+ detail: `every ${interval}s`,
105
+ stop() {
106
+ stopped = true;
107
+ clearInterval(timer);
108
+ }
109
+ };
110
+ }
111
+ });
112
+ launchers = service;
113
+ defaultRegistration = registration;
114
+ unsubscribe = service.subscribe(publishMode);
115
+ publishMode();
116
+ return async () => {
117
+ unsubscribe?.();
118
+ unsubscribe = void 0;
119
+ await registration.dispose("Headless loop activity stopped.");
120
+ await service.dispose("Headless loop activity stopped.");
121
+ if (launchers === service) launchers = void 0;
122
+ if (defaultRegistration === registration) defaultRegistration = void 0;
123
+ publishMode();
124
+ };
125
+ };
126
+ modeOwner = defineMinorMode({
127
+ descriptor: {
128
+ source: SOURCE,
129
+ id: MODE_ID,
130
+ label: "Loop",
131
+ description: "Session-scoped recurring prompt loops.",
132
+ order: 60,
133
+ actions: [{
134
+ id: "start",
135
+ label: "Start",
136
+ description: "Start a loop with a registered launcher.",
137
+ contexts: ["headless"],
138
+ parameters: [{
139
+ name: "launcherId",
140
+ label: "Launcher",
141
+ kind: "string",
142
+ required: true,
143
+ minLength: 1
144
+ }, {
145
+ name: "instanceId",
146
+ label: "Instance ID",
147
+ kind: "string",
148
+ required: false,
149
+ minLength: 1
150
+ }]
151
+ }, {
152
+ id: "stop",
153
+ label: "Stop",
154
+ description: "Stop one active loop instance.",
155
+ contexts: ["headless"],
156
+ parameters: [{
157
+ name: "instanceId",
158
+ label: "Instance ID",
159
+ kind: "string",
160
+ required: true,
161
+ minLength: 1
162
+ }, {
163
+ name: "reason",
164
+ label: "Reason",
165
+ kind: "string",
166
+ required: false,
167
+ minLength: 1
168
+ }]
169
+ }]
170
+ },
171
+ state: modeState,
172
+ async handleAction(_runtime, actionId, argumentsValue, { signal }) {
173
+ signal.throwIfAborted();
174
+ if (actionId === "start" && !launchers) {
175
+ const modes = (host.context.selection.state?.["minor-mode"] ?? []).filter((mode) => mode !== MODE_ID);
176
+ await host.changeSelection({
177
+ axis: "state",
178
+ key: "minor-mode",
179
+ values: [...modes, MODE_ID]
180
+ });
181
+ }
182
+ if (!launchers) throw new Error("Loop activity is not active.");
183
+ if (actionId === "start") {
184
+ const instance = await launchers.launch(String(argumentsValue.launcherId ?? ""), argumentsValue.instanceId ? { instanceId: String(argumentsValue.instanceId) } : {});
185
+ publishMode();
186
+ return { message: instance ? `Loop '${instance.instanceId}' started.` : "Loop launch was cancelled." };
187
+ }
188
+ if (actionId === "stop") {
189
+ const stopped = await launchers.stop(String(argumentsValue.instanceId ?? ""), String(argumentsValue.reason ?? "Stopped through minor_mode."));
190
+ if (stopped && launchers.listInstances().length === 0) {
191
+ const modes = (host.context.selection.state?.["minor-mode"] ?? []).filter((mode) => mode !== MODE_ID);
192
+ await host.changeSelection({
193
+ axis: "state",
194
+ key: "minor-mode",
195
+ values: modes
196
+ });
197
+ }
198
+ publishMode();
199
+ return { message: stopped ? "Loop stopped." : "Loop instance was not active." };
200
+ }
201
+ throw new Error(`Unknown loop mode action: ${actionId}`);
202
+ }
203
+ }).createOwner(void 0);
204
+ return {
205
+ services: [serverMinorModes([modeOwner])],
206
+ resources: [{
207
+ when: {
208
+ state: { "minor-mode": MODE_ID },
209
+ attribution: {
210
+ kind: "minor",
211
+ mode: MODE_ID
212
+ }
213
+ },
214
+ name: "doompi-use-loop",
215
+ kind: "skill",
216
+ read: () => readPackageResource(import.meta.url, "src/prompts/doompi-use-loop/SKILL.md")
217
+ }],
218
+ activities: [{
219
+ when: {
220
+ state: { "minor-mode": MODE_ID },
221
+ attribution: {
222
+ kind: "minor",
223
+ mode: MODE_ID
224
+ }
225
+ },
226
+ name: "doompi-loop",
227
+ start: startActivity
228
+ }],
229
+ commands: [{
230
+ name: START_COMMAND_NAME,
231
+ description: "Start a registered loop.",
232
+ async execute(args, execution) {
233
+ if (!launchers) {
234
+ const modes = host.context.selection.state?.["minor-mode"] ?? [];
235
+ await host.changeSelection({
236
+ axis: "state",
237
+ key: "minor-mode",
238
+ values: [...modes, MODE_ID]
239
+ });
240
+ }
241
+ if (!launchers) throw new Error("Loop activity is not active.");
242
+ const available = launchers.listLaunchers();
243
+ const selected = args.trim() || await execution.client.request({
244
+ kind: "select",
245
+ title: "Choose a loop launcher",
246
+ options: available.map((entry) => ({
247
+ label: entry.label,
248
+ value: entry.id
249
+ }))
250
+ });
251
+ const launcherId = args.trim() || (typeof selected === "string" ? selected : "");
252
+ if (!launcherId) return;
253
+ const instance = await launchers.launch(launcherId);
254
+ publishMode();
255
+ await notify(execution, instance ? `Loop '${instance.instanceId}' started.` : "Loop launch was cancelled.");
256
+ }
257
+ }, {
258
+ name: LIST_COMMAND_NAME,
259
+ description: "List and stop active loops.",
260
+ async execute(_args, execution) {
261
+ const instances = launchers?.listInstances() ?? [];
262
+ await notify(execution, instances.length === 0 ? "No loops are active." : JSON.stringify(instances, null, 2));
263
+ }
264
+ }],
265
+ hooks: [{
266
+ event: "session_start",
267
+ async handle() {
268
+ publishView();
269
+ }
270
+ }, {
271
+ when: {
272
+ state: { "minor-mode": MODE_ID },
273
+ attribution: {
274
+ kind: "minor",
275
+ mode: MODE_ID
276
+ }
277
+ },
278
+ event: "session_shutdown",
279
+ async handle() {
280
+ await launchers?.stopAll("Headless session shutdown.");
281
+ }
282
+ }],
283
+ async onDispose() {
284
+ await defaultRegistration?.dispose("Headless loop facet disposed.");
285
+ await launchers?.dispose("Headless loop facet disposed.");
286
+ }
287
+ };
288
+ }
289
+ //#endregion
290
+ //#region src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.ts
291
+ var runtime_server_default = (({ agent }) => agent ? createSessionState(agent) : {});
292
+ //#endregion
293
+ //#region src/extensions/workspaces/sessions/(backend)/root.server.ts
294
+ var root_server_default = defineRoot((context) => {
295
+ const value = runtime_server_default(context);
296
+ return {
297
+ value,
298
+ services: value.services,
299
+ activities: value.activities,
300
+ onStart: value.onStart,
301
+ onStop: value.onStop,
302
+ onDispose: value.onDispose
303
+ };
304
+ });
305
+ //#endregion
306
+ //#region src/extensions/workspaces/sessions/(backend)/command/loop.server.ts
307
+ var loop_server_default = defineRoutedContribution((context) => context.root.commands?.[0], { cardinality: "optional" });
308
+ //#endregion
309
+ //#region src/extensions/workspaces/sessions/(backend)/command/loops.server.ts
310
+ var loops_server_default = defineRoutedContribution((context) => context.root.commands?.[1], { cardinality: "optional" });
311
+ //#endregion
312
+ //#region src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.ts
313
+ var session_shutdown_server_default = defineRoutedContribution((context) => context.root.hooks?.find((hook) => hook.event === "session_shutdown"), { cardinality: "optional" });
314
+ //#endregion
315
+ //#region src/extensions/workspaces/sessions/(backend)/hook/session-start.server.ts
316
+ var session_start_server_default = defineRoutedContribution((context) => context.root.hooks?.find((hook) => hook.event === "session_start"), { cardinality: "optional" });
317
+ //#endregion
318
+ //#region src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.ts
319
+ var doompi_use_loop_server_default = defineRoutedContribution((context) => context.root.resources?.[0], { cardinality: "optional" });
320
+ //#endregion
9
321
  //#region generated/server.ts
10
322
  const at = (value, context) => typeof value === "function" ? value(context) : value;
11
323
  /* v8 ignore next -- generated normalization branch */
@@ -1 +1 @@
1
- {"version":3,"file":"server.mjs","names":["rootSession","commandLoop","commandLoops","hookSessionShutdown","hookSessionStart","resourceDoompiUseLoop"],"sources":["../../generated/server.ts"],"sourcesContent":["// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/server-facet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extension-file';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport commandLoop from '../src/extensions/workspaces/sessions/(backend)/command/loop.server';\nimport commandLoops from '../src/extensions/workspaces/sessions/(backend)/command/loops.server';\nimport hookSessionShutdown from '../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/session-start.server';\nimport resourceDoompiUseLoop from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n/* v8 ignore next -- generated normalization branch */\nconst defined = <T>(values: readonly (T | undefined)[]): T[] =>\n values.filter((value): value is T => value !== undefined);\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T => ({ ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-loop',\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): DoomServerSessionPlugin['commands'] { return defined([via({ name: 'loop' }, at(commandLoop, contextSession)), via({ name: 'loops' }, at(commandLoops, contextSession))]); },\n get hooks(): DoomServerSessionPlugin['hooks'] { return defined([via({ event: 'session_shutdown' }, at(hookSessionShutdown, contextSession)), via({ event: 'session_start' }, at(hookSessionStart, contextSession))]); },\n get resources(): DoomServerSessionPlugin['resources'] { return defined([at(resourceDoompiUseLoop, contextSession)]); },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":";;;;;;;;;AAYA,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;;AAEpE,MAAM,WAAc,WAClB,OAAO,QAAQ,UAAsB,UAAU,KAAA,CAAS;AAC1D,MAAM,OAAU,UAAmC,WAAuB;CAAE,GAAG;CAAU,GAAI;AAAiB;AAE9G,MAAa,QAAQ,mBAAmB;CACtC,MAAM;CACN,SAAS,OAAO,YAAY;EAC1B,MAAM,eAAe,MAAMA,oBAAY,OAAO;EAC9C,MAAM,iBAAiB;GAAE,GAAG;GAAS,MAAM,aAAa;EAAM;EAC9D,OAAO;GACL,GAAG,iBAAiB,YAAY;GAChC,IAAI,WAAgD;IAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,GAAG,GAAGC,qBAAa,cAAc,CAAC,GAAG,IAAI,EAAE,MAAM,QAAQ,GAAG,GAAGC,sBAAc,cAAc,CAAC,CAAC,CAAC;GAAG;GAC1L,IAAI,QAA0C;IAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,OAAO,mBAAmB,GAAG,GAAGC,iCAAqB,cAAc,CAAC,GAAG,IAAI,EAAE,OAAO,gBAAgB,GAAG,GAAGC,8BAAkB,cAAc,CAAC,CAAC,CAAC;GAAG;GACtN,IAAI,YAAkD;IAAE,OAAO,QAAQ,CAAC,GAAGC,gCAAuB,cAAc,CAAC,CAAC;GAAG;GACrH,UAAU,CAAC,GAAI,aAAa,YAAY,CAAC,CAAE;GAC3C,IAAI,aAAoD;IAAE,OAAO,CAAC,GAAI,aAAa,cAAc,CAAC,CAAE;GAAG;EACzG;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"server.mjs","names":["runtime","rootSession","commandLoop","commandLoops","hookSessionShutdown","hookSessionStart","resourceDoompiUseLoop"],"sources":["../../src/services/serverRuntime/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/command/loop.server.ts","../../src/extensions/workspaces/sessions/(backend)/command/loops.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.ts","../../generated/server.ts"],"sourcesContent":["import { serverMinorModes } from '@agimon-ai/doompi-minor-mode';\nimport { defineMinorMode, type MinorModeOwner, type MinorModeState } from '@agimon-ai/doompi-minor-mode';\n\nimport { LIST_COMMAND_NAME, START_COMMAND_NAME } from '../../constants/loop';\nimport type { DoomLoopLaunchersService, LoopLauncherRegistration, StoppableLoop } from '../../schemas/loopLaunchers';\nimport { createDoomLoopLaunchersService, type LoopLaunchersDependencies } from '../../services/loopLaunchers';\nimport { formatLoopStatusView, LOOP_VIEW_STATUS_KEY } from '../../types/loopView';\n\nconst SOURCE = '@agimon-ai/doompi-loop';\nconst MODE_ID = 'loop.active';\nconst DEFAULT_LAUNCHER_ID = 'doompi.default';\nconst DEFAULT_INTERVAL_SECONDS = 300;\nconst MIN_INTERVAL_SECONDS = 30;\nconst MAX_INTERVAL_SECONDS = 3600;\n\nfunction notify(\n context: {\n client: { notify(request: { body: string; level?: 'info' | 'warning' | 'error' }): void | Promise<void> };\n },\n body: string,\n level: 'info' | 'warning' | 'error' = 'info',\n): Promise<void> {\n return Promise.resolve(context.client.notify({ body, level }));\n}\n\nfunction numberInput(value: unknown, fallback: number): number {\n if (typeof value !== 'string' || value.trim() === '') return fallback;\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < MIN_INTERVAL_SECONDS || parsed > MAX_INTERVAL_SECONDS) {\n throw new Error(`Interval must be between ${MIN_INTERVAL_SECONDS} and ${MAX_INTERVAL_SECONDS} seconds.`);\n }\n return parsed;\n}\n\nimport { type DoomHeadlessExecutionContext, type DoomHeadlessHostService } from '@agimon-ai/doompi-core/headless';\nimport { readPackageResource, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nexport function createSessionState(host: DoomHeadlessHostService): DoomServerSessionPlugin {\n let launchers: DoomLoopLaunchersService | undefined;\n let defaultRegistration: LoopLauncherRegistration | undefined;\n let unsubscribe: (() => void) | undefined;\n let modeOwner: MinorModeOwner | undefined;\n const modeSelected = (): boolean => (host.context.selection.state?.['minor-mode'] ?? []).includes(MODE_ID);\n const modeState = (): MinorModeState => {\n const launcherCount = launchers?.listLaunchers().length ?? 0;\n const active = (launchers?.listInstances().length ?? 0) > 0;\n const canStart = launcherCount > 0 || !modeSelected();\n return {\n activation: active ? 'active' : 'inactive',\n condition: launchers?.listInstances().some(({ state }) => state !== 'running') ? 'queued' : 'ready',\n ...(active ? { detail: `${launchers?.listInstances().length} active`, color: 'warning' } : {}),\n actions: [\n {\n id: 'start',\n enabled: canStart,\n ...(canStart ? {} : { disabledReason: 'No loop launchers are registered.' }),\n },\n {\n id: 'stop',\n enabled: active,\n ...(active ? {} : { disabledReason: 'No loops are active.' }),\n },\n ],\n };\n };\n /**\n * The instances the activity dock lists.\n *\n * An empty list publishes an empty value rather than nothing, because the key\n * being present is what keeps the group on screen as a launcher. The group\n * declares no `hideWhenEmpty`, so an empty value is a header with no rows.\n */\n const publishView = (): void =>\n host.context.client.setStatus(LOOP_VIEW_STATUS_KEY, formatLoopStatusView(launchers?.listInstances() ?? []));\n /** Both surfaces a loop shows up on: the minor-mode catalog and the activity dock. */\n const publishMode = (): void => {\n modeOwner?.publish();\n publishView();\n };\n const startActivity = async (execution: typeof host.context): Promise<() => Promise<void>> => {\n if (launchers !== undefined) return async () => undefined;\n const dependencies: LoopLaunchersDependencies = {\n generation: `${execution.sessionId}:loop-launchers`,\n createInstanceId: () => crypto.randomUUID(),\n timestamp: () => new Date().toISOString(),\n };\n const service = createDoomLoopLaunchersService(dependencies);\n const registration = service.register({\n id: DEFAULT_LAUNCHER_ID,\n source: SOURCE,\n label: 'Default loop',\n description: 'Run a prompt in this session on an interval.',\n async launch({ instanceId, signal }): Promise<StoppableLoop | undefined> {\n const promptValue = await execution.client.request(\n { kind: 'input', title: 'Loop prompt', multiline: true },\n signal,\n );\n const prompt = typeof promptValue === 'string' ? promptValue.trim() : '';\n if (!prompt || signal.aborted) return undefined;\n const interval = numberInput(\n await execution.client.request(\n { kind: 'input', title: 'Loop interval in seconds', initialValue: String(DEFAULT_INTERVAL_SECONDS) },\n signal,\n ),\n DEFAULT_INTERVAL_SECONDS,\n );\n let stopped = false;\n const tick = (): void => {\n if (stopped || signal.aborted) return;\n void execution.session.prompt(prompt).catch((error) => {\n void notify(\n execution,\n `Loop pass failed: ${error instanceof Error ? error.message : String(error)}`,\n 'warning',\n );\n });\n };\n const timer = setInterval(tick, interval * 1000);\n timer.unref?.();\n tick();\n return {\n instanceId,\n label: 'Default loop',\n detail: `every ${interval}s`,\n stop() {\n stopped = true;\n clearInterval(timer);\n },\n };\n },\n });\n launchers = service;\n defaultRegistration = registration;\n unsubscribe = service.subscribe(publishMode);\n publishMode();\n return async () => {\n unsubscribe?.();\n unsubscribe = undefined;\n await registration.dispose('Headless loop activity stopped.');\n await service.dispose('Headless loop activity stopped.');\n if (launchers === service) launchers = undefined;\n if (defaultRegistration === registration) defaultRegistration = undefined;\n publishMode();\n };\n };\n modeOwner = defineMinorMode({\n descriptor: {\n source: SOURCE,\n id: MODE_ID,\n label: 'Loop',\n description: 'Session-scoped recurring prompt loops.',\n order: 60,\n actions: [\n {\n id: 'start',\n label: 'Start',\n description: 'Start a loop with a registered launcher.',\n contexts: ['headless'],\n parameters: [\n { name: 'launcherId', label: 'Launcher', kind: 'string', required: true, minLength: 1 },\n { name: 'instanceId', label: 'Instance ID', kind: 'string', required: false, minLength: 1 },\n ],\n },\n {\n id: 'stop',\n label: 'Stop',\n description: 'Stop one active loop instance.',\n contexts: ['headless'],\n parameters: [\n { name: 'instanceId', label: 'Instance ID', kind: 'string', required: true, minLength: 1 },\n { name: 'reason', label: 'Reason', kind: 'string', required: false, minLength: 1 },\n ],\n },\n ],\n },\n state: modeState,\n async handleAction(_runtime, actionId, argumentsValue, { signal }) {\n signal.throwIfAborted();\n if (actionId === 'start' && !launchers) {\n const modes = (host.context.selection.state?.['minor-mode'] ?? []).filter((mode) => mode !== MODE_ID);\n await host.changeSelection({ axis: 'state', key: 'minor-mode', values: [...modes, MODE_ID] });\n }\n if (!launchers) throw new Error('Loop activity is not active.');\n if (actionId === 'start') {\n const instance = await launchers.launch(\n String(argumentsValue.launcherId ?? ''),\n argumentsValue.instanceId ? { instanceId: String(argumentsValue.instanceId) } : {},\n );\n publishMode();\n return { message: instance ? `Loop '${instance.instanceId}' started.` : 'Loop launch was cancelled.' };\n }\n if (actionId === 'stop') {\n const stopped = await launchers.stop(\n String(argumentsValue.instanceId ?? ''),\n String(argumentsValue.reason ?? 'Stopped through minor_mode.'),\n );\n if (stopped && launchers.listInstances().length === 0) {\n const modes = (host.context.selection.state?.['minor-mode'] ?? []).filter((mode) => mode !== MODE_ID);\n await host.changeSelection({ axis: 'state', key: 'minor-mode', values: modes });\n }\n publishMode();\n return { message: stopped ? 'Loop stopped.' : 'Loop instance was not active.' };\n }\n throw new Error(`Unknown loop mode action: ${actionId}`);\n },\n }).createOwner(undefined);\n return {\n services: [serverMinorModes([modeOwner])],\n resources: [\n {\n when: { state: { 'minor-mode': MODE_ID }, attribution: { kind: 'minor', mode: MODE_ID } },\n name: 'doompi-use-loop',\n kind: 'skill',\n read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-use-loop/SKILL.md'),\n },\n ],\n activities: [\n {\n when: { state: { 'minor-mode': MODE_ID }, attribution: { kind: 'minor', mode: MODE_ID } },\n name: 'doompi-loop',\n start: startActivity,\n },\n ],\n commands: [\n {\n name: START_COMMAND_NAME,\n description: 'Start a registered loop.',\n async execute(args: string, execution: DoomHeadlessExecutionContext) {\n if (!launchers) {\n const modes = host.context.selection.state?.['minor-mode'] ?? [];\n await host.changeSelection({ axis: 'state', key: 'minor-mode', values: [...modes, MODE_ID] });\n }\n if (!launchers) throw new Error('Loop activity is not active.');\n const available = launchers.listLaunchers();\n const selected =\n args.trim() ||\n (await execution.client.request({\n kind: 'select',\n title: 'Choose a loop launcher',\n options: available.map((entry) => ({ label: entry.label, value: entry.id })),\n }));\n const launcherId = args.trim() || (typeof selected === 'string' ? selected : '');\n if (!launcherId) return;\n const instance = await launchers.launch(launcherId);\n publishMode();\n await notify(execution, instance ? `Loop '${instance.instanceId}' started.` : 'Loop launch was cancelled.');\n },\n },\n {\n name: LIST_COMMAND_NAME,\n description: 'List and stop active loops.',\n async execute(_args: string, execution: DoomHeadlessExecutionContext) {\n const instances = launchers?.listInstances() ?? [];\n await notify(execution, instances.length === 0 ? 'No loops are active.' : JSON.stringify(instances, null, 2));\n },\n },\n ],\n hooks: [\n {\n // Ungated on purpose: the dock's loops group is a way in, so it has to\n // exist before anyone selects loop mode. The activity below is gated on\n // that selection and cannot do this job.\n event: 'session_start',\n async handle() {\n publishView();\n },\n },\n {\n when: { state: { 'minor-mode': MODE_ID }, attribution: { kind: 'minor', mode: MODE_ID } },\n event: 'session_shutdown',\n async handle() {\n await launchers?.stopAll('Headless session shutdown.');\n },\n },\n ],\n async onDispose() {\n await defaultRegistration?.dispose('Headless loop facet disposed.');\n await launchers?.dispose('Headless loop facet disposed.');\n },\n };\n}\n","import type { DoomServerPluginDefinition, DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createSessionState } from '../../../../../services/serverRuntime';\n\nexport default (({ agent }): Partial<DoomServerSessionPlugin> =>\n agent ? createSessionState(agent) : {}) satisfies NonNullable<DoomServerPluginDefinition['session']>;\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport runtime from './_lib/runtime.server';\n\nexport default defineRoot((context: DoomServerPluginContext) => {\n const value = runtime(context);\n return {\n value,\n services: value.services,\n activities: value.activities,\n onStart: value.onStart,\n onStop: value.onStop,\n onDispose: value.onDispose,\n };\n});\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext, DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<DoomServerPluginContext, Partial<DoomServerSessionPlugin>>) => context.root.commands?.[0],\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext, DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<DoomServerPluginContext, Partial<DoomServerSessionPlugin>>) => context.root.commands?.[1],\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext, DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<DoomServerPluginContext, Partial<DoomServerSessionPlugin>>) =>\n context.root.hooks?.find((hook) => hook.event === 'session_shutdown'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext, DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<DoomServerPluginContext, Partial<DoomServerSessionPlugin>>) =>\n context.root.hooks?.find((hook) => hook.event === 'session_start'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext, DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<DoomServerPluginContext, Partial<DoomServerSessionPlugin>>) => context.root.resources?.[0],\n { cardinality: 'optional' },\n);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport commandLoop from '../src/extensions/workspaces/sessions/(backend)/command/loop.server';\nimport commandLoops from '../src/extensions/workspaces/sessions/(backend)/command/loops.server';\nimport hookSessionShutdown from '../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/session-start.server';\nimport resourceDoompiUseLoop from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n/* v8 ignore next -- generated normalization branch */\nconst defined = <T>(values: readonly (T | undefined)[]): T[] =>\n values.filter((value): value is T => value !== undefined);\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T => ({ ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-loop',\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): DoomServerSessionPlugin['commands'] { return defined([via({ name: 'loop' }, at(commandLoop, contextSession)), via({ name: 'loops' }, at(commandLoops, contextSession))]); },\n get hooks(): DoomServerSessionPlugin['hooks'] { return defined([via({ event: 'session_shutdown' }, at(hookSessionShutdown, contextSession)), via({ event: 'session_start' }, at(hookSessionStart, contextSession))]); },\n get resources(): DoomServerSessionPlugin['resources'] { return defined([at(resourceDoompiUseLoop, contextSession)]); },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { DoomLoopLaunchersService, LoopInstanceSnapshot, LoopLaunchRequest, LoopLauncherDefinition, LoopLauncherRegistration, LoopLauncherSummary, StoppableLoop } from "./src/schemas/loopLaunchers.mjs";
1
+ import { a as LoopLauncherDefinition, c as StoppableLoop, i as LoopLaunchRequest, n as DoomLoopLaunchersService, o as LoopLauncherRegistration, r as LoopInstanceSnapshot, s as LoopLauncherSummary } from "./loopLaunchers-CPUUrDzQ.mjs";
2
2
  export type { DoomLoopLaunchersService, LoopInstanceSnapshot, LoopLaunchRequest, LoopLauncherDefinition, LoopLauncherRegistration, LoopLauncherSummary, StoppableLoop };
@@ -10,8 +10,23 @@ function requireDoomLoopLaunchers(context) {
10
10
  return service;
11
11
  }
12
12
  //#endregion
13
- exports.DOOM_LOOP_LAUNCHERS_SERVICE = DOOM_LOOP_LAUNCHERS_SERVICE;
14
- exports.readDoomLoopLaunchers = readDoomLoopLaunchers;
15
- exports.requireDoomLoopLaunchers = requireDoomLoopLaunchers;
13
+ Object.defineProperty(exports, "DOOM_LOOP_LAUNCHERS_SERVICE", {
14
+ enumerable: true,
15
+ get: function() {
16
+ return DOOM_LOOP_LAUNCHERS_SERVICE;
17
+ }
18
+ });
19
+ Object.defineProperty(exports, "readDoomLoopLaunchers", {
20
+ enumerable: true,
21
+ get: function() {
22
+ return readDoomLoopLaunchers;
23
+ }
24
+ });
25
+ Object.defineProperty(exports, "requireDoomLoopLaunchers", {
26
+ enumerable: true,
27
+ get: function() {
28
+ return requireDoomLoopLaunchers;
29
+ }
30
+ });
16
31
 
17
- //# sourceMappingURL=loopLaunchers.cjs.map
32
+ //# sourceMappingURL=loopLaunchers-BtcLH_xN.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loopLaunchers-BtcLH_xN.cjs","names":[],"sources":["../src/schemas/loopLaunchers.ts"],"sourcesContent":["import type { Context } from '@deepseek-ai/cordis';\n\n/** Provider-owned Cordis service for session-scoped recurring-loop launchers. */\nexport const DOOM_LOOP_LAUNCHERS_SERVICE = 'doom/loop-launchers';\n\nexport interface LoopLaunchRequest {\n readonly instanceId: string;\n readonly signal: AbortSignal;\n}\n\nexport interface StoppableLoop {\n readonly instanceId: string;\n readonly label?: string;\n readonly detail?: string;\n stop(reason?: string): void | Promise<void>;\n}\n\nexport interface LoopLauncherSummary {\n readonly id: string;\n readonly source: string;\n readonly label: string;\n readonly description?: string;\n}\n\nexport interface LoopInstanceSnapshot {\n readonly instanceId: string;\n readonly launcherId: string;\n readonly launcherLabel: string;\n readonly label?: string;\n readonly detail?: string;\n readonly state: 'starting' | 'running' | 'stopping';\n readonly startedAt?: string;\n}\n\nexport interface LoopLauncherDefinition extends LoopLauncherSummary {\n launch(request: LoopLaunchRequest): Promise<StoppableLoop | undefined>;\n}\n\nexport interface LoopLauncherRegistration {\n readonly id: string;\n readonly generation: string;\n dispose(reason?: string): Promise<void>;\n}\n\n/** Direct registrar/control seam owned and provided by doompi-loop. */\nexport interface DoomLoopLaunchersService {\n readonly generation: string;\n register(definition: LoopLauncherDefinition): LoopLauncherRegistration;\n listLaunchers(): readonly LoopLauncherSummary[];\n listInstances(): readonly LoopInstanceSnapshot[];\n subscribe(listener: () => void): () => void;\n launch(launcherId: string, options?: { instanceId?: string }): Promise<LoopInstanceSnapshot | undefined>;\n stop(instanceId: string, reason?: string): Promise<boolean>;\n stopAll(reason?: string): Promise<void>;\n dispose(reason?: string): Promise<void>;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'doom/loop-launchers': DoomLoopLaunchersService;\n }\n}\n\nexport function readDoomLoopLaunchers(context: Context): DoomLoopLaunchersService | undefined {\n return context.get(DOOM_LOOP_LAUNCHERS_SERVICE) as DoomLoopLaunchersService | undefined;\n}\n\nexport function requireDoomLoopLaunchers(context: Context): DoomLoopLaunchersService {\n const service = readDoomLoopLaunchers(context);\n if (!service) throw new Error('Doom loop launchers are unavailable. Load @agimon-ai/doompi-loop.');\n return service;\n}\n"],"mappings":";;AAGA,MAAa,8BAA8B;AA4D3C,SAAgB,sBAAsB,SAAwD;CAC5F,OAAO,QAAQ,IAAI,2BAA2B;AAChD;AAEA,SAAgB,yBAAyB,SAA4C;CACnF,MAAM,UAAU,sBAAsB,OAAO;CAC7C,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,mEAAmE;CACjG,OAAO;AACT"}
@@ -1,24 +1,24 @@
1
1
  import { Context } from "@deepseek-ai/cordis";
2
2
  //#region src/schemas/loopLaunchers.d.ts
3
3
  /** Provider-owned Cordis service for session-scoped recurring-loop launchers. */
4
- export declare const DOOM_LOOP_LAUNCHERS_SERVICE = "doom/loop-launchers";
5
- export interface LoopLaunchRequest {
4
+ declare const DOOM_LOOP_LAUNCHERS_SERVICE = "doom/loop-launchers";
5
+ interface LoopLaunchRequest {
6
6
  readonly instanceId: string;
7
7
  readonly signal: AbortSignal;
8
8
  }
9
- export interface StoppableLoop {
9
+ interface StoppableLoop {
10
10
  readonly instanceId: string;
11
11
  readonly label?: string;
12
12
  readonly detail?: string;
13
13
  stop(reason?: string): void | Promise<void>;
14
14
  }
15
- export interface LoopLauncherSummary {
15
+ interface LoopLauncherSummary {
16
16
  readonly id: string;
17
17
  readonly source: string;
18
18
  readonly label: string;
19
19
  readonly description?: string;
20
20
  }
21
- export interface LoopInstanceSnapshot {
21
+ interface LoopInstanceSnapshot {
22
22
  readonly instanceId: string;
23
23
  readonly launcherId: string;
24
24
  readonly launcherLabel: string;
@@ -27,16 +27,16 @@ export interface LoopInstanceSnapshot {
27
27
  readonly state: 'starting' | 'running' | 'stopping';
28
28
  readonly startedAt?: string;
29
29
  }
30
- export interface LoopLauncherDefinition extends LoopLauncherSummary {
30
+ interface LoopLauncherDefinition extends LoopLauncherSummary {
31
31
  launch(request: LoopLaunchRequest): Promise<StoppableLoop | undefined>;
32
32
  }
33
- export interface LoopLauncherRegistration {
33
+ interface LoopLauncherRegistration {
34
34
  readonly id: string;
35
35
  readonly generation: string;
36
36
  dispose(reason?: string): Promise<void>;
37
37
  }
38
38
  /** Direct registrar/control seam owned and provided by doompi-loop. */
39
- export interface DoomLoopLaunchersService {
39
+ interface DoomLoopLaunchersService {
40
40
  readonly generation: string;
41
41
  register(definition: LoopLauncherDefinition): LoopLauncherRegistration;
42
42
  listLaunchers(): readonly LoopLauncherSummary[];
@@ -54,7 +54,8 @@ declare module '@deepseek-ai/cordis' {
54
54
  'doom/loop-launchers': DoomLoopLaunchersService;
55
55
  }
56
56
  }
57
- export declare function readDoomLoopLaunchers(context: Context): DoomLoopLaunchersService | undefined;
58
- export declare function requireDoomLoopLaunchers(context: Context): DoomLoopLaunchersService;
57
+ declare function readDoomLoopLaunchers(context: Context): DoomLoopLaunchersService | undefined;
58
+ declare function requireDoomLoopLaunchers(context: Context): DoomLoopLaunchersService;
59
59
  //#endregion
60
- //# sourceMappingURL=loopLaunchers.d.cts.map
60
+ export { LoopLauncherDefinition as a, StoppableLoop as c, LoopLaunchRequest as i, readDoomLoopLaunchers as l, DoomLoopLaunchersService as n, LoopLauncherRegistration as o, LoopInstanceSnapshot as r, LoopLauncherSummary as s, DOOM_LOOP_LAUNCHERS_SERVICE as t, requireDoomLoopLaunchers as u };
61
+ //# sourceMappingURL=loopLaunchers-CPUUrDzQ.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loopLaunchers-CPUUrDzQ.d.mts","names":[],"sources":["../src/schemas/loopLaunchers.ts"],"mappings":";;;cAGa;UAEI;WACN;WACA,QAAQ;;UAGF;WACN;WACA;WACA;EACT,KAAK,yBAAyB;;UAGf;WACN;WACA;WACA;WACA;;UAGM;WACN;WACA;WACA;WACA;WACA;WACA;WACA;;UAGM,+BAA+B;EAC9C,OAAO,SAAS,oBAAoB,QAAQ;;UAG7B;WACN;WACA;EACT,QAAQ,kBAAkB;;;UAIX;WACN;EACT,SAAS,YAAY,yBAAyB;EAC9C,0BAA0B;EAC1B,0BAA0B;EAC1B,UAAU;EACV,OAAO,oBAAoB;IAAY;MAAwB,QAAQ;EACvE,KAAK,oBAAoB,kBAAkB;EAC3C,QAAQ,kBAAkB;EAC1B,QAAQ,kBAAkB;;;YAIhB;IACR,uBAAuB;;;iBAIX,sBAAsB,SAAS,UAAU;iBAIzC,yBAAyB,SAAS,UAAU"}
@@ -10,6 +10,6 @@ function requireDoomLoopLaunchers(context) {
10
10
  return service;
11
11
  }
12
12
  //#endregion
13
- export { DOOM_LOOP_LAUNCHERS_SERVICE, readDoomLoopLaunchers, requireDoomLoopLaunchers };
13
+ export { readDoomLoopLaunchers as n, requireDoomLoopLaunchers as r, DOOM_LOOP_LAUNCHERS_SERVICE as t };
14
14
 
15
- //# sourceMappingURL=loopLaunchers.mjs.map
15
+ //# sourceMappingURL=loopLaunchers-cCniFbVA.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loopLaunchers-cCniFbVA.mjs","names":[],"sources":["../src/schemas/loopLaunchers.ts"],"sourcesContent":["import type { Context } from '@deepseek-ai/cordis';\n\n/** Provider-owned Cordis service for session-scoped recurring-loop launchers. */\nexport const DOOM_LOOP_LAUNCHERS_SERVICE = 'doom/loop-launchers';\n\nexport interface LoopLaunchRequest {\n readonly instanceId: string;\n readonly signal: AbortSignal;\n}\n\nexport interface StoppableLoop {\n readonly instanceId: string;\n readonly label?: string;\n readonly detail?: string;\n stop(reason?: string): void | Promise<void>;\n}\n\nexport interface LoopLauncherSummary {\n readonly id: string;\n readonly source: string;\n readonly label: string;\n readonly description?: string;\n}\n\nexport interface LoopInstanceSnapshot {\n readonly instanceId: string;\n readonly launcherId: string;\n readonly launcherLabel: string;\n readonly label?: string;\n readonly detail?: string;\n readonly state: 'starting' | 'running' | 'stopping';\n readonly startedAt?: string;\n}\n\nexport interface LoopLauncherDefinition extends LoopLauncherSummary {\n launch(request: LoopLaunchRequest): Promise<StoppableLoop | undefined>;\n}\n\nexport interface LoopLauncherRegistration {\n readonly id: string;\n readonly generation: string;\n dispose(reason?: string): Promise<void>;\n}\n\n/** Direct registrar/control seam owned and provided by doompi-loop. */\nexport interface DoomLoopLaunchersService {\n readonly generation: string;\n register(definition: LoopLauncherDefinition): LoopLauncherRegistration;\n listLaunchers(): readonly LoopLauncherSummary[];\n listInstances(): readonly LoopInstanceSnapshot[];\n subscribe(listener: () => void): () => void;\n launch(launcherId: string, options?: { instanceId?: string }): Promise<LoopInstanceSnapshot | undefined>;\n stop(instanceId: string, reason?: string): Promise<boolean>;\n stopAll(reason?: string): Promise<void>;\n dispose(reason?: string): Promise<void>;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'doom/loop-launchers': DoomLoopLaunchersService;\n }\n}\n\nexport function readDoomLoopLaunchers(context: Context): DoomLoopLaunchersService | undefined {\n return context.get(DOOM_LOOP_LAUNCHERS_SERVICE) as DoomLoopLaunchersService | undefined;\n}\n\nexport function requireDoomLoopLaunchers(context: Context): DoomLoopLaunchersService {\n const service = readDoomLoopLaunchers(context);\n if (!service) throw new Error('Doom loop launchers are unavailable. Load @agimon-ai/doompi-loop.');\n return service;\n}\n"],"mappings":";;AAGA,MAAa,8BAA8B;AA4D3C,SAAgB,sBAAsB,SAAwD;CAC5F,OAAO,QAAQ,IAAI,2BAA2B;AAChD;AAEA,SAAgB,yBAAyB,SAA4C;CACnF,MAAM,UAAU,sBAAsB,OAAO;CAC7C,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,mEAAmE;CACjG,OAAO;AACT"}
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_loopLaunchers = require("./src/schemas/loopLaunchers.cjs");
2
+ const require_loopLaunchers = require("./loopLaunchers-BtcLH_xN.cjs");
3
3
  exports.DOOM_LOOP_LAUNCHERS_SERVICE = require_loopLaunchers.DOOM_LOOP_LAUNCHERS_SERVICE;
4
4
  exports.readDoomLoopLaunchers = require_loopLaunchers.readDoomLoopLaunchers;
5
5
  exports.requireDoomLoopLaunchers = require_loopLaunchers.requireDoomLoopLaunchers;
@@ -1,2 +1,2 @@
1
- import { DOOM_LOOP_LAUNCHERS_SERVICE, DoomLoopLaunchersService, LoopInstanceSnapshot, LoopLaunchRequest, LoopLauncherDefinition, LoopLauncherRegistration, LoopLauncherSummary, StoppableLoop, readDoomLoopLaunchers, requireDoomLoopLaunchers } from "./src/schemas/loopLaunchers.mjs";
1
+ import { a as LoopLauncherDefinition, c as StoppableLoop, i as LoopLaunchRequest, l as readDoomLoopLaunchers, n as DoomLoopLaunchersService, o as LoopLauncherRegistration, r as LoopInstanceSnapshot, s as LoopLauncherSummary, t as DOOM_LOOP_LAUNCHERS_SERVICE, u as requireDoomLoopLaunchers } from "./loopLaunchers-CPUUrDzQ.mjs";
2
2
  export { DOOM_LOOP_LAUNCHERS_SERVICE, type DoomLoopLaunchersService, type LoopInstanceSnapshot, type LoopLaunchRequest, type LoopLauncherDefinition, type LoopLauncherRegistration, type LoopLauncherSummary, type StoppableLoop, readDoomLoopLaunchers, requireDoomLoopLaunchers };
@@ -1,2 +1,2 @@
1
- import { DOOM_LOOP_LAUNCHERS_SERVICE, readDoomLoopLaunchers, requireDoomLoopLaunchers } from "./src/schemas/loopLaunchers.mjs";
1
+ import { n as readDoomLoopLaunchers, r as requireDoomLoopLaunchers, t as DOOM_LOOP_LAUNCHERS_SERVICE } from "./loopLaunchers-cCniFbVA.mjs";
2
2
  export { DOOM_LOOP_LAUNCHERS_SERVICE, readDoomLoopLaunchers, requireDoomLoopLaunchers };
@@ -1,3 +1,9 @@
1
+ //#region src/constants/loop.ts
2
+ const START_COMMAND_DESCRIPTION = "Start a registered loop";
3
+ const LIST_COMMAND_DESCRIPTION = "List and stop active loops";
4
+ const START_COMMAND_NAME = "loop";
5
+ const LIST_COMMAND_NAME = "loops";
6
+ //#endregion
1
7
  //#region src/services/loopLaunchers/index.ts
2
8
  const MAX_ID_LENGTH = 256;
3
9
  const MAX_GENERATION_LENGTH = 256;
@@ -175,6 +181,62 @@ function createDoomLoopLaunchersService({ generation, createInstanceId, timestam
175
181
  });
176
182
  }
177
183
  //#endregion
178
- export { createDoomLoopLaunchersService };
184
+ //#region src/types/loopView.ts
185
+ /** The browser-only status that carries active Loop instances into the activity dock. */
186
+ const LOOP_VIEW_STATUS_KEY = "doom-loop-instances";
187
+ new RegExp(String.raw`\u001b\[[0-9;]*m`, "gu");
188
+ /** Projects runtime snapshots into the JSON status consumed by the web plugin. */
189
+ function formatLoopStatusView(instances) {
190
+ if (instances.length === 0) return void 0;
191
+ return JSON.stringify(instances.map((instance) => ({
192
+ instanceId: instance.instanceId,
193
+ label: instance.label ?? instance.launcherLabel,
194
+ detail: instance.detail ?? instance.instanceId,
195
+ state: instance.state
196
+ })));
197
+ }
198
+ //#endregion
199
+ Object.defineProperty(exports, "LIST_COMMAND_DESCRIPTION", {
200
+ enumerable: true,
201
+ get: function() {
202
+ return LIST_COMMAND_DESCRIPTION;
203
+ }
204
+ });
205
+ Object.defineProperty(exports, "LIST_COMMAND_NAME", {
206
+ enumerable: true,
207
+ get: function() {
208
+ return LIST_COMMAND_NAME;
209
+ }
210
+ });
211
+ Object.defineProperty(exports, "LOOP_VIEW_STATUS_KEY", {
212
+ enumerable: true,
213
+ get: function() {
214
+ return LOOP_VIEW_STATUS_KEY;
215
+ }
216
+ });
217
+ Object.defineProperty(exports, "START_COMMAND_DESCRIPTION", {
218
+ enumerable: true,
219
+ get: function() {
220
+ return START_COMMAND_DESCRIPTION;
221
+ }
222
+ });
223
+ Object.defineProperty(exports, "START_COMMAND_NAME", {
224
+ enumerable: true,
225
+ get: function() {
226
+ return START_COMMAND_NAME;
227
+ }
228
+ });
229
+ Object.defineProperty(exports, "createDoomLoopLaunchersService", {
230
+ enumerable: true,
231
+ get: function() {
232
+ return createDoomLoopLaunchersService;
233
+ }
234
+ });
235
+ Object.defineProperty(exports, "formatLoopStatusView", {
236
+ enumerable: true,
237
+ get: function() {
238
+ return formatLoopStatusView;
239
+ }
240
+ });
179
241
 
180
- //# sourceMappingURL=index.mjs.map
242
+ //# sourceMappingURL=loopView-CLIBhqYC.cjs.map