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

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 (191) hide show
  1. package/README.md +83 -21
  2. package/dist/api-contracts.cjs +7 -0
  3. package/dist/api-contracts.d.cts +2 -0
  4. package/dist/api-contracts.d.mts +2 -0
  5. package/dist/api-contracts.mjs +2 -0
  6. package/dist/extensions/pi.cjs +35 -1
  7. package/dist/extensions/pi.cjs.map +1 -1
  8. package/dist/extensions/pi.d.cts +5 -2
  9. package/dist/extensions/pi.d.cts.map +1 -0
  10. package/dist/extensions/pi.d.mts +5 -2
  11. package/dist/extensions/pi.d.mts.map +1 -0
  12. package/dist/extensions/pi.mjs +30 -1
  13. package/dist/extensions/pi.mjs.map +1 -1
  14. package/dist/extensions/server.cjs +51 -0
  15. package/dist/extensions/server.cjs.map +1 -0
  16. package/dist/extensions/server.d.cts +5 -0
  17. package/dist/extensions/server.d.cts.map +1 -0
  18. package/dist/extensions/server.d.mts +5 -0
  19. package/dist/extensions/server.d.mts.map +1 -0
  20. package/dist/extensions/server.mjs +46 -0
  21. package/dist/extensions/server.mjs.map +1 -0
  22. package/dist/extensions/web.mjs +228 -0
  23. package/dist/extensions/web.mjs.map +1 -0
  24. package/dist/index.cjs +0 -1
  25. package/dist/index.d.cts +2 -4
  26. package/dist/index.d.mts +2 -4
  27. package/dist/index.mjs +1 -1
  28. package/dist/loopLaunchers.cjs +5 -0
  29. package/dist/loopLaunchers.d.cts +2 -0
  30. package/dist/loopLaunchers.d.mts +2 -0
  31. package/dist/loopLaunchers.mjs +2 -0
  32. package/dist/src/constants/loop.cjs +12 -0
  33. package/dist/src/constants/loop.cjs.map +1 -0
  34. package/dist/src/constants/loop.mjs +9 -0
  35. package/dist/src/constants/loop.mjs.map +1 -0
  36. package/dist/src/constants/piLoop.cjs +16 -0
  37. package/dist/src/constants/piLoop.cjs.map +1 -0
  38. package/dist/src/constants/piLoop.mjs +11 -0
  39. package/dist/src/constants/piLoop.mjs.map +1 -0
  40. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.cli.cjs +26 -0
  41. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.cli.cjs.map +1 -0
  42. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.cli.mjs +26 -0
  43. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.cli.mjs.map +1 -0
  44. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.cjs +7 -0
  45. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.cjs.map +1 -0
  46. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.mjs +7 -0
  47. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.mjs.map +1 -0
  48. package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.cli.cjs +6 -0
  49. package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.cli.cjs.map +1 -0
  50. package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.cli.mjs +7 -0
  51. package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.cli.mjs.map +1 -0
  52. package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.server.cjs +6 -0
  53. package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.server.cjs.map +1 -0
  54. package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.server.mjs +7 -0
  55. package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.server.mjs.map +1 -0
  56. package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.cli.cjs +6 -0
  57. package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.cli.cjs.map +1 -0
  58. package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.cli.mjs +7 -0
  59. package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.cli.mjs.map +1 -0
  60. package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.server.cjs +6 -0
  61. package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.server.cjs.map +1 -0
  62. package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.server.mjs +7 -0
  63. package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.server.mjs.map +1 -0
  64. package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.cjs +6 -0
  65. package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.cjs.map +1 -0
  66. package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.mjs +7 -0
  67. package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.mjs.map +1 -0
  68. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.cjs +6 -0
  69. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.cjs.map +1 -0
  70. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.mjs +7 -0
  71. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.mjs.map +1 -0
  72. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.server.cjs +6 -0
  73. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.server.cjs.map +1 -0
  74. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.server.mjs +7 -0
  75. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.server.mjs.map +1 -0
  76. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.cjs +6 -0
  77. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.cjs.map +1 -0
  78. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.mjs +7 -0
  79. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.mjs.map +1 -0
  80. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.cjs +6 -0
  81. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.cjs.map +1 -0
  82. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.mjs +7 -0
  83. package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.mjs.map +1 -0
  84. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs +14 -0
  85. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs.map +1 -0
  86. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs +15 -0
  87. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs.map +1 -0
  88. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs +17 -0
  89. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs.map +1 -0
  90. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs +18 -0
  91. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs.map +1 -0
  92. package/dist/src/schemas/apiContracts.cjs +13 -0
  93. package/dist/src/schemas/apiContracts.cjs.map +1 -0
  94. package/dist/src/schemas/apiContracts.d.cts +53 -0
  95. package/dist/src/schemas/apiContracts.d.cts.map +1 -0
  96. package/dist/src/schemas/apiContracts.d.mts +53 -0
  97. package/dist/src/schemas/apiContracts.d.mts.map +1 -0
  98. package/dist/src/schemas/apiContracts.mjs +13 -0
  99. package/dist/src/schemas/apiContracts.mjs.map +1 -0
  100. package/dist/src/schemas/loopLaunchers.cjs +17 -0
  101. package/dist/src/schemas/loopLaunchers.cjs.map +1 -0
  102. package/dist/src/schemas/loopLaunchers.d.cts +60 -0
  103. package/dist/src/schemas/loopLaunchers.d.cts.map +1 -0
  104. package/dist/src/schemas/loopLaunchers.d.mts +60 -0
  105. package/dist/src/schemas/loopLaunchers.d.mts.map +1 -0
  106. package/dist/src/schemas/loopLaunchers.mjs +15 -0
  107. package/dist/src/schemas/loopLaunchers.mjs.map +1 -0
  108. package/dist/src/services/defaultLoopLauncher/index.cjs +92 -0
  109. package/dist/src/services/defaultLoopLauncher/index.cjs.map +1 -0
  110. package/dist/src/services/defaultLoopLauncher/index.mjs +92 -0
  111. package/dist/src/services/defaultLoopLauncher/index.mjs.map +1 -0
  112. package/dist/src/services/loopCommand/index.cjs +15 -0
  113. package/dist/src/services/loopCommand/index.cjs.map +1 -0
  114. package/dist/src/services/loopCommand/index.mjs +15 -0
  115. package/dist/src/services/loopCommand/index.mjs.map +1 -0
  116. package/dist/src/services/loopLaunchers/index.cjs +180 -0
  117. package/dist/src/services/loopLaunchers/index.cjs.map +1 -0
  118. package/dist/src/services/loopLaunchers/index.mjs +180 -0
  119. package/dist/src/services/loopLaunchers/index.mjs.map +1 -0
  120. package/dist/src/services/serverRuntime/index.cjs +293 -0
  121. package/dist/src/services/serverRuntime/index.cjs.map +1 -0
  122. package/dist/src/services/serverRuntime/index.mjs +293 -0
  123. package/dist/src/services/serverRuntime/index.mjs.map +1 -0
  124. package/dist/src/tui/leader.cjs +36 -0
  125. package/dist/src/tui/leader.cjs.map +1 -0
  126. package/dist/src/tui/leader.mjs +36 -0
  127. package/dist/src/tui/leader.mjs.map +1 -0
  128. package/dist/src/tui/loopListOverlay.cjs +101 -0
  129. package/dist/src/tui/loopListOverlay.cjs.map +1 -0
  130. package/dist/src/tui/loopListOverlay.mjs +100 -0
  131. package/dist/src/tui/loopListOverlay.mjs.map +1 -0
  132. package/dist/src/tui/loopRuntime.cjs +256 -0
  133. package/dist/src/tui/loopRuntime.cjs.map +1 -0
  134. package/dist/src/tui/loopRuntime.mjs +256 -0
  135. package/dist/src/tui/loopRuntime.mjs.map +1 -0
  136. package/dist/src/tui/startLoopOverlay.cjs +71 -0
  137. package/dist/src/tui/startLoopOverlay.cjs.map +1 -0
  138. package/dist/src/tui/startLoopOverlay.mjs +70 -0
  139. package/dist/src/tui/startLoopOverlay.mjs.map +1 -0
  140. package/dist/src/types/loopView.cjs +19 -0
  141. package/dist/src/types/loopView.cjs.map +1 -0
  142. package/dist/src/types/loopView.mjs +18 -0
  143. package/dist/src/types/loopView.mjs.map +1 -0
  144. package/llms.txt +9 -0
  145. package/package.json +79 -14
  146. package/src/prompts/doompi-use-loop/SKILL.md +24 -0
  147. package/src/types/loopView.ts +73 -0
  148. package/dist/commands/loopCommand.cjs +0 -2
  149. package/dist/commands/loopCommand.cjs.map +0 -1
  150. package/dist/commands/loopCommand.mjs +0 -2
  151. package/dist/commands/loopCommand.mjs.map +0 -1
  152. package/dist/constants.cjs +0 -2
  153. package/dist/constants.cjs.map +0 -1
  154. package/dist/constants.mjs +0 -2
  155. package/dist/constants.mjs.map +0 -1
  156. package/dist/defaultLauncher.cjs +0 -2
  157. package/dist/defaultLauncher.cjs.map +0 -1
  158. package/dist/defaultLauncher.d.cts +0 -10
  159. package/dist/defaultLauncher.d.cts.map +0 -1
  160. package/dist/defaultLauncher.d.mts +0 -10
  161. package/dist/defaultLauncher.d.mts.map +0 -1
  162. package/dist/defaultLauncher.mjs +0 -2
  163. package/dist/defaultLauncher.mjs.map +0 -1
  164. package/dist/extension.cjs +0 -2
  165. package/dist/extension.cjs.map +0 -1
  166. package/dist/extension.d.cts +0 -6
  167. package/dist/extension.d.cts.map +0 -1
  168. package/dist/extension.d.mts +0 -6
  169. package/dist/extension.d.mts.map +0 -1
  170. package/dist/extension.mjs +0 -2
  171. package/dist/extension.mjs.map +0 -1
  172. package/dist/launcher.cjs +0 -2
  173. package/dist/launcher.cjs.map +0 -1
  174. package/dist/launcher.d.cts +0 -47
  175. package/dist/launcher.d.cts.map +0 -1
  176. package/dist/launcher.d.mts +0 -47
  177. package/dist/launcher.d.mts.map +0 -1
  178. package/dist/launcher.mjs +0 -2
  179. package/dist/launcher.mjs.map +0 -1
  180. package/dist/leader.cjs +0 -2
  181. package/dist/leader.cjs.map +0 -1
  182. package/dist/leader.mjs +0 -2
  183. package/dist/leader.mjs.map +0 -1
  184. package/dist/tui/loopListOverlay.cjs +0 -2
  185. package/dist/tui/loopListOverlay.cjs.map +0 -1
  186. package/dist/tui/loopListOverlay.mjs +0 -2
  187. package/dist/tui/loopListOverlay.mjs.map +0 -1
  188. package/dist/tui/startLoopOverlay.cjs +0 -2
  189. package/dist/tui/startLoopOverlay.cjs.map +0 -1
  190. package/dist/tui/startLoopOverlay.mjs +0 -2
  191. package/dist/tui/startLoopOverlay.mjs.map +0 -1
