@agimon-ai/doompi-loop 0.0.1-alpha.8 → 0.0.1-alpha.81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -21
- package/dist/api-contracts.cjs +7 -0
- package/dist/api-contracts.d.cts +2 -0
- package/dist/api-contracts.d.mts +2 -0
- package/dist/api-contracts.mjs +2 -0
- package/dist/extensions/pi.cjs +35 -1
- package/dist/extensions/pi.cjs.map +1 -1
- package/dist/extensions/pi.d.cts +5 -2
- package/dist/extensions/pi.d.cts.map +1 -0
- package/dist/extensions/pi.d.mts +5 -2
- package/dist/extensions/pi.d.mts.map +1 -0
- package/dist/extensions/pi.mjs +30 -1
- package/dist/extensions/pi.mjs.map +1 -1
- package/dist/extensions/server.cjs +51 -0
- package/dist/extensions/server.cjs.map +1 -0
- package/dist/extensions/server.d.cts +5 -0
- package/dist/extensions/server.d.cts.map +1 -0
- package/dist/extensions/server.d.mts +5 -0
- package/dist/extensions/server.d.mts.map +1 -0
- package/dist/extensions/server.mjs +46 -0
- package/dist/extensions/server.mjs.map +1 -0
- package/dist/extensions/web.mjs +228 -0
- package/dist/extensions/web.mjs.map +1 -0
- package/dist/index.cjs +0 -1
- package/dist/index.d.cts +2 -4
- package/dist/index.d.mts +2 -4
- package/dist/index.mjs +1 -1
- package/dist/loopLaunchers.cjs +5 -0
- package/dist/loopLaunchers.d.cts +2 -0
- package/dist/loopLaunchers.d.mts +2 -0
- package/dist/loopLaunchers.mjs +2 -0
- package/dist/src/constants/loop.cjs +12 -0
- package/dist/src/constants/loop.cjs.map +1 -0
- package/dist/src/constants/loop.mjs +9 -0
- package/dist/src/constants/loop.mjs.map +1 -0
- package/dist/src/constants/piLoop.cjs +16 -0
- package/dist/src/constants/piLoop.cjs.map +1 -0
- package/dist/src/constants/piLoop.mjs +11 -0
- package/dist/src/constants/piLoop.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.cli.cjs +26 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.cli.mjs +26 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.cjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.cli.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.cli.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.server.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.cli.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.cli.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.server.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.server.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs +14 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs +15 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs +17 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs +18 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs.map +1 -0
- package/dist/src/schemas/apiContracts.cjs +13 -0
- package/dist/src/schemas/apiContracts.cjs.map +1 -0
- package/dist/src/schemas/apiContracts.d.cts +53 -0
- package/dist/src/schemas/apiContracts.d.cts.map +1 -0
- package/dist/src/schemas/apiContracts.d.mts +53 -0
- package/dist/src/schemas/apiContracts.d.mts.map +1 -0
- package/dist/src/schemas/apiContracts.mjs +13 -0
- package/dist/src/schemas/apiContracts.mjs.map +1 -0
- package/dist/src/schemas/loopLaunchers.cjs +17 -0
- package/dist/src/schemas/loopLaunchers.cjs.map +1 -0
- package/dist/src/schemas/loopLaunchers.d.cts +60 -0
- package/dist/src/schemas/loopLaunchers.d.cts.map +1 -0
- package/dist/src/schemas/loopLaunchers.d.mts +60 -0
- package/dist/src/schemas/loopLaunchers.d.mts.map +1 -0
- package/dist/src/schemas/loopLaunchers.mjs +15 -0
- package/dist/src/schemas/loopLaunchers.mjs.map +1 -0
- package/dist/src/services/defaultLoopLauncher/index.cjs +92 -0
- package/dist/src/services/defaultLoopLauncher/index.cjs.map +1 -0
- package/dist/src/services/defaultLoopLauncher/index.mjs +92 -0
- package/dist/src/services/defaultLoopLauncher/index.mjs.map +1 -0
- package/dist/src/services/loopCommand/index.cjs +15 -0
- package/dist/src/services/loopCommand/index.cjs.map +1 -0
- package/dist/src/services/loopCommand/index.mjs +15 -0
- package/dist/src/services/loopCommand/index.mjs.map +1 -0
- package/dist/src/services/loopLaunchers/index.cjs +180 -0
- package/dist/src/services/loopLaunchers/index.cjs.map +1 -0
- package/dist/src/services/loopLaunchers/index.mjs +180 -0
- package/dist/src/services/loopLaunchers/index.mjs.map +1 -0
- package/dist/src/services/serverRuntime/index.cjs +293 -0
- package/dist/src/services/serverRuntime/index.cjs.map +1 -0
- package/dist/src/services/serverRuntime/index.mjs +293 -0
- package/dist/src/services/serverRuntime/index.mjs.map +1 -0
- package/dist/src/tui/leader.cjs +36 -0
- package/dist/src/tui/leader.cjs.map +1 -0
- package/dist/src/tui/leader.mjs +36 -0
- package/dist/src/tui/leader.mjs.map +1 -0
- package/dist/src/tui/loopListOverlay.cjs +101 -0
- package/dist/src/tui/loopListOverlay.cjs.map +1 -0
- package/dist/src/tui/loopListOverlay.mjs +100 -0
- package/dist/src/tui/loopListOverlay.mjs.map +1 -0
- package/dist/src/tui/loopRuntime.cjs +256 -0
- package/dist/src/tui/loopRuntime.cjs.map +1 -0
- package/dist/src/tui/loopRuntime.mjs +256 -0
- package/dist/src/tui/loopRuntime.mjs.map +1 -0
- package/dist/src/tui/startLoopOverlay.cjs +71 -0
- package/dist/src/tui/startLoopOverlay.cjs.map +1 -0
- package/dist/src/tui/startLoopOverlay.mjs +70 -0
- package/dist/src/tui/startLoopOverlay.mjs.map +1 -0
- package/dist/src/types/loopView.cjs +19 -0
- package/dist/src/types/loopView.cjs.map +1 -0
- package/dist/src/types/loopView.mjs +18 -0
- package/dist/src/types/loopView.mjs.map +1 -0
- package/llms.txt +9 -0
- package/package.json +79 -14
- package/src/prompts/doompi-use-loop/SKILL.md +24 -0
- package/src/types/loopView.ts +73 -0
- package/dist/commands/loopCommand.cjs +0 -2
- package/dist/commands/loopCommand.cjs.map +0 -1
- package/dist/commands/loopCommand.mjs +0 -2
- package/dist/commands/loopCommand.mjs.map +0 -1
- package/dist/constants.cjs +0 -2
- package/dist/constants.cjs.map +0 -1
- package/dist/constants.mjs +0 -2
- package/dist/constants.mjs.map +0 -1
- package/dist/defaultLauncher.cjs +0 -2
- package/dist/defaultLauncher.cjs.map +0 -1
- package/dist/defaultLauncher.d.cts +0 -10
- package/dist/defaultLauncher.d.cts.map +0 -1
- package/dist/defaultLauncher.d.mts +0 -10
- package/dist/defaultLauncher.d.mts.map +0 -1
- package/dist/defaultLauncher.mjs +0 -2
- package/dist/defaultLauncher.mjs.map +0 -1
- package/dist/extension.cjs +0 -2
- package/dist/extension.cjs.map +0 -1
- package/dist/extension.d.cts +0 -6
- package/dist/extension.d.cts.map +0 -1
- package/dist/extension.d.mts +0 -6
- package/dist/extension.d.mts.map +0 -1
- package/dist/extension.mjs +0 -2
- package/dist/extension.mjs.map +0 -1
- package/dist/launcher.cjs +0 -2
- package/dist/launcher.cjs.map +0 -1
- package/dist/launcher.d.cts +0 -47
- package/dist/launcher.d.cts.map +0 -1
- package/dist/launcher.d.mts +0 -47
- package/dist/launcher.d.mts.map +0 -1
- package/dist/launcher.mjs +0 -2
- package/dist/launcher.mjs.map +0 -1
- package/dist/leader.cjs +0 -2
- package/dist/leader.cjs.map +0 -1
- package/dist/leader.mjs +0 -2
- package/dist/leader.mjs.map +0 -1
- package/dist/tui/loopListOverlay.cjs +0 -2
- package/dist/tui/loopListOverlay.cjs.map +0 -1
- package/dist/tui/loopListOverlay.mjs +0 -2
- package/dist/tui/loopListOverlay.mjs.map +0 -1
- package/dist/tui/startLoopOverlay.cjs +0 -2
- package/dist/tui/startLoopOverlay.cjs.map +0 -1
- package/dist/tui/startLoopOverlay.mjs +0 -2
- 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
|
-
|
|
3
|
+
Send a prompt now, then repeat it at a bounded interval for the current session.
|
|
4
4
|
|
|
5
|
-
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
23
|
+
pi install npm:@agimon-ai/doompi-loop
|
|
16
24
|
```
|
|
17
25
|
|
|
18
|
-
##
|
|
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
|
-
|
|
21
|
-
|
|
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
|
-
|
|
48
|
+
## Web extension slots
|
|
24
49
|
|
|
25
|
-
|
|
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
|
-
|
|
54
|
+
## Extension authors: cross-extension launchers
|
|
28
55
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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;
|
package/dist/extensions/pi.cjs
CHANGED
|
@@ -1,2 +1,36 @@
|
|
|
1
|
-
|
|
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":["
|
|
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"}
|
package/dist/extensions/pi.d.cts
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
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"}
|
package/dist/extensions/pi.d.mts
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
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"}
|
package/dist/extensions/pi.mjs
CHANGED
|
@@ -1,2 +1,31 @@
|
|
|
1
|
-
import
|
|
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":["../../
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.cts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAmBa,qDAAK"}
|
|
@@ -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
|