@agimon-ai/doompi-loop 0.0.1-alpha.74 → 0.0.1-alpha.76
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/package.json +6 -6
- package/dist/api-contracts.cjs +0 -7
- package/dist/api-contracts.d.cts +0 -2
- package/dist/api-contracts.d.mts +0 -2
- package/dist/api-contracts.mjs +0 -2
- package/dist/extensions/pi.cjs +0 -36
- package/dist/extensions/pi.cjs.map +0 -1
- package/dist/extensions/pi.d.cts +0 -5
- package/dist/extensions/pi.d.cts.map +0 -1
- package/dist/extensions/pi.d.mts +0 -5
- package/dist/extensions/pi.d.mts.map +0 -1
- package/dist/extensions/pi.mjs +0 -31
- package/dist/extensions/pi.mjs.map +0 -1
- package/dist/extensions/server.cjs +0 -51
- package/dist/extensions/server.cjs.map +0 -1
- package/dist/extensions/server.d.cts +0 -5
- package/dist/extensions/server.d.cts.map +0 -1
- package/dist/extensions/server.d.mts +0 -5
- package/dist/extensions/server.d.mts.map +0 -1
- package/dist/extensions/server.mjs +0 -46
- package/dist/extensions/server.mjs.map +0 -1
- package/dist/extensions/web.mjs +0 -228
- package/dist/extensions/web.mjs.map +0 -1
- package/dist/index.cjs +0 -0
- package/dist/index.d.cts +0 -2
- package/dist/index.d.mts +0 -2
- package/dist/index.mjs +0 -1
- package/dist/loopLaunchers.cjs +0 -5
- package/dist/loopLaunchers.d.cts +0 -2
- package/dist/loopLaunchers.d.mts +0 -2
- package/dist/loopLaunchers.mjs +0 -2
- package/dist/src/constants/loop.cjs +0 -12
- package/dist/src/constants/loop.cjs.map +0 -1
- package/dist/src/constants/loop.mjs +0 -9
- package/dist/src/constants/loop.mjs.map +0 -1
- package/dist/src/constants/piLoop.cjs +0 -16
- package/dist/src/constants/piLoop.cjs.map +0 -1
- package/dist/src/constants/piLoop.mjs +0 -11
- package/dist/src/constants/piLoop.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.cli.cjs +0 -26
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.cli.mjs +0 -26
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.cjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.mjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.cli.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.cli.mjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.server.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.server.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.server.mjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loop.server.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.cli.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.cli.mjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.server.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.server.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.server.mjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/command/loops.server.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.mjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.mjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.server.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.server.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.server.mjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.server.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.mjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.mjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs +0 -14
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs +0 -15
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs +0 -17
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs +0 -18
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs.map +0 -1
- package/dist/src/schemas/apiContracts.cjs +0 -13
- package/dist/src/schemas/apiContracts.cjs.map +0 -1
- package/dist/src/schemas/apiContracts.d.cts +0 -53
- package/dist/src/schemas/apiContracts.d.cts.map +0 -1
- package/dist/src/schemas/apiContracts.d.mts +0 -53
- package/dist/src/schemas/apiContracts.d.mts.map +0 -1
- package/dist/src/schemas/apiContracts.mjs +0 -13
- package/dist/src/schemas/apiContracts.mjs.map +0 -1
- package/dist/src/schemas/loopLaunchers.cjs +0 -17
- package/dist/src/schemas/loopLaunchers.cjs.map +0 -1
- package/dist/src/schemas/loopLaunchers.d.cts +0 -60
- package/dist/src/schemas/loopLaunchers.d.cts.map +0 -1
- package/dist/src/schemas/loopLaunchers.d.mts +0 -60
- package/dist/src/schemas/loopLaunchers.d.mts.map +0 -1
- package/dist/src/schemas/loopLaunchers.mjs +0 -15
- package/dist/src/schemas/loopLaunchers.mjs.map +0 -1
- package/dist/src/services/defaultLoopLauncher/index.cjs +0 -92
- package/dist/src/services/defaultLoopLauncher/index.cjs.map +0 -1
- package/dist/src/services/defaultLoopLauncher/index.mjs +0 -92
- package/dist/src/services/defaultLoopLauncher/index.mjs.map +0 -1
- package/dist/src/services/loopCommand/index.cjs +0 -15
- package/dist/src/services/loopCommand/index.cjs.map +0 -1
- package/dist/src/services/loopCommand/index.mjs +0 -15
- package/dist/src/services/loopCommand/index.mjs.map +0 -1
- package/dist/src/services/loopLaunchers/index.cjs +0 -180
- package/dist/src/services/loopLaunchers/index.cjs.map +0 -1
- package/dist/src/services/loopLaunchers/index.mjs +0 -180
- package/dist/src/services/loopLaunchers/index.mjs.map +0 -1
- package/dist/src/services/serverRuntime/index.cjs +0 -293
- package/dist/src/services/serverRuntime/index.cjs.map +0 -1
- package/dist/src/services/serverRuntime/index.mjs +0 -293
- package/dist/src/services/serverRuntime/index.mjs.map +0 -1
- package/dist/src/tui/leader.cjs +0 -36
- package/dist/src/tui/leader.cjs.map +0 -1
- package/dist/src/tui/leader.mjs +0 -36
- package/dist/src/tui/leader.mjs.map +0 -1
- package/dist/src/tui/loopListOverlay.cjs +0 -101
- package/dist/src/tui/loopListOverlay.cjs.map +0 -1
- package/dist/src/tui/loopListOverlay.mjs +0 -100
- package/dist/src/tui/loopListOverlay.mjs.map +0 -1
- package/dist/src/tui/loopRuntime.cjs +0 -256
- package/dist/src/tui/loopRuntime.cjs.map +0 -1
- package/dist/src/tui/loopRuntime.mjs +0 -256
- package/dist/src/tui/loopRuntime.mjs.map +0 -1
- package/dist/src/tui/startLoopOverlay.cjs +0 -71
- package/dist/src/tui/startLoopOverlay.cjs.map +0 -1
- package/dist/src/tui/startLoopOverlay.mjs +0 -70
- package/dist/src/tui/startLoopOverlay.mjs.map +0 -1
- package/dist/src/types/loopView.cjs +0 -19
- package/dist/src/types/loopView.cjs.map +0 -1
- package/dist/src/types/loopView.mjs +0 -18
- package/dist/src/types/loopView.mjs.map +0 -1
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
//#region src/schemas/apiContracts.d.ts
|
|
2
|
-
/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
|
|
3
|
-
export declare const apiContracts: {
|
|
4
|
-
version: 1;
|
|
5
|
-
protocols?: Record<string, string> | undefined;
|
|
6
|
-
schemas?: Record<string, boolean | object> | undefined;
|
|
7
|
-
http: {
|
|
8
|
-
id: string;
|
|
9
|
-
scope: "global" | "session" | "workspace";
|
|
10
|
-
basePath?: string | undefined;
|
|
11
|
-
path: string;
|
|
12
|
-
method: "DELETE" | "GET" | "HEAD" | "OPTIONS" | "PATCH" | "POST" | "PUT";
|
|
13
|
-
description: string;
|
|
14
|
-
availability?: string | undefined;
|
|
15
|
-
authentication: "device" | "none" | "owner";
|
|
16
|
-
parameters?: {
|
|
17
|
-
name: string;
|
|
18
|
-
in: "header" | "path" | "query";
|
|
19
|
-
required: boolean;
|
|
20
|
-
schema: boolean | object;
|
|
21
|
-
}[] | undefined;
|
|
22
|
-
body?: {
|
|
23
|
-
contentType: string;
|
|
24
|
-
contentTypes?: string[] | undefined;
|
|
25
|
-
required: boolean;
|
|
26
|
-
schema: boolean | object;
|
|
27
|
-
} | undefined;
|
|
28
|
-
responses: Record<string, {
|
|
29
|
-
description: string;
|
|
30
|
-
contentType?: string | undefined;
|
|
31
|
-
schema?: boolean | object | undefined;
|
|
32
|
-
events?: Record<string, boolean | object> | undefined;
|
|
33
|
-
}>;
|
|
34
|
-
}[];
|
|
35
|
-
sockets: {
|
|
36
|
-
id: string;
|
|
37
|
-
scope: "global" | "session" | "workspace";
|
|
38
|
-
description: string;
|
|
39
|
-
availability?: string | undefined;
|
|
40
|
-
service: string;
|
|
41
|
-
member: string;
|
|
42
|
-
direction: "client-to-server" | "server-to-client";
|
|
43
|
-
kind: "channel" | "method" | "state";
|
|
44
|
-
input: boolean | object;
|
|
45
|
-
output?: boolean | object | undefined;
|
|
46
|
-
errors?: boolean | object | undefined;
|
|
47
|
-
}[];
|
|
48
|
-
dynamic: string[];
|
|
49
|
-
gaps?: string[] | undefined;
|
|
50
|
-
};
|
|
51
|
-
//#endregion
|
|
52
|
-
export { apiContracts as default };
|
|
53
|
-
//# sourceMappingURL=apiContracts.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../../../src/schemas/apiContracts.ts"],"mappings":";;qBAGa"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { defineApiContract } from "@agimon-ai/doompi-core/api-contracts";
|
|
2
|
-
//#region src/schemas/apiContracts.ts
|
|
3
|
-
/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
|
|
4
|
-
const apiContracts = defineApiContract({
|
|
5
|
-
version: 1,
|
|
6
|
-
http: [],
|
|
7
|
-
sockets: [],
|
|
8
|
-
dynamic: []
|
|
9
|
-
});
|
|
10
|
-
//#endregion
|
|
11
|
-
export { apiContracts, apiContracts as default };
|
|
12
|
-
|
|
13
|
-
//# sourceMappingURL=apiContracts.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"apiContracts.mjs","names":[],"sources":["../../../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/doompi-core/api-contracts';\n\n/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */\nexport const apiContracts = defineApiContract({ version: 1, http: [], sockets: [], dynamic: [] });\nexport default apiContracts;\n"],"mappings":";;;AAGA,MAAa,eAAe,kBAAkB;CAAE,SAAS;CAAG,MAAM,CAAC;CAAG,SAAS,CAAC;CAAG,SAAS,CAAC;AAAE,CAAC"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
//#region src/schemas/loopLaunchers.ts
|
|
2
|
-
/** Provider-owned Cordis service for session-scoped recurring-loop launchers. */
|
|
3
|
-
const DOOM_LOOP_LAUNCHERS_SERVICE = "doom/loop-launchers";
|
|
4
|
-
function readDoomLoopLaunchers(context) {
|
|
5
|
-
return context.get(DOOM_LOOP_LAUNCHERS_SERVICE);
|
|
6
|
-
}
|
|
7
|
-
function requireDoomLoopLaunchers(context) {
|
|
8
|
-
const service = readDoomLoopLaunchers(context);
|
|
9
|
-
if (!service) throw new Error("Doom loop launchers are unavailable. Load @agimon-ai/doompi-loop.");
|
|
10
|
-
return service;
|
|
11
|
-
}
|
|
12
|
-
//#endregion
|
|
13
|
-
exports.DOOM_LOOP_LAUNCHERS_SERVICE = DOOM_LOOP_LAUNCHERS_SERVICE;
|
|
14
|
-
exports.readDoomLoopLaunchers = readDoomLoopLaunchers;
|
|
15
|
-
exports.requireDoomLoopLaunchers = requireDoomLoopLaunchers;
|
|
16
|
-
|
|
17
|
-
//# sourceMappingURL=loopLaunchers.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loopLaunchers.cjs","names":[],"sources":["../../../src/schemas/loopLaunchers.ts"],"sourcesContent":["import type { Context } from '@deepseek-ai/cordis';\n\n/** Provider-owned Cordis service for session-scoped recurring-loop launchers. */\nexport const DOOM_LOOP_LAUNCHERS_SERVICE = 'doom/loop-launchers';\n\nexport interface LoopLaunchRequest {\n readonly instanceId: string;\n readonly signal: AbortSignal;\n}\n\nexport interface StoppableLoop {\n readonly instanceId: string;\n readonly label?: string;\n readonly detail?: string;\n stop(reason?: string): void | Promise<void>;\n}\n\nexport interface LoopLauncherSummary {\n readonly id: string;\n readonly source: string;\n readonly label: string;\n readonly description?: string;\n}\n\nexport interface LoopInstanceSnapshot {\n readonly instanceId: string;\n readonly launcherId: string;\n readonly launcherLabel: string;\n readonly label?: string;\n readonly detail?: string;\n readonly state: 'starting' | 'running' | 'stopping';\n readonly startedAt?: string;\n}\n\nexport interface LoopLauncherDefinition extends LoopLauncherSummary {\n launch(request: LoopLaunchRequest): Promise<StoppableLoop | undefined>;\n}\n\nexport interface LoopLauncherRegistration {\n readonly id: string;\n readonly generation: string;\n dispose(reason?: string): Promise<void>;\n}\n\n/** Direct registrar/control seam owned and provided by doompi-loop. */\nexport interface DoomLoopLaunchersService {\n readonly generation: string;\n register(definition: LoopLauncherDefinition): LoopLauncherRegistration;\n listLaunchers(): readonly LoopLauncherSummary[];\n listInstances(): readonly LoopInstanceSnapshot[];\n subscribe(listener: () => void): () => void;\n launch(launcherId: string, options?: { instanceId?: string }): Promise<LoopInstanceSnapshot | undefined>;\n stop(instanceId: string, reason?: string): Promise<boolean>;\n stopAll(reason?: string): Promise<void>;\n dispose(reason?: string): Promise<void>;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'doom/loop-launchers': DoomLoopLaunchersService;\n }\n}\n\nexport function readDoomLoopLaunchers(context: Context): DoomLoopLaunchersService | undefined {\n return context.get(DOOM_LOOP_LAUNCHERS_SERVICE) as DoomLoopLaunchersService | undefined;\n}\n\nexport function requireDoomLoopLaunchers(context: Context): DoomLoopLaunchersService {\n const service = readDoomLoopLaunchers(context);\n if (!service) throw new Error('Doom loop launchers are unavailable. Load @agimon-ai/doompi-loop.');\n return service;\n}\n"],"mappings":";;AAGA,MAAa,8BAA8B;AA4D3C,SAAgB,sBAAsB,SAAwD;CAC5F,OAAO,QAAQ,IAAI,2BAA2B;AAChD;AAEA,SAAgB,yBAAyB,SAA4C;CACnF,MAAM,UAAU,sBAAsB,OAAO;CAC7C,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,mEAAmE;CACjG,OAAO;AACT"}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { Context } from "@deepseek-ai/cordis";
|
|
2
|
-
//#region src/schemas/loopLaunchers.d.ts
|
|
3
|
-
/** Provider-owned Cordis service for session-scoped recurring-loop launchers. */
|
|
4
|
-
export declare const DOOM_LOOP_LAUNCHERS_SERVICE = "doom/loop-launchers";
|
|
5
|
-
export interface LoopLaunchRequest {
|
|
6
|
-
readonly instanceId: string;
|
|
7
|
-
readonly signal: AbortSignal;
|
|
8
|
-
}
|
|
9
|
-
export interface StoppableLoop {
|
|
10
|
-
readonly instanceId: string;
|
|
11
|
-
readonly label?: string;
|
|
12
|
-
readonly detail?: string;
|
|
13
|
-
stop(reason?: string): void | Promise<void>;
|
|
14
|
-
}
|
|
15
|
-
export interface LoopLauncherSummary {
|
|
16
|
-
readonly id: string;
|
|
17
|
-
readonly source: string;
|
|
18
|
-
readonly label: string;
|
|
19
|
-
readonly description?: string;
|
|
20
|
-
}
|
|
21
|
-
export interface LoopInstanceSnapshot {
|
|
22
|
-
readonly instanceId: string;
|
|
23
|
-
readonly launcherId: string;
|
|
24
|
-
readonly launcherLabel: string;
|
|
25
|
-
readonly label?: string;
|
|
26
|
-
readonly detail?: string;
|
|
27
|
-
readonly state: 'starting' | 'running' | 'stopping';
|
|
28
|
-
readonly startedAt?: string;
|
|
29
|
-
}
|
|
30
|
-
export interface LoopLauncherDefinition extends LoopLauncherSummary {
|
|
31
|
-
launch(request: LoopLaunchRequest): Promise<StoppableLoop | undefined>;
|
|
32
|
-
}
|
|
33
|
-
export interface LoopLauncherRegistration {
|
|
34
|
-
readonly id: string;
|
|
35
|
-
readonly generation: string;
|
|
36
|
-
dispose(reason?: string): Promise<void>;
|
|
37
|
-
}
|
|
38
|
-
/** Direct registrar/control seam owned and provided by doompi-loop. */
|
|
39
|
-
export interface DoomLoopLaunchersService {
|
|
40
|
-
readonly generation: string;
|
|
41
|
-
register(definition: LoopLauncherDefinition): LoopLauncherRegistration;
|
|
42
|
-
listLaunchers(): readonly LoopLauncherSummary[];
|
|
43
|
-
listInstances(): readonly LoopInstanceSnapshot[];
|
|
44
|
-
subscribe(listener: () => void): () => void;
|
|
45
|
-
launch(launcherId: string, options?: {
|
|
46
|
-
instanceId?: string;
|
|
47
|
-
}): Promise<LoopInstanceSnapshot | undefined>;
|
|
48
|
-
stop(instanceId: string, reason?: string): Promise<boolean>;
|
|
49
|
-
stopAll(reason?: string): Promise<void>;
|
|
50
|
-
dispose(reason?: string): Promise<void>;
|
|
51
|
-
}
|
|
52
|
-
declare module '@deepseek-ai/cordis' {
|
|
53
|
-
interface Context {
|
|
54
|
-
'doom/loop-launchers': DoomLoopLaunchersService;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
export declare function readDoomLoopLaunchers(context: Context): DoomLoopLaunchersService | undefined;
|
|
58
|
-
export declare function requireDoomLoopLaunchers(context: Context): DoomLoopLaunchersService;
|
|
59
|
-
//#endregion
|
|
60
|
-
//# sourceMappingURL=loopLaunchers.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loopLaunchers.d.cts","names":[],"sources":["../../../src/schemas/loopLaunchers.ts"],"mappings":";;;qBAGa;iBAEI;WACN;WACA,QAAQ;;iBAGF;WACN;WACA;WACA;EACT,KAAK,yBAAyB;;iBAGf;WACN;WACA;WACA;WACA;;iBAGM;WACN;WACA;WACA;WACA;WACA;WACA;WACA;;iBAGM,+BAA+B;EAC9C,OAAO,SAAS,oBAAoB,QAAQ;;iBAG7B;WACN;WACA;EACT,QAAQ,kBAAkB;;;iBAIX;WACN;EACT,SAAS,YAAY,yBAAyB;EAC9C,0BAA0B;EAC1B,0BAA0B;EAC1B,UAAU;EACV,OAAO,oBAAoB;IAAY;MAAwB,QAAQ;EACvE,KAAK,oBAAoB,kBAAkB;EAC3C,QAAQ,kBAAkB;EAC1B,QAAQ,kBAAkB;;;YAIhB;IACR,uBAAuB;;;wBAIX,sBAAsB,SAAS,UAAU;wBAIzC,yBAAyB,SAAS,UAAU"}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { Context } from "@deepseek-ai/cordis";
|
|
2
|
-
//#region src/schemas/loopLaunchers.d.ts
|
|
3
|
-
/** Provider-owned Cordis service for session-scoped recurring-loop launchers. */
|
|
4
|
-
export declare const DOOM_LOOP_LAUNCHERS_SERVICE = "doom/loop-launchers";
|
|
5
|
-
export interface LoopLaunchRequest {
|
|
6
|
-
readonly instanceId: string;
|
|
7
|
-
readonly signal: AbortSignal;
|
|
8
|
-
}
|
|
9
|
-
export interface StoppableLoop {
|
|
10
|
-
readonly instanceId: string;
|
|
11
|
-
readonly label?: string;
|
|
12
|
-
readonly detail?: string;
|
|
13
|
-
stop(reason?: string): void | Promise<void>;
|
|
14
|
-
}
|
|
15
|
-
export interface LoopLauncherSummary {
|
|
16
|
-
readonly id: string;
|
|
17
|
-
readonly source: string;
|
|
18
|
-
readonly label: string;
|
|
19
|
-
readonly description?: string;
|
|
20
|
-
}
|
|
21
|
-
export interface LoopInstanceSnapshot {
|
|
22
|
-
readonly instanceId: string;
|
|
23
|
-
readonly launcherId: string;
|
|
24
|
-
readonly launcherLabel: string;
|
|
25
|
-
readonly label?: string;
|
|
26
|
-
readonly detail?: string;
|
|
27
|
-
readonly state: 'starting' | 'running' | 'stopping';
|
|
28
|
-
readonly startedAt?: string;
|
|
29
|
-
}
|
|
30
|
-
export interface LoopLauncherDefinition extends LoopLauncherSummary {
|
|
31
|
-
launch(request: LoopLaunchRequest): Promise<StoppableLoop | undefined>;
|
|
32
|
-
}
|
|
33
|
-
export interface LoopLauncherRegistration {
|
|
34
|
-
readonly id: string;
|
|
35
|
-
readonly generation: string;
|
|
36
|
-
dispose(reason?: string): Promise<void>;
|
|
37
|
-
}
|
|
38
|
-
/** Direct registrar/control seam owned and provided by doompi-loop. */
|
|
39
|
-
export interface DoomLoopLaunchersService {
|
|
40
|
-
readonly generation: string;
|
|
41
|
-
register(definition: LoopLauncherDefinition): LoopLauncherRegistration;
|
|
42
|
-
listLaunchers(): readonly LoopLauncherSummary[];
|
|
43
|
-
listInstances(): readonly LoopInstanceSnapshot[];
|
|
44
|
-
subscribe(listener: () => void): () => void;
|
|
45
|
-
launch(launcherId: string, options?: {
|
|
46
|
-
instanceId?: string;
|
|
47
|
-
}): Promise<LoopInstanceSnapshot | undefined>;
|
|
48
|
-
stop(instanceId: string, reason?: string): Promise<boolean>;
|
|
49
|
-
stopAll(reason?: string): Promise<void>;
|
|
50
|
-
dispose(reason?: string): Promise<void>;
|
|
51
|
-
}
|
|
52
|
-
declare module '@deepseek-ai/cordis' {
|
|
53
|
-
interface Context {
|
|
54
|
-
'doom/loop-launchers': DoomLoopLaunchersService;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
export declare function readDoomLoopLaunchers(context: Context): DoomLoopLaunchersService | undefined;
|
|
58
|
-
export declare function requireDoomLoopLaunchers(context: Context): DoomLoopLaunchersService;
|
|
59
|
-
//#endregion
|
|
60
|
-
//# sourceMappingURL=loopLaunchers.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loopLaunchers.d.mts","names":[],"sources":["../../../src/schemas/loopLaunchers.ts"],"mappings":";;;qBAGa;iBAEI;WACN;WACA,QAAQ;;iBAGF;WACN;WACA;WACA;EACT,KAAK,yBAAyB;;iBAGf;WACN;WACA;WACA;WACA;;iBAGM;WACN;WACA;WACA;WACA;WACA;WACA;WACA;;iBAGM,+BAA+B;EAC9C,OAAO,SAAS,oBAAoB,QAAQ;;iBAG7B;WACN;WACA;EACT,QAAQ,kBAAkB;;;iBAIX;WACN;EACT,SAAS,YAAY,yBAAyB;EAC9C,0BAA0B;EAC1B,0BAA0B;EAC1B,UAAU;EACV,OAAO,oBAAoB;IAAY;MAAwB,QAAQ;EACvE,KAAK,oBAAoB,kBAAkB;EAC3C,QAAQ,kBAAkB;EAC1B,QAAQ,kBAAkB;;;YAIhB;IACR,uBAAuB;;;wBAIX,sBAAsB,SAAS,UAAU;wBAIzC,yBAAyB,SAAS,UAAU"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
//#region src/schemas/loopLaunchers.ts
|
|
2
|
-
/** Provider-owned Cordis service for session-scoped recurring-loop launchers. */
|
|
3
|
-
const DOOM_LOOP_LAUNCHERS_SERVICE = "doom/loop-launchers";
|
|
4
|
-
function readDoomLoopLaunchers(context) {
|
|
5
|
-
return context.get(DOOM_LOOP_LAUNCHERS_SERVICE);
|
|
6
|
-
}
|
|
7
|
-
function requireDoomLoopLaunchers(context) {
|
|
8
|
-
const service = readDoomLoopLaunchers(context);
|
|
9
|
-
if (!service) throw new Error("Doom loop launchers are unavailable. Load @agimon-ai/doompi-loop.");
|
|
10
|
-
return service;
|
|
11
|
-
}
|
|
12
|
-
//#endregion
|
|
13
|
-
export { DOOM_LOOP_LAUNCHERS_SERVICE, readDoomLoopLaunchers, requireDoomLoopLaunchers };
|
|
14
|
-
|
|
15
|
-
//# sourceMappingURL=loopLaunchers.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loopLaunchers.mjs","names":[],"sources":["../../../src/schemas/loopLaunchers.ts"],"sourcesContent":["import type { Context } from '@deepseek-ai/cordis';\n\n/** Provider-owned Cordis service for session-scoped recurring-loop launchers. */\nexport const DOOM_LOOP_LAUNCHERS_SERVICE = 'doom/loop-launchers';\n\nexport interface LoopLaunchRequest {\n readonly instanceId: string;\n readonly signal: AbortSignal;\n}\n\nexport interface StoppableLoop {\n readonly instanceId: string;\n readonly label?: string;\n readonly detail?: string;\n stop(reason?: string): void | Promise<void>;\n}\n\nexport interface LoopLauncherSummary {\n readonly id: string;\n readonly source: string;\n readonly label: string;\n readonly description?: string;\n}\n\nexport interface LoopInstanceSnapshot {\n readonly instanceId: string;\n readonly launcherId: string;\n readonly launcherLabel: string;\n readonly label?: string;\n readonly detail?: string;\n readonly state: 'starting' | 'running' | 'stopping';\n readonly startedAt?: string;\n}\n\nexport interface LoopLauncherDefinition extends LoopLauncherSummary {\n launch(request: LoopLaunchRequest): Promise<StoppableLoop | undefined>;\n}\n\nexport interface LoopLauncherRegistration {\n readonly id: string;\n readonly generation: string;\n dispose(reason?: string): Promise<void>;\n}\n\n/** Direct registrar/control seam owned and provided by doompi-loop. */\nexport interface DoomLoopLaunchersService {\n readonly generation: string;\n register(definition: LoopLauncherDefinition): LoopLauncherRegistration;\n listLaunchers(): readonly LoopLauncherSummary[];\n listInstances(): readonly LoopInstanceSnapshot[];\n subscribe(listener: () => void): () => void;\n launch(launcherId: string, options?: { instanceId?: string }): Promise<LoopInstanceSnapshot | undefined>;\n stop(instanceId: string, reason?: string): Promise<boolean>;\n stopAll(reason?: string): Promise<void>;\n dispose(reason?: string): Promise<void>;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'doom/loop-launchers': DoomLoopLaunchersService;\n }\n}\n\nexport function readDoomLoopLaunchers(context: Context): DoomLoopLaunchersService | undefined {\n return context.get(DOOM_LOOP_LAUNCHERS_SERVICE) as DoomLoopLaunchersService | undefined;\n}\n\nexport function requireDoomLoopLaunchers(context: Context): DoomLoopLaunchersService {\n const service = readDoomLoopLaunchers(context);\n if (!service) throw new Error('Doom loop launchers are unavailable. Load @agimon-ai/doompi-loop.');\n return service;\n}\n"],"mappings":";;AAGA,MAAa,8BAA8B;AA4D3C,SAAgB,sBAAsB,SAAwD;CAC5F,OAAO,QAAQ,IAAI,2BAA2B;AAChD;AAEA,SAAgB,yBAAyB,SAA4C;CACnF,MAAM,UAAU,sBAAsB,OAAO;CAC7C,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,mEAAmE;CACjG,OAAO;AACT"}
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
const require_piLoop = require("../../constants/piLoop.cjs");
|
|
2
|
-
//#region src/services/defaultLoopLauncher/index.ts
|
|
3
|
-
const DEFAULT_LAUNCHER_ID = "doompi.default";
|
|
4
|
-
const DEFAULT_INTERVAL_SECONDS = 300;
|
|
5
|
-
const MIN_INTERVAL_SECONDS = 30;
|
|
6
|
-
const MAX_INTERVAL_SECONDS = 3600;
|
|
7
|
-
const MILLISECONDS_PER_SECOND = 1e3;
|
|
8
|
-
const PROMPT_PREVIEW_LENGTH = 80;
|
|
9
|
-
function intervalError(raw) {
|
|
10
|
-
const seconds = Number(raw);
|
|
11
|
-
if (!Number.isInteger(seconds)) return `Interval must be a whole number of seconds, got ${raw}.`;
|
|
12
|
-
if (seconds < MIN_INTERVAL_SECONDS || seconds > MAX_INTERVAL_SECONDS) return `Interval must be between ${MIN_INTERVAL_SECONDS} and ${MAX_INTERVAL_SECONDS} seconds.`;
|
|
13
|
-
}
|
|
14
|
-
async function prepareDefaultLoop(ui, signal) {
|
|
15
|
-
const prompt = (await ui.editor("Loop prompt", ""))?.trim();
|
|
16
|
-
if (!prompt || signal.aborted) return void 0;
|
|
17
|
-
const rawInterval = await ui.input("Loop interval in seconds", `Default: ${DEFAULT_INTERVAL_SECONDS}s`);
|
|
18
|
-
if (rawInterval === void 0 || signal.aborted) return void 0;
|
|
19
|
-
const normalizedInterval = rawInterval.trim() || String(DEFAULT_INTERVAL_SECONDS);
|
|
20
|
-
const error = intervalError(normalizedInterval);
|
|
21
|
-
if (error) {
|
|
22
|
-
ui.notify(error, require_piLoop.NOTIFY_WARNING_LEVEL);
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
return {
|
|
26
|
-
prompt,
|
|
27
|
-
intervalSeconds: Number(normalizedInterval)
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
function promptPreview(prompt) {
|
|
31
|
-
const oneLine = prompt.replaceAll(/\s+/gu, " ").trim();
|
|
32
|
-
return oneLine.length > PROMPT_PREVIEW_LENGTH ? `${oneLine.slice(0, 79)}…` : oneLine;
|
|
33
|
-
}
|
|
34
|
-
function createDefaultLoopLauncher(pi) {
|
|
35
|
-
const pending = /* @__PURE__ */ new Set();
|
|
36
|
-
const requestPass = (loop) => {
|
|
37
|
-
if (loop.stopped) return;
|
|
38
|
-
if (!loop.context.isIdle()) {
|
|
39
|
-
pending.add(loop);
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
pending.delete(loop);
|
|
43
|
-
try {
|
|
44
|
-
pi.sendUserMessage(loop.prompt);
|
|
45
|
-
} catch (error) {
|
|
46
|
-
loop.context.ui.notify(`Default loop pass could not start: ${error instanceof Error ? error.message : String(error)}`, require_piLoop.NOTIFY_WARNING_LEVEL);
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
const onAgentSettled = () => {
|
|
50
|
-
const next = pending.values().next().value;
|
|
51
|
-
if (next) requestPass(next);
|
|
52
|
-
};
|
|
53
|
-
return {
|
|
54
|
-
onAgentSettled,
|
|
55
|
-
register(ctx, launchers) {
|
|
56
|
-
return launchers.register({
|
|
57
|
-
id: DEFAULT_LAUNCHER_ID,
|
|
58
|
-
source: require_piLoop.PACKAGE_SOURCE,
|
|
59
|
-
label: "Default loop",
|
|
60
|
-
description: "Run your own prompt in this session on an interval",
|
|
61
|
-
async launch({ instanceId, signal }) {
|
|
62
|
-
const prepared = await prepareDefaultLoop(ctx.ui, signal);
|
|
63
|
-
if (!prepared || signal.aborted) return void 0;
|
|
64
|
-
const loop = {
|
|
65
|
-
...prepared,
|
|
66
|
-
context: ctx,
|
|
67
|
-
stopped: false
|
|
68
|
-
};
|
|
69
|
-
loop.timer = setInterval(() => requestPass(loop), loop.intervalSeconds * MILLISECONDS_PER_SECOND);
|
|
70
|
-
loop.timer.unref?.();
|
|
71
|
-
requestPass(loop);
|
|
72
|
-
return {
|
|
73
|
-
instanceId,
|
|
74
|
-
label: "Default loop",
|
|
75
|
-
detail: `every ${loop.intervalSeconds}s · ${promptPreview(loop.prompt)}`,
|
|
76
|
-
stop() {
|
|
77
|
-
if (loop.stopped) return;
|
|
78
|
-
loop.stopped = true;
|
|
79
|
-
if (loop.timer) clearInterval(loop.timer);
|
|
80
|
-
loop.timer = void 0;
|
|
81
|
-
pending.delete(loop);
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
//#endregion
|
|
90
|
-
exports.createDefaultLoopLauncher = createDefaultLoopLauncher;
|
|
91
|
-
|
|
92
|
-
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["NOTIFY_WARNING_LEVEL","PACKAGE_SOURCE"],"sources":["../../../../src/services/defaultLoopLauncher/index.ts"],"sourcesContent":["import type { ExtensionAPI, ExtensionContext, ExtensionUIContext } from '@earendil-works/pi-coding-agent';\n\nimport { NOTIFY_WARNING_LEVEL, PACKAGE_SOURCE } from '../../constants/piLoop';\nimport type { DoomLoopLaunchersService, LoopLauncherRegistration, StoppableLoop } from '../../schemas/loopLaunchers';\n\nconst DEFAULT_LAUNCHER_ID = 'doompi.default';\nconst DEFAULT_INTERVAL_SECONDS = 300;\nconst MIN_INTERVAL_SECONDS = 30;\nconst MAX_INTERVAL_SECONDS = 3600;\nconst MILLISECONDS_PER_SECOND = 1000;\nconst PROMPT_PREVIEW_LENGTH = 80;\n\ninterface PreparedDefaultLoop {\n readonly prompt: string;\n readonly intervalSeconds: number;\n}\n\ninterface ActiveDefaultLoop extends PreparedDefaultLoop {\n readonly context: ExtensionContext;\n timer?: ReturnType<typeof setInterval>;\n stopped: boolean;\n}\n\nexport interface DefaultLoopLauncher {\n onAgentSettled(this: void): void;\n register(ctx: ExtensionContext, launchers: DoomLoopLaunchersService): LoopLauncherRegistration;\n}\n\nfunction intervalError(raw: string): string | undefined {\n const seconds = Number(raw);\n if (!Number.isInteger(seconds)) return `Interval must be a whole number of seconds, got ${raw}.`;\n if (seconds < MIN_INTERVAL_SECONDS || seconds > MAX_INTERVAL_SECONDS) {\n return `Interval must be between ${MIN_INTERVAL_SECONDS} and ${MAX_INTERVAL_SECONDS} seconds.`;\n }\n return undefined;\n}\n\nasync function prepareDefaultLoop(\n ui: ExtensionUIContext,\n signal: AbortSignal,\n): Promise<PreparedDefaultLoop | undefined> {\n const prompt = (await ui.editor('Loop prompt', ''))?.trim();\n if (!prompt || signal.aborted) return undefined;\n\n const rawInterval = await ui.input('Loop interval in seconds', `Default: ${DEFAULT_INTERVAL_SECONDS}s`);\n if (rawInterval === undefined || signal.aborted) return undefined;\n const normalizedInterval = rawInterval.trim() || String(DEFAULT_INTERVAL_SECONDS);\n const error = intervalError(normalizedInterval);\n if (error) {\n ui.notify(error, NOTIFY_WARNING_LEVEL);\n return undefined;\n }\n\n return { prompt, intervalSeconds: Number(normalizedInterval) };\n}\n\nfunction promptPreview(prompt: string): string {\n const oneLine = prompt.replaceAll(/\\s+/gu, ' ').trim();\n return oneLine.length > PROMPT_PREVIEW_LENGTH ? `${oneLine.slice(0, PROMPT_PREVIEW_LENGTH - 1)}…` : oneLine;\n}\n\nexport function createDefaultLoopLauncher(pi: Pick<ExtensionAPI, 'sendUserMessage'>): DefaultLoopLauncher {\n const pending = new Set<ActiveDefaultLoop>();\n\n const requestPass = (loop: ActiveDefaultLoop): void => {\n if (loop.stopped) return;\n if (!loop.context.isIdle()) {\n pending.add(loop);\n return;\n }\n\n pending.delete(loop);\n try {\n pi.sendUserMessage(loop.prompt);\n } catch (error) {\n loop.context.ui.notify(\n `Default loop pass could not start: ${error instanceof Error ? error.message : String(error)}`,\n NOTIFY_WARNING_LEVEL,\n );\n }\n };\n\n const onAgentSettled = (): void => {\n const next = pending.values().next().value;\n if (next) requestPass(next);\n };\n\n return {\n onAgentSettled,\n register(ctx, launchers) {\n return launchers.register({\n id: DEFAULT_LAUNCHER_ID,\n source: PACKAGE_SOURCE,\n label: 'Default loop',\n description: 'Run your own prompt in this session on an interval',\n async launch({ instanceId, signal }) {\n const prepared = await prepareDefaultLoop(ctx.ui, signal);\n if (!prepared || signal.aborted) return undefined;\n\n const loop: ActiveDefaultLoop = { ...prepared, context: ctx, stopped: false };\n loop.timer = setInterval(() => requestPass(loop), loop.intervalSeconds * MILLISECONDS_PER_SECOND);\n loop.timer.unref?.();\n requestPass(loop);\n\n const handle: StoppableLoop = {\n instanceId,\n label: 'Default loop',\n detail: `every ${loop.intervalSeconds}s · ${promptPreview(loop.prompt)}`,\n stop() {\n if (loop.stopped) return;\n loop.stopped = true;\n if (loop.timer) clearInterval(loop.timer);\n loop.timer = undefined;\n pending.delete(loop);\n },\n };\n return handle;\n },\n });\n },\n };\n}\n"],"mappings":";;AAKA,MAAM,sBAAsB;AAC5B,MAAM,2BAA2B;AACjC,MAAM,uBAAuB;AAC7B,MAAM,uBAAuB;AAC7B,MAAM,0BAA0B;AAChC,MAAM,wBAAwB;AAkB9B,SAAS,cAAc,KAAiC;CACtD,MAAM,UAAU,OAAO,GAAG;CAC1B,IAAI,CAAC,OAAO,UAAU,OAAO,GAAG,OAAO,mDAAmD,IAAI;CAC9F,IAAI,UAAU,wBAAwB,UAAU,sBAC9C,OAAO,4BAA4B,qBAAqB,OAAO,qBAAqB;AAGxF;AAEA,eAAe,mBACb,IACA,QAC0C;CAC1C,MAAM,UAAU,MAAM,GAAG,OAAO,eAAe,EAAE,EAAA,EAAI,KAAK;CAC1D,IAAI,CAAC,UAAU,OAAO,SAAS,OAAO,KAAA;CAEtC,MAAM,cAAc,MAAM,GAAG,MAAM,4BAA4B,YAAY,yBAAyB,EAAE;CACtG,IAAI,gBAAgB,KAAA,KAAa,OAAO,SAAS,OAAO,KAAA;CACxD,MAAM,qBAAqB,YAAY,KAAK,KAAK,OAAO,wBAAwB;CAChF,MAAM,QAAQ,cAAc,kBAAkB;CAC9C,IAAI,OAAO;EACT,GAAG,OAAO,OAAOA,eAAAA,oBAAoB;EACrC;CACF;CAEA,OAAO;EAAE;EAAQ,iBAAiB,OAAO,kBAAkB;CAAE;AAC/D;AAEA,SAAS,cAAc,QAAwB;CAC7C,MAAM,UAAU,OAAO,WAAW,SAAS,GAAG,CAAC,CAAC,KAAK;CACrD,OAAO,QAAQ,SAAS,wBAAwB,GAAG,QAAQ,MAAM,GAAG,EAAyB,EAAE,KAAK;AACtG;AAEA,SAAgB,0BAA0B,IAAgE;CACxG,MAAM,0BAAU,IAAI,IAAuB;CAE3C,MAAM,eAAe,SAAkC;EACrD,IAAI,KAAK,SAAS;EAClB,IAAI,CAAC,KAAK,QAAQ,OAAO,GAAG;GAC1B,QAAQ,IAAI,IAAI;GAChB;EACF;EAEA,QAAQ,OAAO,IAAI;EACnB,IAAI;GACF,GAAG,gBAAgB,KAAK,MAAM;EAChC,SAAS,OAAO;GACd,KAAK,QAAQ,GAAG,OACd,sCAAsC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,KAC3FA,eAAAA,oBACF;EACF;CACF;CAEA,MAAM,uBAA6B;EACjC,MAAM,OAAO,QAAQ,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;EACrC,IAAI,MAAM,YAAY,IAAI;CAC5B;CAEA,OAAO;EACL;EACA,SAAS,KAAK,WAAW;GACvB,OAAO,UAAU,SAAS;IACxB,IAAI;IACJ,QAAQC,eAAAA;IACR,OAAO;IACP,aAAa;IACb,MAAM,OAAO,EAAE,YAAY,UAAU;KACnC,MAAM,WAAW,MAAM,mBAAmB,IAAI,IAAI,MAAM;KACxD,IAAI,CAAC,YAAY,OAAO,SAAS,OAAO,KAAA;KAExC,MAAM,OAA0B;MAAE,GAAG;MAAU,SAAS;MAAK,SAAS;KAAM;KAC5E,KAAK,QAAQ,kBAAkB,YAAY,IAAI,GAAG,KAAK,kBAAkB,uBAAuB;KAChG,KAAK,MAAM,QAAQ;KACnB,YAAY,IAAI;KAchB,OAAO;MAXL;MACA,OAAO;MACP,QAAQ,SAAS,KAAK,gBAAgB,MAAM,cAAc,KAAK,MAAM;MACrE,OAAO;OACL,IAAI,KAAK,SAAS;OAClB,KAAK,UAAU;OACf,IAAI,KAAK,OAAO,cAAc,KAAK,KAAK;OACxC,KAAK,QAAQ,KAAA;OACb,QAAQ,OAAO,IAAI;MACrB;KAEU;IACd;GACF,CAAC;EACH;CACF;AACF"}
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { NOTIFY_WARNING_LEVEL, PACKAGE_SOURCE } from "../../constants/piLoop.mjs";
|
|
2
|
-
//#region src/services/defaultLoopLauncher/index.ts
|
|
3
|
-
const DEFAULT_LAUNCHER_ID = "doompi.default";
|
|
4
|
-
const DEFAULT_INTERVAL_SECONDS = 300;
|
|
5
|
-
const MIN_INTERVAL_SECONDS = 30;
|
|
6
|
-
const MAX_INTERVAL_SECONDS = 3600;
|
|
7
|
-
const MILLISECONDS_PER_SECOND = 1e3;
|
|
8
|
-
const PROMPT_PREVIEW_LENGTH = 80;
|
|
9
|
-
function intervalError(raw) {
|
|
10
|
-
const seconds = Number(raw);
|
|
11
|
-
if (!Number.isInteger(seconds)) return `Interval must be a whole number of seconds, got ${raw}.`;
|
|
12
|
-
if (seconds < MIN_INTERVAL_SECONDS || seconds > MAX_INTERVAL_SECONDS) return `Interval must be between ${MIN_INTERVAL_SECONDS} and ${MAX_INTERVAL_SECONDS} seconds.`;
|
|
13
|
-
}
|
|
14
|
-
async function prepareDefaultLoop(ui, signal) {
|
|
15
|
-
const prompt = (await ui.editor("Loop prompt", ""))?.trim();
|
|
16
|
-
if (!prompt || signal.aborted) return void 0;
|
|
17
|
-
const rawInterval = await ui.input("Loop interval in seconds", `Default: ${DEFAULT_INTERVAL_SECONDS}s`);
|
|
18
|
-
if (rawInterval === void 0 || signal.aborted) return void 0;
|
|
19
|
-
const normalizedInterval = rawInterval.trim() || String(DEFAULT_INTERVAL_SECONDS);
|
|
20
|
-
const error = intervalError(normalizedInterval);
|
|
21
|
-
if (error) {
|
|
22
|
-
ui.notify(error, NOTIFY_WARNING_LEVEL);
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
return {
|
|
26
|
-
prompt,
|
|
27
|
-
intervalSeconds: Number(normalizedInterval)
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
function promptPreview(prompt) {
|
|
31
|
-
const oneLine = prompt.replaceAll(/\s+/gu, " ").trim();
|
|
32
|
-
return oneLine.length > PROMPT_PREVIEW_LENGTH ? `${oneLine.slice(0, 79)}…` : oneLine;
|
|
33
|
-
}
|
|
34
|
-
function createDefaultLoopLauncher(pi) {
|
|
35
|
-
const pending = /* @__PURE__ */ new Set();
|
|
36
|
-
const requestPass = (loop) => {
|
|
37
|
-
if (loop.stopped) return;
|
|
38
|
-
if (!loop.context.isIdle()) {
|
|
39
|
-
pending.add(loop);
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
pending.delete(loop);
|
|
43
|
-
try {
|
|
44
|
-
pi.sendUserMessage(loop.prompt);
|
|
45
|
-
} catch (error) {
|
|
46
|
-
loop.context.ui.notify(`Default loop pass could not start: ${error instanceof Error ? error.message : String(error)}`, NOTIFY_WARNING_LEVEL);
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
const onAgentSettled = () => {
|
|
50
|
-
const next = pending.values().next().value;
|
|
51
|
-
if (next) requestPass(next);
|
|
52
|
-
};
|
|
53
|
-
return {
|
|
54
|
-
onAgentSettled,
|
|
55
|
-
register(ctx, launchers) {
|
|
56
|
-
return launchers.register({
|
|
57
|
-
id: DEFAULT_LAUNCHER_ID,
|
|
58
|
-
source: PACKAGE_SOURCE,
|
|
59
|
-
label: "Default loop",
|
|
60
|
-
description: "Run your own prompt in this session on an interval",
|
|
61
|
-
async launch({ instanceId, signal }) {
|
|
62
|
-
const prepared = await prepareDefaultLoop(ctx.ui, signal);
|
|
63
|
-
if (!prepared || signal.aborted) return void 0;
|
|
64
|
-
const loop = {
|
|
65
|
-
...prepared,
|
|
66
|
-
context: ctx,
|
|
67
|
-
stopped: false
|
|
68
|
-
};
|
|
69
|
-
loop.timer = setInterval(() => requestPass(loop), loop.intervalSeconds * MILLISECONDS_PER_SECOND);
|
|
70
|
-
loop.timer.unref?.();
|
|
71
|
-
requestPass(loop);
|
|
72
|
-
return {
|
|
73
|
-
instanceId,
|
|
74
|
-
label: "Default loop",
|
|
75
|
-
detail: `every ${loop.intervalSeconds}s · ${promptPreview(loop.prompt)}`,
|
|
76
|
-
stop() {
|
|
77
|
-
if (loop.stopped) return;
|
|
78
|
-
loop.stopped = true;
|
|
79
|
-
if (loop.timer) clearInterval(loop.timer);
|
|
80
|
-
loop.timer = void 0;
|
|
81
|
-
pending.delete(loop);
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
//#endregion
|
|
90
|
-
export { createDefaultLoopLauncher };
|
|
91
|
-
|
|
92
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/defaultLoopLauncher/index.ts"],"sourcesContent":["import type { ExtensionAPI, ExtensionContext, ExtensionUIContext } from '@earendil-works/pi-coding-agent';\n\nimport { NOTIFY_WARNING_LEVEL, PACKAGE_SOURCE } from '../../constants/piLoop';\nimport type { DoomLoopLaunchersService, LoopLauncherRegistration, StoppableLoop } from '../../schemas/loopLaunchers';\n\nconst DEFAULT_LAUNCHER_ID = 'doompi.default';\nconst DEFAULT_INTERVAL_SECONDS = 300;\nconst MIN_INTERVAL_SECONDS = 30;\nconst MAX_INTERVAL_SECONDS = 3600;\nconst MILLISECONDS_PER_SECOND = 1000;\nconst PROMPT_PREVIEW_LENGTH = 80;\n\ninterface PreparedDefaultLoop {\n readonly prompt: string;\n readonly intervalSeconds: number;\n}\n\ninterface ActiveDefaultLoop extends PreparedDefaultLoop {\n readonly context: ExtensionContext;\n timer?: ReturnType<typeof setInterval>;\n stopped: boolean;\n}\n\nexport interface DefaultLoopLauncher {\n onAgentSettled(this: void): void;\n register(ctx: ExtensionContext, launchers: DoomLoopLaunchersService): LoopLauncherRegistration;\n}\n\nfunction intervalError(raw: string): string | undefined {\n const seconds = Number(raw);\n if (!Number.isInteger(seconds)) return `Interval must be a whole number of seconds, got ${raw}.`;\n if (seconds < MIN_INTERVAL_SECONDS || seconds > MAX_INTERVAL_SECONDS) {\n return `Interval must be between ${MIN_INTERVAL_SECONDS} and ${MAX_INTERVAL_SECONDS} seconds.`;\n }\n return undefined;\n}\n\nasync function prepareDefaultLoop(\n ui: ExtensionUIContext,\n signal: AbortSignal,\n): Promise<PreparedDefaultLoop | undefined> {\n const prompt = (await ui.editor('Loop prompt', ''))?.trim();\n if (!prompt || signal.aborted) return undefined;\n\n const rawInterval = await ui.input('Loop interval in seconds', `Default: ${DEFAULT_INTERVAL_SECONDS}s`);\n if (rawInterval === undefined || signal.aborted) return undefined;\n const normalizedInterval = rawInterval.trim() || String(DEFAULT_INTERVAL_SECONDS);\n const error = intervalError(normalizedInterval);\n if (error) {\n ui.notify(error, NOTIFY_WARNING_LEVEL);\n return undefined;\n }\n\n return { prompt, intervalSeconds: Number(normalizedInterval) };\n}\n\nfunction promptPreview(prompt: string): string {\n const oneLine = prompt.replaceAll(/\\s+/gu, ' ').trim();\n return oneLine.length > PROMPT_PREVIEW_LENGTH ? `${oneLine.slice(0, PROMPT_PREVIEW_LENGTH - 1)}…` : oneLine;\n}\n\nexport function createDefaultLoopLauncher(pi: Pick<ExtensionAPI, 'sendUserMessage'>): DefaultLoopLauncher {\n const pending = new Set<ActiveDefaultLoop>();\n\n const requestPass = (loop: ActiveDefaultLoop): void => {\n if (loop.stopped) return;\n if (!loop.context.isIdle()) {\n pending.add(loop);\n return;\n }\n\n pending.delete(loop);\n try {\n pi.sendUserMessage(loop.prompt);\n } catch (error) {\n loop.context.ui.notify(\n `Default loop pass could not start: ${error instanceof Error ? error.message : String(error)}`,\n NOTIFY_WARNING_LEVEL,\n );\n }\n };\n\n const onAgentSettled = (): void => {\n const next = pending.values().next().value;\n if (next) requestPass(next);\n };\n\n return {\n onAgentSettled,\n register(ctx, launchers) {\n return launchers.register({\n id: DEFAULT_LAUNCHER_ID,\n source: PACKAGE_SOURCE,\n label: 'Default loop',\n description: 'Run your own prompt in this session on an interval',\n async launch({ instanceId, signal }) {\n const prepared = await prepareDefaultLoop(ctx.ui, signal);\n if (!prepared || signal.aborted) return undefined;\n\n const loop: ActiveDefaultLoop = { ...prepared, context: ctx, stopped: false };\n loop.timer = setInterval(() => requestPass(loop), loop.intervalSeconds * MILLISECONDS_PER_SECOND);\n loop.timer.unref?.();\n requestPass(loop);\n\n const handle: StoppableLoop = {\n instanceId,\n label: 'Default loop',\n detail: `every ${loop.intervalSeconds}s · ${promptPreview(loop.prompt)}`,\n stop() {\n if (loop.stopped) return;\n loop.stopped = true;\n if (loop.timer) clearInterval(loop.timer);\n loop.timer = undefined;\n pending.delete(loop);\n },\n };\n return handle;\n },\n });\n },\n };\n}\n"],"mappings":";;AAKA,MAAM,sBAAsB;AAC5B,MAAM,2BAA2B;AACjC,MAAM,uBAAuB;AAC7B,MAAM,uBAAuB;AAC7B,MAAM,0BAA0B;AAChC,MAAM,wBAAwB;AAkB9B,SAAS,cAAc,KAAiC;CACtD,MAAM,UAAU,OAAO,GAAG;CAC1B,IAAI,CAAC,OAAO,UAAU,OAAO,GAAG,OAAO,mDAAmD,IAAI;CAC9F,IAAI,UAAU,wBAAwB,UAAU,sBAC9C,OAAO,4BAA4B,qBAAqB,OAAO,qBAAqB;AAGxF;AAEA,eAAe,mBACb,IACA,QAC0C;CAC1C,MAAM,UAAU,MAAM,GAAG,OAAO,eAAe,EAAE,EAAA,EAAI,KAAK;CAC1D,IAAI,CAAC,UAAU,OAAO,SAAS,OAAO,KAAA;CAEtC,MAAM,cAAc,MAAM,GAAG,MAAM,4BAA4B,YAAY,yBAAyB,EAAE;CACtG,IAAI,gBAAgB,KAAA,KAAa,OAAO,SAAS,OAAO,KAAA;CACxD,MAAM,qBAAqB,YAAY,KAAK,KAAK,OAAO,wBAAwB;CAChF,MAAM,QAAQ,cAAc,kBAAkB;CAC9C,IAAI,OAAO;EACT,GAAG,OAAO,OAAO,oBAAoB;EACrC;CACF;CAEA,OAAO;EAAE;EAAQ,iBAAiB,OAAO,kBAAkB;CAAE;AAC/D;AAEA,SAAS,cAAc,QAAwB;CAC7C,MAAM,UAAU,OAAO,WAAW,SAAS,GAAG,CAAC,CAAC,KAAK;CACrD,OAAO,QAAQ,SAAS,wBAAwB,GAAG,QAAQ,MAAM,GAAG,EAAyB,EAAE,KAAK;AACtG;AAEA,SAAgB,0BAA0B,IAAgE;CACxG,MAAM,0BAAU,IAAI,IAAuB;CAE3C,MAAM,eAAe,SAAkC;EACrD,IAAI,KAAK,SAAS;EAClB,IAAI,CAAC,KAAK,QAAQ,OAAO,GAAG;GAC1B,QAAQ,IAAI,IAAI;GAChB;EACF;EAEA,QAAQ,OAAO,IAAI;EACnB,IAAI;GACF,GAAG,gBAAgB,KAAK,MAAM;EAChC,SAAS,OAAO;GACd,KAAK,QAAQ,GAAG,OACd,sCAAsC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,KAC3F,oBACF;EACF;CACF;CAEA,MAAM,uBAA6B;EACjC,MAAM,OAAO,QAAQ,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;EACrC,IAAI,MAAM,YAAY,IAAI;CAC5B;CAEA,OAAO;EACL;EACA,SAAS,KAAK,WAAW;GACvB,OAAO,UAAU,SAAS;IACxB,IAAI;IACJ,QAAQ;IACR,OAAO;IACP,aAAa;IACb,MAAM,OAAO,EAAE,YAAY,UAAU;KACnC,MAAM,WAAW,MAAM,mBAAmB,IAAI,IAAI,MAAM;KACxD,IAAI,CAAC,YAAY,OAAO,SAAS,OAAO,KAAA;KAExC,MAAM,OAA0B;MAAE,GAAG;MAAU,SAAS;MAAK,SAAS;KAAM;KAC5E,KAAK,QAAQ,kBAAkB,YAAY,IAAI,GAAG,KAAK,kBAAkB,uBAAuB;KAChG,KAAK,MAAM,QAAQ;KACnB,YAAY,IAAI;KAchB,OAAO;MAXL;MACA,OAAO;MACP,QAAQ,SAAS,KAAK,gBAAgB,MAAM,cAAc,KAAK,MAAM;MACrE,OAAO;OACL,IAAI,KAAK,SAAS;OAClB,KAAK,UAAU;OACf,IAAI,KAAK,OAAO,cAAc,KAAK,KAAK;OACxC,KAAK,QAAQ,KAAA;OACb,QAAQ,OAAO,IAAI;MACrB;KAEU;IACd;GACF,CAAC;EACH;CACF;AACF"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
const require_loop = require("../../constants/loop.cjs");
|
|
2
|
-
//#region src/services/loopCommand/index.ts
|
|
3
|
-
function createLoopCommands(handlers) {
|
|
4
|
-
return [[require_loop.START_COMMAND_NAME, {
|
|
5
|
-
description: require_loop.START_COMMAND_DESCRIPTION,
|
|
6
|
-
handler: async (args, ctx) => handlers.start(ctx, args)
|
|
7
|
-
}], [require_loop.LIST_COMMAND_NAME, {
|
|
8
|
-
description: require_loop.LIST_COMMAND_DESCRIPTION,
|
|
9
|
-
handler: async (_args, ctx) => handlers.list(ctx)
|
|
10
|
-
}]];
|
|
11
|
-
}
|
|
12
|
-
//#endregion
|
|
13
|
-
exports.createLoopCommands = createLoopCommands;
|
|
14
|
-
|
|
15
|
-
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["START_COMMAND_NAME","START_COMMAND_DESCRIPTION","LIST_COMMAND_NAME","LIST_COMMAND_DESCRIPTION"],"sources":["../../../../src/services/loopCommand/index.ts"],"sourcesContent":["import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nimport { START_COMMAND_DESCRIPTION, LIST_COMMAND_DESCRIPTION } from '../../constants/loop';\nimport { LIST_COMMAND_NAME, START_COMMAND_NAME } from '../../constants/loop';\nimport type { LoopCommandHandlers } from '../../types/loopCommand';\nexport function createLoopCommands(\n handlers: LoopCommandHandlers,\n): readonly (readonly [string, Parameters<ExtensionAPI['registerCommand']>[1]])[] {\n return [\n [\n START_COMMAND_NAME,\n {\n description: START_COMMAND_DESCRIPTION,\n handler: async (args, ctx) => handlers.start(ctx, args),\n },\n ],\n [\n LIST_COMMAND_NAME,\n {\n description: LIST_COMMAND_DESCRIPTION,\n handler: async (_args, ctx) => handlers.list(ctx),\n },\n ],\n ];\n}\n"],"mappings":";;AAKA,SAAgB,mBACd,UACgF;CAChF,OAAO,CACL,CACEA,aAAAA,oBACA;EACE,aAAaC,aAAAA;EACb,SAAS,OAAO,MAAM,QAAQ,SAAS,MAAM,KAAK,IAAI;CACxD,CACF,GACA,CACEC,aAAAA,mBACA;EACE,aAAaC,aAAAA;EACb,SAAS,OAAO,OAAO,QAAQ,SAAS,KAAK,GAAG;CAClD,CACF,CACF;AACF"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { LIST_COMMAND_DESCRIPTION, LIST_COMMAND_NAME, START_COMMAND_DESCRIPTION, START_COMMAND_NAME } from "../../constants/loop.mjs";
|
|
2
|
-
//#region src/services/loopCommand/index.ts
|
|
3
|
-
function createLoopCommands(handlers) {
|
|
4
|
-
return [[START_COMMAND_NAME, {
|
|
5
|
-
description: START_COMMAND_DESCRIPTION,
|
|
6
|
-
handler: async (args, ctx) => handlers.start(ctx, args)
|
|
7
|
-
}], [LIST_COMMAND_NAME, {
|
|
8
|
-
description: LIST_COMMAND_DESCRIPTION,
|
|
9
|
-
handler: async (_args, ctx) => handlers.list(ctx)
|
|
10
|
-
}]];
|
|
11
|
-
}
|
|
12
|
-
//#endregion
|
|
13
|
-
export { createLoopCommands };
|
|
14
|
-
|
|
15
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/loopCommand/index.ts"],"sourcesContent":["import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nimport { START_COMMAND_DESCRIPTION, LIST_COMMAND_DESCRIPTION } from '../../constants/loop';\nimport { LIST_COMMAND_NAME, START_COMMAND_NAME } from '../../constants/loop';\nimport type { LoopCommandHandlers } from '../../types/loopCommand';\nexport function createLoopCommands(\n handlers: LoopCommandHandlers,\n): readonly (readonly [string, Parameters<ExtensionAPI['registerCommand']>[1]])[] {\n return [\n [\n START_COMMAND_NAME,\n {\n description: START_COMMAND_DESCRIPTION,\n handler: async (args, ctx) => handlers.start(ctx, args),\n },\n ],\n [\n LIST_COMMAND_NAME,\n {\n description: LIST_COMMAND_DESCRIPTION,\n handler: async (_args, ctx) => handlers.list(ctx),\n },\n ],\n ];\n}\n"],"mappings":";;AAKA,SAAgB,mBACd,UACgF;CAChF,OAAO,CACL,CACE,oBACA;EACE,aAAa;EACb,SAAS,OAAO,MAAM,QAAQ,SAAS,MAAM,KAAK,IAAI;CACxD,CACF,GACA,CACE,mBACA;EACE,aAAa;EACb,SAAS,OAAO,OAAO,QAAQ,SAAS,KAAK,GAAG;CAClD,CACF,CACF;AACF"}
|