package/README.md CHANGED
@@ -1,42 +1,104 @@
1
1
  # @agimon-ai/doompi-loop
2
2
 
3
- Generic multi-loop controller for Doompi.
3
+ Send a prompt now, then repeat it at a bounded interval for the current session.
4
4
 
5
- Runs a prompt on a schedule. Loop is a minor mode: it toggles mid-session, stacks with
6
- the others, and reports itself on the shared `MODES` line.
5
+ Part of the [DoomPi distribution](https://www.npmjs.com/package/@agimon-ai/doompi).
7
6
 
8
- Part of [Doompi](https://www.npmjs.com/package/@agimon-ai/doompi), a coding agent that loads
9
- only the skills and tools you name. This package is composed by Doompi and is not usually
10
- installed on its own.
7
+ Several loops can coexist. Loop is a minor mode and remains active while at least one scheduled
8
+ prompt belongs to the current session.
9
+
10
+ > **Alpha:** launcher and scheduling contracts may change between releases.
11
+
12
+ ## Requirements
13
+
14
+ - Node.js 22.19.0 or newer
15
+ - Pi 0.85.0 and Pi TUI 0.85.0
11
16
 
12
17
  ## Install
13
18
 
19
+ The seeded `modes.yaml` selects Loop in `default.packages`. Keep it there or select it through a
20
+ layer; it is not fixed host infrastructure. For standalone Pi:
21
+
14
22
  ```bash
15
- npm install @agimon-ai/doompi-loop
23
+ pi install npm:@agimon-ai/doompi-loop
16
24
  ```
17
25
 
18
- ## How it loads
26
+ ## Start and manage loops
27
+
28
+ Use `/loop` to start a loop and `/loops` to inspect or stop active loops. In DoomPi, `SPC l s` opens
29
+ the start flow and `SPC l l` opens the list.
30
+
31
+ The default interval is 300 seconds. Accepted intervals range from 30 to 3600 seconds. A loop runs
32
+ its prompt once immediately, then schedules later passes.
33
+
34
+ If Pi is busy, a due pass waits for the shared agent to become idle. Multiple due signals can
35
+ coalesce rather than creating overlapping model turns. Stopping a loop prevents future passes but
36
+ does not rewind side effects from a pass already sent.
37
+
38
+ ## Lifecycle and cost
39
+
40
+ Loop state belongs to the session's `doom/loop-launchers` service; it is not a durable queue.
41
+ Replacing or shutting down the session aborts pending launches and stops active timers. Resuming a
42
+ transcript does not restart old loops.
19
43
 
20
- Doompi loads this unconditionally. It is core, not a layer, so it does not appear in
21
- `.doom/modes.yaml`: making it optional would only create broken configurations.
44
+ Every pass can start another model turn and repeat tool or external side effects. Choose
45
+ conservative intervals, make prompts idempotent where possible, and stop loops when the recurring
46
+ work is complete.
22
47
 
23
- Extension entry: `@agimon-ai/doompi-loop/extensions/pi`
48
+ ## Web extension slots
24
49
 
25
- ## Leader
50
+ The Loop Activity section declares `loop.registration` for start controls and `loop.items` for
51
+ session-scoped instance rows. Other web plugins may fill either slot; Loop owns the section shell and
52
+ renders all registered fills without requiring a feature-specific dependency.
26
53
 
27
- `SPC l s` starts a loop, `SPC l l` lists and stops them, once the extension is loaded.
54
+ ## Extension authors: cross-extension launchers
28
55
 
29
- The built-in **Default loop** asks for a prompt and an interval, runs one pass immediately,
30
- and repeats while the session is open. Other extensions can register domain-specific loop
31
- launchers alongside it.
56
+ Launcher definitions use the shared Cordis service. A consumer registers a launcher and returns its
57
+ cleanup callback. Cordis removes that launcher when either package or the session unloads, then
58
+ registers it again when the provider returns.
32
59
 
33
- ## Entry points
60
+ ```ts
61
+ import { DOOM_LOOP_LAUNCHERS_SERVICE, requireDoomLoopLaunchers } from '@agimon-ai/doompi-loop/loop-launchers';
62
+ import type { Context } from '@deepseek-ai/cordis';
34
63
 
35
- | Import |
36
- | -------------------------------------- |
37
- | `@agimon-ai/doompi-loop` |
38
- | `@agimon-ai/doompi-loop/extensions/pi` |
64
+ export function myLoopPlugin(ctx: Context): void {
65
+ ctx.inject([DOOM_LOOP_LAUNCHERS_SERVICE], (sessionContext) => {
66
+ const registration = requireDoomLoopLaunchers(sessionContext).register({
67
+ id: 'example.recurring-check',
68
+ source: '@example/doompi-recurring-check',
69
+ label: 'Recurring check',
70
+ async launch({ instanceId, signal }) {
71
+ signal.throwIfAborted();
72
+ // Start session work. The returned stop callback owns cleanup.
73
+ return { instanceId, stop: () => undefined };
74
+ },
75
+ });
76
+ return () => registration.dispose('Contributor unloaded.');
77
+ });
78
+ }
79
+ ```
80
+
81
+ Mount that plugin on the runner's shared Doom Cordis root. Loop owns the registry and default
82
+ launcher. Consumers depend only on
83
+ `@agimon-ai/doompi-loop/loop-launchers`; there is no process-global registry or
84
+ session-ID lookup API.
85
+
86
+ The package root exports the service contract
87
+ types. Normal Pi activation uses the discovered `extensions/pi` entry.
88
+
89
+ ## Development
90
+
91
+ ```bash
92
+ pnpm build
93
+ pnpm typecheck
94
+ pnpm test
95
+ pnpm lint
96
+ ```
97
+
98
+ Maintained by [Agimon](https://agimon.ai/about).
39
99
 
40
100
  ## License
41
101
 
42
102
  MIT
103
+
104
+ Pi and server entries live directly in `src/extensions/`. They declare commands, minor mode owners, and optional services. The helpers own registration and cleanup; `onDispose` clears UI state, while session service disposal stops pending launches and timers. Services live in named folders and public exports remain flat.
@@ -0,0 +1,7 @@
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
5
+ const require_apiContracts = require("./src/schemas/apiContracts.cjs");
6
+ exports.apiContracts = require_apiContracts.apiContracts;
7
+ exports.default = require_apiContracts.apiContracts;
@@ -0,0 +1,2 @@
1
+ import { apiContracts } from "./src/schemas/apiContracts.cjs";
2
+ export { apiContracts, apiContracts as default };
@@ -0,0 +1,2 @@
1
+ import { apiContracts } from "./src/schemas/apiContracts.mjs";
2
+ export { apiContracts, apiContracts as default };
@@ -0,0 +1,2 @@
1
+ import { apiContracts } from "./src/schemas/apiContracts.mjs";
2
+ export { apiContracts, apiContracts as default };
@@ -1,2 +1,36 @@
1
- var e=require("../extension.cjs").registerLoopExtension;module.exports=e;
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
5
+ const require_root_cli = require("../src/extensions/workspaces/sessions/(backend)/root.cli.cjs");
6
+ const require_loop_cli = require("../src/extensions/workspaces/sessions/(backend)/command/loop.cli.cjs");
7
+ const require_loops_cli = require("../src/extensions/workspaces/sessions/(backend)/command/loops.cli.cjs");
8
+ const require_agent_settled_cli = require("../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.cjs");
9
+ const require_doompi_use_loop_cli = require("../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.cjs");
10
+ let _agimon_ai_doompi_core_pi_extension = require("@agimon-ai/doompi-core/pi-extension");
11
+ let _agimon_ai_doompi_core_extension_file = require("@agimon-ai/doompi-core/extension-file");
12
+ //#region generated/pi.ts
13
+ const at = (value, context) => typeof value === "function" ? value(context) : value;
14
+ const extension = (0, _agimon_ai_doompi_core_pi_extension.definePiExtension)("@agimon-ai/doompi-loop", async (context) => {
15
+ const scopeSession = await require_root_cli.default(context);
16
+ const contextSession = {
17
+ ...context,
18
+ root: scopeSession.value
19
+ };
20
+ return {
21
+ ...(0, _agimon_ai_doompi_core_extension_file.composeRootHooks)(scopeSession),
22
+ get commands() {
23
+ return [at(require_loop_cli.default, contextSession), at(require_loops_cli.default, contextSession)];
24
+ },
25
+ events: { agent_settled: at(require_agent_settled_cli.default, contextSession) },
26
+ get resources() {
27
+ return [at(require_doompi_use_loop_cli.default, contextSession)];
28
+ },
29
+ services: [...scopeSession.services ?? []]
30
+ };
31
+ });
32
+ //#endregion
33
+ exports.default = extension;
34
+ exports.extension = extension;
35
+
2
36
  //# sourceMappingURL=pi.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pi.cjs","names":["registerLoopExtension"],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { registerLoopExtension } from '../extension.ts';\n\nexport default registerLoopExtension;\n"],"mappings":"AAEA,IAAA,4BAAeA,CAAAA,CAAAA"}
1
+ {"version":3,"file":"pi.cjs","names":["definePiExtension","rootSession","composeRootHooks","commandLoop","commandLoops","hookAgentSettled","resourceDoompiUseLoop"],"sources":["../../generated/pi.ts"],"sourcesContent":["// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/pi-extension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extension-file';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport commandLoop from '../src/extensions/workspaces/sessions/(backend)/command/loop.cli';\nimport commandLoops from '../src/extensions/workspaces/sessions/(backend)/command/loops.cli';\nimport hookAgentSettled from '../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli';\nimport resourceDoompiUseLoop from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof commandLoop> | OptionsOf<typeof commandLoops> | OptionsOf<typeof hookAgentSettled> | OptionsOf<typeof resourceDoompiUseLoop>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\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\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-loop', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): PiPluginContributions['commands'] { return [at(commandLoop, contextSession), at(commandLoops, contextSession)]; },\n events: {\n agent_settled: at(hookAgentSettled, contextSession) as NonNullable<PiPluginContributions['events']>['agent_settled'],\n },\n get resources(): PiPluginContributions['resources'] { return [at(resourceDoompiUseLoop, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":";;;;;;;;;;;;AAiBA,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AAEpE,MAAa,aAAA,GAAYA,oCAAAA,kBAAAA,CAAoC,0BAA0B,OAAO,YAAY;CACxG,MAAM,eAAe,MAAMC,iBAAAA,QAAY,OAAO;CAC9C,MAAM,iBAAiB;EAAE,GAAG;EAAS,MAAM,aAAa;CAAM;CAC9D,OAAO;EACL,IAAA,GAAGC,sCAAAA,iBAAAA,CAAiB,YAAY;EAChC,IAAI,WAA8C;GAAE,OAAO,CAAC,GAAGC,iBAAAA,SAAa,cAAc,GAAG,GAAGC,kBAAAA,SAAc,cAAc,CAAC;EAAG;EAChI,QAAQ,EACN,eAAe,GAAGC,0BAAAA,SAAkB,cAAc,EACpD;EACA,IAAI,YAAgD;GAAE,OAAO,CAAC,GAAGC,4BAAAA,SAAuB,cAAc,CAAC;EAAG;EAC1G,UAAU,CAAC,GAAI,aAAa,YAAY,CAAC,CAAE;CAC7C;AACF,CAAC"}
@@ -1,2 +1,5 @@
1
- import { registerLoopExtension } from "../extension.cjs";
2
- export = registerLoopExtension;
1
+ //#region generated/pi.d.ts
2
+ export declare const extension: import("@agimon-ai/doompi-core/runtime-pi-extension").DefinedPiExtension<undefined>;
3
+ //#endregion
4
+ export { extension as default };
5
+ //# sourceMappingURL=pi.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.d.cts","names":[],"sources":["../../generated/pi.ts"],"mappings":";qBAoBa,iEAAS"}
@@ -1,2 +1,5 @@
1
- import { registerLoopExtension } from "../extension.mjs";
2
- export { registerLoopExtension as default };
1
+ //#region generated/pi.d.ts
2
+ export declare const extension: import("@agimon-ai/doompi-core/runtime-pi-extension").DefinedPiExtension<undefined>;
3
+ //#endregion
4
+ export { extension as default };
5
+ //# sourceMappingURL=pi.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.d.mts","names":[],"sources":["../../generated/pi.ts"],"mappings":";qBAoBa,iEAAS"}
@@ -1,2 +1,31 @@
1
- import{registerLoopExtension as e}from"../extension.mjs";var t=e;export{t as default};
1
+ import root_cli_default from "../src/extensions/workspaces/sessions/(backend)/root.cli.mjs";
2
+ import loop_cli_default from "../src/extensions/workspaces/sessions/(backend)/command/loop.cli.mjs";
3
+ import loops_cli_default from "../src/extensions/workspaces/sessions/(backend)/command/loops.cli.mjs";
4
+ import agent_settled_cli_default from "../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.mjs";
5
+ import doompi_use_loop_cli_default from "../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.mjs";
6
+ import { definePiExtension } from "@agimon-ai/doompi-core/pi-extension";
7
+ import { composeRootHooks } from "@agimon-ai/doompi-core/extension-file";
8
+ //#region generated/pi.ts
9
+ const at = (value, context) => typeof value === "function" ? value(context) : value;
10
+ const extension = definePiExtension("@agimon-ai/doompi-loop", async (context) => {
11
+ const scopeSession = await root_cli_default(context);
12
+ const contextSession = {
13
+ ...context,
14
+ root: scopeSession.value
15
+ };
16
+ return {
17
+ ...composeRootHooks(scopeSession),
18
+ get commands() {
19
+ return [at(loop_cli_default, contextSession), at(loops_cli_default, contextSession)];
20
+ },
21
+ events: { agent_settled: at(agent_settled_cli_default, contextSession) },
22
+ get resources() {
23
+ return [at(doompi_use_loop_cli_default, contextSession)];
24
+ },
25
+ services: [...scopeSession.services ?? []]
26
+ };
27
+ });
28
+ //#endregion
29
+ export { extension as default, extension };
30
+
2
31
  //# sourceMappingURL=pi.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pi.mjs","names":[],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { registerLoopExtension } from '../extension.ts';\n\nexport default registerLoopExtension;\n"],"mappings":"yDAEA,IAAA,EAAe"}
1
+ {"version":3,"file":"pi.mjs","names":["rootSession","commandLoop","commandLoops","hookAgentSettled","resourceDoompiUseLoop"],"sources":["../../generated/pi.ts"],"sourcesContent":["// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/pi-extension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extension-file';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport commandLoop from '../src/extensions/workspaces/sessions/(backend)/command/loop.cli';\nimport commandLoops from '../src/extensions/workspaces/sessions/(backend)/command/loops.cli';\nimport hookAgentSettled from '../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli';\nimport resourceDoompiUseLoop from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof commandLoop> | OptionsOf<typeof commandLoops> | OptionsOf<typeof hookAgentSettled> | OptionsOf<typeof resourceDoompiUseLoop>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\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\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-loop', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): PiPluginContributions['commands'] { return [at(commandLoop, contextSession), at(commandLoops, contextSession)]; },\n events: {\n agent_settled: at(hookAgentSettled, contextSession) as NonNullable<PiPluginContributions['events']>['agent_settled'],\n },\n get resources(): PiPluginContributions['resources'] { return [at(resourceDoompiUseLoop, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":";;;;;;;;AAiBA,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AAEpE,MAAa,YAAY,kBAAoC,0BAA0B,OAAO,YAAY;CACxG,MAAM,eAAe,MAAMA,iBAAY,OAAO;CAC9C,MAAM,iBAAiB;EAAE,GAAG;EAAS,MAAM,aAAa;CAAM;CAC9D,OAAO;EACL,GAAG,iBAAiB,YAAY;EAChC,IAAI,WAA8C;GAAE,OAAO,CAAC,GAAGC,kBAAa,cAAc,GAAG,GAAGC,mBAAc,cAAc,CAAC;EAAG;EAChI,QAAQ,EACN,eAAe,GAAGC,2BAAkB,cAAc,EACpD;EACA,IAAI,YAAgD;GAAE,OAAO,CAAC,GAAGC,6BAAuB,cAAc,CAAC;EAAG;EAC1G,UAAU,CAAC,GAAI,aAAa,YAAY,CAAC,CAAE;CAC7C;AACF,CAAC"}
@@ -0,0 +1,51 @@
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
5
+ const require_root_server = require("../src/extensions/workspaces/sessions/(backend)/root.server.cjs");
6
+ const require_loop_server = require("../src/extensions/workspaces/sessions/(backend)/command/loop.server.cjs");
7
+ const require_loops_server = require("../src/extensions/workspaces/sessions/(backend)/command/loops.server.cjs");
8
+ const require_session_shutdown_server = require("../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.cjs");
9
+ const require_session_start_server = require("../src/extensions/workspaces/sessions/(backend)/hook/session-start.server.cjs");
10
+ const require_doompi_use_loop_server = require("../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.cjs");
11
+ let _agimon_ai_doompi_core_extension_file = require("@agimon-ai/doompi-core/extension-file");
12
+ let _agimon_ai_doompi_core_server_facet = require("@agimon-ai/doompi-core/server-facet");
13
+ //#region generated/server.ts
14
+ const at = (value, context) => typeof value === "function" ? value(context) : value;
15
+ /* v8 ignore next -- generated normalization branch */
16
+ const defined = (values) => values.filter((value) => value !== void 0);
17
+ const via = (identity, value) => ({
18
+ ...identity,
19
+ ...value
20
+ });
21
+ const facet = (0, _agimon_ai_doompi_core_server_facet.defineServerPlugin)({
22
+ name: "@agimon-ai/doompi-loop",
23
+ session: async (context) => {
24
+ const scopeSession = await require_root_server.default(context);
25
+ const contextSession = {
26
+ ...context,
27
+ root: scopeSession.value
28
+ };
29
+ return {
30
+ ...(0, _agimon_ai_doompi_core_extension_file.composeRootHooks)(scopeSession),
31
+ get commands() {
32
+ return defined([via({ name: "loop" }, at(require_loop_server.default, contextSession)), via({ name: "loops" }, at(require_loops_server.default, contextSession))]);
33
+ },
34
+ get hooks() {
35
+ return defined([via({ event: "session_shutdown" }, at(require_session_shutdown_server.default, contextSession)), via({ event: "session_start" }, at(require_session_start_server.default, contextSession))]);
36
+ },
37
+ get resources() {
38
+ return defined([at(require_doompi_use_loop_server.default, contextSession)]);
39
+ },
40
+ services: [...scopeSession.services ?? []],
41
+ get activities() {
42
+ return [...scopeSession.activities ?? []];
43
+ }
44
+ };
45
+ }
46
+ });
47
+ //#endregion
48
+ exports.default = facet;
49
+ exports.facet = facet;
50
+
51
+ //# sourceMappingURL=server.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.cjs","names":["defineServerPlugin","rootSession","composeRootHooks","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,SAAA,GAAQA,oCAAAA,mBAAAA,CAAmB;CACtC,MAAM;CACN,SAAS,OAAO,YAAY;EAC1B,MAAM,eAAe,MAAMC,oBAAAA,QAAY,OAAO;EAC9C,MAAM,iBAAiB;GAAE,GAAG;GAAS,MAAM,aAAa;EAAM;EAC9D,OAAO;GACL,IAAA,GAAGC,sCAAAA,iBAAAA,CAAiB,YAAY;GAChC,IAAI,WAAgD;IAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,GAAG,GAAGC,oBAAAA,SAAa,cAAc,CAAC,GAAG,IAAI,EAAE,MAAM,QAAQ,GAAG,GAAGC,qBAAAA,SAAc,cAAc,CAAC,CAAC,CAAC;GAAG;GAC1L,IAAI,QAA0C;IAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,OAAO,mBAAmB,GAAG,GAAGC,gCAAAA,SAAqB,cAAc,CAAC,GAAG,IAAI,EAAE,OAAO,gBAAgB,GAAG,GAAGC,6BAAAA,SAAkB,cAAc,CAAC,CAAC,CAAC;GAAG;GACtN,IAAI,YAAkD;IAAE,OAAO,QAAQ,CAAC,GAAGC,+BAAAA,SAAuB,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"}
@@ -0,0 +1,5 @@
1
+ //#region generated/server.d.ts
2
+ export declare const facet: import("@agimon-ai/doompi-core/server-facet").DoomServerFacet;
3
+ //#endregion
4
+ export { facet as default };
5
+ //# sourceMappingURL=server.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.cts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAmBa,qDAAK"}
@@ -0,0 +1,5 @@
1
+ //#region generated/server.d.ts
2
+ export declare const facet: import("@agimon-ai/doompi-core/server-facet").DoomServerFacet;
3
+ //#endregion
4
+ export { facet as default };
5
+ //# sourceMappingURL=server.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.mts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAmBa,qDAAK"}
@@ -0,0 +1,46 @@
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";
9
+ //#region generated/server.ts
10
+ const at = (value, context) => typeof value === "function" ? value(context) : value;
11
+ /* v8 ignore next -- generated normalization branch */
12
+ const defined = (values) => values.filter((value) => value !== void 0);
13
+ const via = (identity, value) => ({
14
+ ...identity,
15
+ ...value
16
+ });
17
+ const facet = defineServerPlugin({
18
+ name: "@agimon-ai/doompi-loop",
19
+ session: async (context) => {
20
+ const scopeSession = await root_server_default(context);
21
+ const contextSession = {
22
+ ...context,
23
+ root: scopeSession.value
24
+ };
25
+ return {
26
+ ...composeRootHooks(scopeSession),
27
+ get commands() {
28
+ return defined([via({ name: "loop" }, at(loop_server_default, contextSession)), via({ name: "loops" }, at(loops_server_default, contextSession))]);
29
+ },
30
+ get hooks() {
31
+ return defined([via({ event: "session_shutdown" }, at(session_shutdown_server_default, contextSession)), via({ event: "session_start" }, at(session_start_server_default, contextSession))]);
32
+ },
33
+ get resources() {
34
+ return defined([at(doompi_use_loop_server_default, contextSession)]);
35
+ },
36
+ services: [...scopeSession.services ?? []],
37
+ get activities() {
38
+ return [...scopeSession.activities ?? []];
39
+ }
40
+ };
41
+ }
42
+ });
43
+ //#endregion
44
+ export { facet as default, facet };
45
+
46
+ //# sourceMappingURL=server.mjs.map
@@ -0,0 +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"}
@@ -0,0 +1,228 @@
1
+ import { defineActivityGroup, defineFill, defineLeaderBinding, defineMinorModeFile, defineSlotFile, defineWebPlugin } from "@agimon-ai/doompi-core/web";
2
+ import { Button, Dot } from "@agimon-ai/doompi-web-components";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/types/loopView.ts
5
+ /** The browser-only status that carries active Loop instances into the activity dock. */
6
+ const LOOP_VIEW_STATUS_KEY = "doom-loop-instances";
7
+ const ANSI = new RegExp(String.raw`\u001b\[[0-9;]*m`, "gu");
8
+ function isRecord(value) {
9
+ return typeof value === "object" && value !== null && !Array.isArray(value);
10
+ }
11
+ function isState(value) {
12
+ return value === "starting" || value === "running" || value === "stopping";
13
+ }
14
+ /** Reads a Loop status without letting malformed session data crash the activity dock. */
15
+ function parseLoopStatusView(raw) {
16
+ if (raw === void 0) return void 0;
17
+ const text = raw.replace(ANSI, "").trim();
18
+ if (text === "") return void 0;
19
+ try {
20
+ const value = JSON.parse(text);
21
+ if (!Array.isArray(value) || value.length === 0) return void 0;
22
+ const items = [];
23
+ for (const item of value) {
24
+ if (!isRecord(item) || typeof item.instanceId !== "string" || item.instanceId.trim() === "" || typeof item.label !== "string" || item.label.trim() === "" || typeof item.detail !== "string" || !isState(item.state)) return;
25
+ items.push({
26
+ instanceId: item.instanceId,
27
+ label: item.label,
28
+ detail: item.detail,
29
+ state: item.state
30
+ });
31
+ }
32
+ return items;
33
+ } catch {
34
+ return;
35
+ }
36
+ }
37
+ //#endregion
38
+ //#region src/extensions/workspaces/sessions/(frontend)/activity-group/loops.web.ts
39
+ var loops_web_default = defineActivityGroup({
40
+ keys: "l l",
41
+ statusKey: LOOP_VIEW_STATUS_KEY,
42
+ order: 40
43
+ });
44
+ //#endregion
45
+ //#region src/extensions/workspaces/sessions/(frontend)/fill/_components/LoopsActivitySection.tsx
46
+ const MANAGE_COMMAND = "/loops";
47
+ const DEFAULT_LOOP_COMMAND = "/loop doompi.default";
48
+ /** Starts the built-in prompt loop without opening a generic launcher chooser. */
49
+ function DefaultLoopLauncher({ sessionId, sendSessionFrame }) {
50
+ return /* @__PURE__ */ jsx(Button, {
51
+ variant: "subtle",
52
+ size: "xs",
53
+ "data-testid": "activity-loop-default-launch",
54
+ "aria-label": "launch default loop",
55
+ disabled: sessionId === null,
56
+ onClick: () => {
57
+ if (sessionId === null) return;
58
+ sendSessionFrame(sessionId, {
59
+ type: "prompt",
60
+ message: DEFAULT_LOOP_COMMAND
61
+ });
62
+ },
63
+ className: "text-2xs font-bold",
64
+ children: "default loop"
65
+ });
66
+ }
67
+ function toneOf(state) {
68
+ if (state === "running") return "green";
69
+ if (state === "stopping") return "orange";
70
+ return "yellow";
71
+ }
72
+ /** Renders active recurring prompts contributed to the Loop activity section. */
73
+ function LoopActivityItems({ statuses }) {
74
+ const raw = statuses[LOOP_VIEW_STATUS_KEY];
75
+ const loops = parseLoopStatusView(raw);
76
+ const unavailable = raw !== void 0 && raw.trim() !== "" && loops === void 0;
77
+ if (!loops && !unavailable) return null;
78
+ return loops ? /* @__PURE__ */ jsx("ul", {
79
+ "aria-label": "active loops",
80
+ className: "flex flex-col gap-1",
81
+ children: loops.map((loop) => /* @__PURE__ */ jsxs("li", {
82
+ "data-testid": `activity-loop-${loop.instanceId}`,
83
+ "data-loop-state": loop.state,
84
+ title: `${loop.label}: ${loop.detail}`,
85
+ className: "flex min-w-0 flex-col gap-0.5 px-1 py-0.5",
86
+ children: [/* @__PURE__ */ jsxs("span", {
87
+ className: "flex min-w-0 items-center gap-1.5",
88
+ children: [
89
+ /* @__PURE__ */ jsx(Dot, {
90
+ tone: toneOf(loop.state),
91
+ pulse: loop.state !== "running"
92
+ }),
93
+ /* @__PURE__ */ jsx("span", {
94
+ className: "min-w-0 flex-1 truncate text-xs font-bold text-doom-hi",
95
+ children: loop.label
96
+ }),
97
+ /* @__PURE__ */ jsx("span", {
98
+ className: "shrink-0 text-2xs text-doom-faint",
99
+ children: loop.state
100
+ })
101
+ ]
102
+ }), /* @__PURE__ */ jsx("span", {
103
+ className: "truncate pl-3 text-2xs text-doom-faint",
104
+ children: loop.detail
105
+ })]
106
+ }, loop.instanceId))
107
+ }) : /* @__PURE__ */ jsx("p", {
108
+ className: "px-1 text-xs text-doom-faint",
109
+ children: "loop status unavailable"
110
+ });
111
+ }
112
+ /** Idle-safe Loop activity shell with extension registration and instance slots. */
113
+ function LoopsActivitySection({ sessionId, renderSlot, sendSessionFrame }) {
114
+ return /* @__PURE__ */ jsxs("div", {
115
+ "data-testid": "activity-loop-instances",
116
+ className: "flex flex-col gap-2",
117
+ children: [
118
+ /* @__PURE__ */ jsxs("div", {
119
+ className: "flex flex-wrap items-center gap-1",
120
+ children: [/* @__PURE__ */ jsx(DefaultLoopLauncher, {
121
+ sessionId,
122
+ sendSessionFrame
123
+ }), renderSlot("loop.registration")]
124
+ }),
125
+ renderSlot("loop.items"),
126
+ /* @__PURE__ */ jsx(Button, {
127
+ variant: "subtle",
128
+ size: "xs",
129
+ "data-testid": "activity-loops-manage",
130
+ "aria-label": "manage loops",
131
+ disabled: sessionId === null,
132
+ onClick: () => {
133
+ if (sessionId === null) return;
134
+ sendSessionFrame(sessionId, {
135
+ type: "prompt",
136
+ message: MANAGE_COMMAND
137
+ });
138
+ },
139
+ className: "self-end text-2xs font-bold",
140
+ children: "manage"
141
+ })
142
+ ]
143
+ });
144
+ }
145
+ //#endregion
146
+ //#region src/extensions/workspaces/sessions/(frontend)/fill/Instances.loop.items.web.tsx
147
+ var Instances_loop_items_web_default = defineFill({ component: LoopActivityItems });
148
+ //#endregion
149
+ //#region src/extensions/workspaces/sessions/(frontend)/fill/Loops.activity.loops.web.tsx
150
+ var Loops_activity_loops_web_default = defineFill({ component: LoopsActivitySection });
151
+ //#endregion
152
+ //#region src/extensions/workspaces/sessions/(frontend)/leader/list.web.ts
153
+ var list_web_default = defineLeaderBinding({
154
+ path: [{
155
+ key: "l",
156
+ label: "loops",
157
+ detail: "recurring prompt loops"
158
+ }, {
159
+ key: "l",
160
+ label: "list",
161
+ detail: "loops in this session"
162
+ }],
163
+ command: "loops"
164
+ });
165
+ //#endregion
166
+ //#region src/extensions/workspaces/sessions/(frontend)/leader/start.web.ts
167
+ var start_web_default = defineLeaderBinding({
168
+ path: [{
169
+ key: "l",
170
+ label: "loops",
171
+ detail: "recurring prompt loops"
172
+ }, {
173
+ key: "s",
174
+ label: "start",
175
+ detail: "begin a recurring loop"
176
+ }],
177
+ command: "loop"
178
+ });
179
+ //#endregion
180
+ //#region src/extensions/workspaces/sessions/(frontend)/mode/loop/mode.web.ts
181
+ var mode_web_default = defineMinorModeFile({
182
+ keys: "l l",
183
+ statusKey: "doom-loop",
184
+ activityGroup: "loops",
185
+ order: 30
186
+ });
187
+ //#endregion
188
+ //#region src/extensions/workspaces/sessions/(frontend)/slot/items.web.ts
189
+ var items_web_default = defineSlotFile({});
190
+ //#endregion
191
+ //#region src/extensions/workspaces/sessions/(frontend)/slot/registration.web.ts
192
+ var registration_web_default = defineSlotFile({});
193
+ //#endregion
194
+ //#region generated/web.ts
195
+ const via = (identity, value) => ({
196
+ ...identity,
197
+ ...value
198
+ });
199
+ const webPlugin = defineWebPlugin({
200
+ id: "loop",
201
+ session: {
202
+ get activityGroups() {
203
+ return [via({ name: "loops" }, loops_web_default)];
204
+ },
205
+ get fills() {
206
+ return [via({
207
+ slot: "loop.items",
208
+ id: "instances"
209
+ }, Instances_loop_items_web_default), via({
210
+ slot: "activity.loops",
211
+ id: "loops"
212
+ }, Loops_activity_loops_web_default)];
213
+ },
214
+ get leaderBindings() {
215
+ return [via({ id: "loop.list" }, list_web_default), via({ id: "loop.start" }, start_web_default)];
216
+ },
217
+ get minorModes() {
218
+ return [via({ name: "loop" }, mode_web_default)];
219
+ },
220
+ get slots() {
221
+ return [via({ slot: "loop.items" }, items_web_default), via({ slot: "loop.registration" }, registration_web_default)];
222
+ }
223
+ }
224
+ });
225
+ //#endregion
226
+ export { webPlugin };
227
+
228
+ //# sourceMappingURL=web.mjs.map