@agimon-ai/doompi-loop 0.0.1-alpha.81 → 0.0.1-alpha.83
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/dist/{src/schemas/apiContracts.cjs → apiContracts.cjs} +5 -1
- package/dist/apiContracts.cjs.map +1 -0
- package/dist/{src/schemas/apiContracts.d.mts.map → apiContracts.d.mts.map} +1 -1
- package/dist/{src/schemas/apiContracts.mjs → apiContracts.mjs} +1 -1
- package/dist/apiContracts.mjs.map +1 -0
- package/dist/extensions/pi.cjs +596 -13
- package/dist/extensions/pi.cjs.map +1 -1
- package/dist/extensions/pi.d.mts +1 -1
- package/dist/extensions/pi.d.mts.map +1 -1
- package/dist/extensions/pi.mjs +590 -7
- package/dist/extensions/pi.mjs.map +1 -1
- package/dist/extensions/server.cjs +326 -14
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.d.mts +1 -1
- package/dist/extensions/server.d.mts.map +1 -1
- package/dist/extensions/server.mjs +320 -8
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/{src/schemas/loopLaunchers.cjs → loopLaunchers-BtcLH_xN.cjs} +19 -4
- package/dist/loopLaunchers-BtcLH_xN.cjs.map +1 -0
- package/dist/{src/schemas/loopLaunchers.d.cts → loopLaunchers-CPUUrDzQ.d.mts} +12 -11
- package/dist/loopLaunchers-CPUUrDzQ.d.mts.map +1 -0
- package/dist/{src/schemas/loopLaunchers.mjs → loopLaunchers-cCniFbVA.mjs} +2 -2
- package/dist/loopLaunchers-cCniFbVA.mjs.map +1 -0
- package/dist/loopLaunchers.cjs +1 -1
- package/dist/loopLaunchers.d.mts +1 -1
- package/dist/loopLaunchers.mjs +1 -1
- package/dist/{src/services/loopLaunchers/index.mjs → loopView-CLIBhqYC.cjs} +64 -2
- package/dist/loopView-CLIBhqYC.cjs.map +1 -0
- package/dist/{src/services/loopLaunchers/index.cjs → loopView-CmuIEbUa.mjs} +23 -2
- package/dist/loopView-CmuIEbUa.mjs.map +1 -0
- package/package.json +13 -12
- 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.d.cts +0 -5
- package/dist/extensions/pi.d.cts.map +0 -1
- package/dist/extensions/server.d.cts +0 -5
- package/dist/extensions/server.d.cts.map +0 -1
- package/dist/index.d.cts +0 -2
- package/dist/loopLaunchers.d.cts +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.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.mjs.map +0 -1
- package/dist/src/schemas/loopLaunchers.cjs.map +0 -1
- 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.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.map +0 -1
- 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
- /package/dist/{src/schemas/apiContracts.d.mts → apiContracts.d.mts} +0 -0
|
@@ -1 +1 @@
|
|
|
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"}
|
|
1
|
+
{"version":3,"file":"pi.mjs","names":["EMPTY_MESSAGE","runtime","rootSession","commandLoop","commandLoops","hookAgentSettled","resourceDoompiUseLoop"],"sources":["../../src/constants/piLoop.ts","../../src/services/loopCommand/index.ts","../../src/services/defaultLoopLauncher/index.ts","../../src/tui/leader.ts","../../src/tui/loopListOverlay.ts","../../src/tui/startLoopOverlay.ts","../../src/tui/loopRuntime.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/runtime.cli.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/loop.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/loops.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.cli.ts","../../generated/pi.ts"],"sourcesContent":["export const PACKAGE_SOURCE = '@agimon-ai/doompi-loop';\nexport const LOOPS_GROUP_ORDER = 60;\nexport const STATUS_KEY = 'doom-loop';\nexport const MODE_STATUS_ID = 'loop.active';\nexport const ACTIVE_MODE_COLOR = 'warning';\nexport const NOTIFY_INFO_LEVEL = 'info';\nexport const NOTIFY_WARNING_LEVEL = 'warning';\n","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","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","import type { DoomUiHubService } from '@agimon-ai/doompi-core/uiHub';\n\nimport { LIST_COMMAND_NAME, START_COMMAND_NAME } from '../constants/loop';\nimport { LOOPS_GROUP_ORDER, PACKAGE_SOURCE } from '../constants/piLoop';\n\nconst LOOPS_GROUP_SEGMENT = {\n key: 'l',\n label: 'loops',\n detail: 'recurring prompt loops',\n order: LOOPS_GROUP_ORDER,\n} as const;\n\nexport function registerLeaderContribution(hub: DoomUiHubService): () => void {\n const contribution = hub.registerLeader({\n source: PACKAGE_SOURCE,\n bindings: [\n {\n id: 'loop.start',\n path: [LOOPS_GROUP_SEGMENT, { key: 's', label: 'start', detail: 'begin a recurring loop' }],\n command: { name: START_COMMAND_NAME },\n },\n {\n id: 'loop.list',\n path: [LOOPS_GROUP_SEGMENT, { key: 'l', label: 'list', detail: 'loops in this session' }],\n command: { name: LIST_COMMAND_NAME },\n },\n ],\n });\n return () => contribution.dispose();\n}\n","import {\n DOOM_FULLSCREEN_UI_OPTIONS,\n DOOM_NAVIGATION_KEYS,\n DOOM_OVERLAY_ACCENT,\n DoomOverlay,\n type DoomOverlayChrome,\n type DoomOverlayTui,\n} from '@agimon-ai/doompi-ui/doomOverlay';\nimport type { ExtensionContext, Theme } from '@earendil-works/pi-coding-agent';\nimport { matchesKey, truncateToWidth } from '@earendil-works/pi-tui';\n\nimport type { DoomLoopLaunchersService, LoopInstanceSnapshot } from '../schemas/loopLaunchers';\n\nconst EMPTY_MESSAGE = 'No loop instances are active in this session.';\nconst STOP_SCOPE_MESSAGE = 'Stopping a loop does not cancel detached work already launched.';\nconst STOP_REASON = 'Stopped from the loop list.';\n\nexport class LoopListOverlay extends DoomOverlay {\n private readonly unsubscribe: () => void;\n private instances: readonly LoopInstanceSnapshot[];\n private selected = 0;\n\n constructor(\n tui: DoomOverlayTui,\n theme: Theme,\n private readonly client: DoomLoopLaunchersService,\n private readonly done: (result: undefined) => void,\n ) {\n super(tui, theme);\n this.instances = client.listInstances();\n this.unsubscribe = client.subscribe(() => this.refresh());\n }\n\n dispose(): void {\n this.unsubscribe();\n }\n\n handleInput(data: string): void {\n if (matchesKey(data, 'escape') || matchesKey(data, 'ctrl+c') || data === 'q') {\n this.done(undefined);\n return;\n }\n if (matchesKey(data, 'up') || data === 'k') {\n this.move(-1);\n return;\n }\n if (matchesKey(data, 'down') || data === 'j') {\n this.move(1);\n return;\n }\n if (data === 'x') {\n const instance = this.instances[this.selected];\n if (instance) void this.client.stop(instance.instanceId, STOP_REASON);\n }\n }\n\n protected getChrome(): DoomOverlayChrome {\n return {\n title: 'LOOPS',\n breadcrumb: 'SPC › l / loops › l / list',\n headerRight: `${this.instances.length} active`,\n footer: `${DOOM_NAVIGATION_KEYS.list} move · x stop · esc close · launched detached work continues`,\n footerHints: [\n [DOOM_NAVIGATION_KEYS.list, 'move'],\n ['x', 'stop scheduling'],\n ['esc', 'close'],\n ],\n accent: DOOM_OVERLAY_ACCENT,\n };\n }\n\n protected renderBody(width: number): string[] {\n const stopScope = this.theme.fg('dim', truncateToWidth(STOP_SCOPE_MESSAGE, width));\n if (!this.instances.length) return [this.theme.fg('dim', EMPTY_MESSAGE), '', stopScope];\n return [\n stopScope,\n '',\n ...this.instances.flatMap((instance, index) => {\n const marker = index === this.selected ? this.theme.fg('accent', '▸') : ' ';\n const name = instance.label ?? instance.launcherLabel;\n const state = this.theme.fg(instance.state === 'running' ? 'success' : 'warning', instance.state);\n const line = truncateToWidth(`${marker} ${name} · ${state}`, width);\n const detail = instance.detail ?? instance.instanceId;\n return [line, ` ${this.theme.fg('dim', truncateToWidth(detail, Math.max(0, width - 4)))}`];\n }),\n ];\n }\n\n private refresh(): void {\n this.instances = this.client.listInstances();\n this.selected = Math.min(this.selected, Math.max(0, this.instances.length - 1));\n this.invalidate();\n }\n\n private move(delta: number): void {\n if (!this.instances.length) return;\n this.selected = Math.max(0, Math.min(this.selected + delta, this.instances.length - 1));\n this.invalidate();\n }\n}\n\nexport async function openLoopListOverlay(ctx: ExtensionContext, client: DoomLoopLaunchersService): Promise<void> {\n if (ctx.mode !== 'tui') {\n const instances = client.listInstances();\n const labels = instances.map((instance) => `${instance.label ?? instance.launcherLabel} (${instance.instanceId})`);\n const selected = await ctx.ui.select('Stop loop scheduling', labels);\n const instance = instances[labels.indexOf(selected ?? '')];\n if (instance) await client.stop(instance.instanceId, STOP_REASON);\n return;\n }\n await ctx.ui.custom<undefined>(\n (tui, theme, _keybindings, done) => new LoopListOverlay(tui, theme, client, done),\n DOOM_FULLSCREEN_UI_OPTIONS,\n );\n}\n","import {\n DOOM_FULLSCREEN_UI_OPTIONS,\n DOOM_NAVIGATION_KEYS,\n DOOM_OVERLAY_ACCENT,\n DoomOverlay,\n type DoomOverlayChrome,\n type DoomOverlayTui,\n} from '@agimon-ai/doompi-ui/doomOverlay';\nimport type { ExtensionContext, Theme } from '@earendil-works/pi-coding-agent';\nimport { matchesKey, truncateToWidth } from '@earendil-works/pi-tui';\n\nimport type { LoopLauncherSummary } from '../schemas/loopLaunchers';\n\nconst EMPTY_MESSAGE = 'No loop launchers are registered for this session.';\n\nexport class StartLoopOverlay extends DoomOverlay {\n private selected = 0;\n\n constructor(\n tui: DoomOverlayTui,\n theme: Theme,\n private readonly launchers: readonly LoopLauncherSummary[],\n private readonly done: (result: string | undefined) => void,\n ) {\n super(tui, theme);\n }\n\n handleInput(data: string): void {\n if (matchesKey(data, 'escape') || matchesKey(data, 'ctrl+c') || data === 'q') {\n this.done(undefined);\n return;\n }\n if (matchesKey(data, 'up') || data === 'k') {\n this.move(-1);\n return;\n }\n if (matchesKey(data, 'down') || data === 'j') {\n this.move(1);\n return;\n }\n if (matchesKey(data, 'enter')) this.done(this.launchers[this.selected]?.id);\n }\n\n protected getChrome(): DoomOverlayChrome {\n return {\n title: 'START LOOP',\n breadcrumb: 'SPC › l / loops › s / start',\n footer: `${DOOM_NAVIGATION_KEYS.list} move · enter launch · esc close`,\n footerHints: [\n [DOOM_NAVIGATION_KEYS.list, 'move'],\n ['enter', 'launch'],\n ['esc', 'close'],\n ],\n accent: DOOM_OVERLAY_ACCENT,\n };\n }\n\n protected renderBody(width: number): string[] {\n if (!this.launchers.length) return [this.theme.fg('dim', EMPTY_MESSAGE)];\n return this.launchers.flatMap((launcher, index) => {\n const selected = index === this.selected;\n const marker = selected ? this.theme.fg('accent', '▸') : ' ';\n const label = selected ? this.theme.bold(launcher.label) : launcher.label;\n const lines = [`${marker} ${truncateToWidth(label, Math.max(0, width - 2))}`];\n if (launcher.description)\n lines.push(` ${this.theme.fg('dim', truncateToWidth(launcher.description, Math.max(0, width - 4)))}`);\n return lines;\n });\n }\n\n private move(delta: number): void {\n if (!this.launchers.length) return;\n this.selected = Math.max(0, Math.min(this.selected + delta, this.launchers.length - 1));\n this.invalidate();\n }\n}\n\nexport async function openStartLoopOverlay(\n ctx: ExtensionContext,\n launchers: readonly LoopLauncherSummary[],\n): Promise<string | undefined> {\n if (ctx.mode !== 'tui') {\n const labels = launchers.map((launcher) => launcher.label);\n const selected = await ctx.ui.select('Start loop', labels);\n return launchers[labels.indexOf(selected ?? '')]?.id;\n }\n return ctx.ui.custom<string | undefined>(\n (tui, theme, _keybindings, done) => new StartLoopOverlay(tui, theme, launchers, done),\n DOOM_FULLSCREEN_UI_OPTIONS,\n );\n}\n","import { DOOM_CORDIS_SESSION_SERVICE, type DoomCordisSessionService } from '@agimon-ai/doompi-core/cordisHost';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-core/uiHub';\nimport { defineMinorMode, type MinorModeOwner, type MinorModeState } from '@agimon-ai/doompi-minor-mode';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport {\n ACTIVE_MODE_COLOR,\n LOOPS_GROUP_ORDER,\n MODE_STATUS_ID,\n NOTIFY_INFO_LEVEL,\n PACKAGE_SOURCE,\n STATUS_KEY,\n} from '../constants/piLoop';\nimport {\n DOOM_LOOP_LAUNCHERS_SERVICE,\n type DoomLoopLaunchersService,\n type LoopInstanceSnapshot,\n type LoopLauncherRegistration,\n type LoopLauncherSummary,\n} from '../schemas/loopLaunchers';\nimport { createDefaultLoopLauncher } from '../services/defaultLoopLauncher';\nimport { createDoomLoopLaunchersService } from '../services/loopLaunchers';\nimport { formatLoopStatusView, LOOP_VIEW_STATUS_KEY } from '../types/loopView';\nimport { registerLeaderContribution } from './leader';\nimport { openLoopListOverlay } from './loopListOverlay';\nimport { openStartLoopOverlay } from './startLoopOverlay';\n\nconst MODE_ACTION_START = 'start';\nconst MODE_ACTION_STOP = 'stop';\nconst SESSION_REPLACED_REASON = 'Pi session replaced.';\nconst SESSION_SHUTDOWN_REASON = 'Pi session shut down.';\n\ninterface ActiveLoopSession {\n readonly context: ExtensionContext;\n readonly hostSession: DoomCordisSessionService;\n readonly launchers: DoomLoopLaunchersService;\n}\n\nfunction loopModeState(\n launchers: readonly LoopLauncherSummary[],\n instances: readonly LoopInstanceSnapshot[],\n): MinorModeState {\n const active = instances.length > 0;\n return {\n activation: active ? 'active' : 'inactive',\n condition: instances.some(({ state }) => state === 'starting' || state === 'stopping') ? 'queued' : 'ready',\n ...(active ? { detail: `${instances.length} active`, color: ACTIVE_MODE_COLOR } : {}),\n actions: [\n ...(launchers.length > 0\n ? [{ id: MODE_ACTION_START, enabled: true } as const]\n : [{ id: MODE_ACTION_START, enabled: false, disabledReason: 'No loop launchers are registered.' } as const]),\n ...(active\n ? [{ id: MODE_ACTION_STOP, enabled: true } as const]\n : [{ id: MODE_ACTION_STOP, enabled: false, disabledReason: 'No loops are active.' } as const]),\n ],\n };\n}\n\nimport type { LoopCommandHandlers } from '../types/loopCommand';\ninterface LoopPiRuntime {\n onAgentSettled(this: void): void;\n services: Array<(context: Context) => void>;\n handlers: LoopCommandHandlers;\n minorModes: MinorModeOwner[];\n onDispose(): void;\n}\n/** Install Loop state and external resources into its host-owned Cordis plugin fiber. */\nexport function createLoopPiRuntime(pi: ExtensionAPI): LoopPiRuntime {\n let active = true;\n let activeSession: ActiveLoopSession | undefined;\n let mode: MinorModeOwner | undefined;\n let disposeLeader: (() => void) | undefined;\n const launchesInProgress = new WeakSet<ActiveLoopSession>();\n\n const currentSession = (context: ExtensionContext): ActiveLoopSession | undefined => {\n const binding = activeSession;\n if (\n !active ||\n !binding ||\n binding.context.sessionManager !== context.sessionManager ||\n binding.hostSession.sessionId !== context.sessionManager.getSessionId()\n ) {\n return undefined;\n }\n return binding;\n };\n\n const clearStatuses = (binding: ActiveLoopSession): void => {\n binding.context.ui?.setStatus(STATUS_KEY, undefined);\n if (binding.context.mode !== 'tui') binding.context.ui?.setStatus(LOOP_VIEW_STATUS_KEY, undefined);\n };\n const publishStatus = (binding: ActiveLoopSession): void => {\n if (!active || activeSession !== binding) return;\n const instances = binding.launchers.listInstances();\n binding.context.ui?.setStatus(STATUS_KEY, instances.length ? `loops: ${instances.length}` : undefined);\n if (binding.context.mode !== 'tui') {\n binding.context.ui?.setStatus(LOOP_VIEW_STATUS_KEY, formatLoopStatusView(instances));\n }\n mode?.publish();\n };\n\n const defaultLauncher = createDefaultLoopLauncher(pi);\n\n mode = defineMinorMode({\n descriptor: {\n source: PACKAGE_SOURCE,\n id: MODE_STATUS_ID,\n label: 'Loop',\n description: 'Session-scoped recurring prompt loops.',\n order: LOOPS_GROUP_ORDER,\n actions: [\n {\n id: MODE_ACTION_START,\n label: 'Start',\n description: 'Start a loop with a registered launcher.',\n contexts: ['tui', 'headless'],\n parameters: [\n { name: 'launcherId', label: 'Launcher', kind: 'string', required: true, minLength: 1 },\n { name: 'instanceId', label: 'Instance ID', kind: 'string', required: false, minLength: 1 },\n ],\n },\n {\n id: MODE_ACTION_STOP,\n label: 'Stop',\n description: 'Stop one active loop instance.',\n contexts: ['tui', 'headless'],\n parameters: [\n { name: 'instanceId', label: 'Instance ID', kind: 'string', required: true, minLength: 1 },\n { name: 'reason', label: 'Reason', kind: 'string', required: false, minLength: 1 },\n ],\n },\n ],\n },\n state: () =>\n activeSession\n ? loopModeState(activeSession.launchers.listLaunchers(), activeSession.launchers.listInstances())\n : loopModeState([], []),\n async handleAction(_runtime, actionId, argumentsValue, { signal }) {\n signal.throwIfAborted();\n const binding = activeSession ? currentSession(activeSession.context) : undefined;\n if (!binding) throw new Error('Loop launchers are unavailable for the active session.');\n if (actionId === MODE_ACTION_START) {\n const instance = await binding.launchers.launch(\n argumentsValue.launcherId as string,\n argumentsValue.instanceId ? { instanceId: argumentsValue.instanceId as string } : {},\n );\n if (activeSession !== binding) throw new Error('Loop action became stale.');\n return { message: instance ? `Loop '${instance.instanceId}' started.` : 'Loop launch was cancelled.' };\n }\n if (actionId === MODE_ACTION_STOP) {\n const stopped = await binding.launchers.stop(\n argumentsValue.instanceId as string,\n (argumentsValue.reason as string | undefined) ?? 'Stopped through minor_mode.',\n );\n if (activeSession !== binding) throw new Error('Loop action became stale.');\n return { message: stopped ? 'Loop stopped.' : 'Loop instance was not active.' };\n }\n throw new Error(`Unknown loop mode action: ${actionId}`);\n },\n }).createOwner(undefined);\n return {\n onAgentSettled: defaultLauncher.onAgentSettled,\n services: [\n (cordis: Context) => {\n cordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) => {\n const dispose = registerLeaderContribution(requireDoomUiHub(uiContext));\n disposeLeader = dispose;\n return () => {\n dispose();\n if (disposeLeader === dispose) disposeLeader = undefined;\n };\n });\n\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE], async (sessionContext) => {\n const hostSession = sessionContext.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const launchers = createDoomLoopLaunchersService({\n generation: `${hostSession.generation}:loop-launchers`,\n createInstanceId: () => crypto.randomUUID(),\n timestamp: () => new Date().toISOString(),\n });\n const binding: ActiveLoopSession = { context: hostSession.context, hostSession, launchers };\n activeSession = binding;\n const provider = cordis.plugin((providerContext) => {\n providerContext.provide(DOOM_LOOP_LAUNCHERS_SERVICE, launchers);\n });\n\n let defaultRegistration: LoopLauncherRegistration;\n let unsubscribe: () => void;\n try {\n defaultRegistration = defaultLauncher.register(hostSession.context, launchers);\n unsubscribe = launchers.subscribe(() => publishStatus(binding));\n publishStatus(binding);\n } catch (error) {\n if (activeSession === binding) activeSession = undefined;\n await launchers.dispose(SESSION_REPLACED_REASON);\n await provider.dispose();\n throw error;\n }\n\n return async () => {\n if (activeSession === binding) activeSession = undefined;\n unsubscribe();\n clearStatuses(binding);\n mode?.publish();\n const cleanupErrors: unknown[] = [];\n try {\n await defaultRegistration.dispose(SESSION_REPLACED_REASON);\n } catch (error) {\n cleanupErrors.push(error);\n }\n try {\n await launchers.dispose(SESSION_SHUTDOWN_REASON);\n } catch (error) {\n cleanupErrors.push(error);\n }\n try {\n await provider.dispose();\n } catch (error) {\n cleanupErrors.push(error);\n }\n if (cleanupErrors.length > 0) throw new AggregateError(cleanupErrors, 'Loop session cleanup failed.');\n };\n });\n },\n ],\n handlers: {\n async start(ctx, args) {\n const binding = currentSession(ctx);\n if (!binding) return;\n if (launchesInProgress.has(binding)) {\n ctx.ui.notify('A loop setup is already in progress.', NOTIFY_INFO_LEVEL);\n return;\n }\n launchesInProgress.add(binding);\n try {\n const launchers = binding.launchers.listLaunchers();\n if (!launchers.length) {\n ctx.ui.notify('No loop launchers are registered for this session.', NOTIFY_INFO_LEVEL);\n return;\n }\n\n const argument = args.trim();\n let launcherId: string | undefined;\n if (argument) {\n if (argument.split(/\\s+/u).length !== 1) {\n ctx.ui.notify('Usage: /loop [launcherId]', 'error');\n return;\n }\n if (!launchers.some((launcher) => launcher.id === argument)) {\n ctx.ui.notify(`Unknown loop launcher: ${argument}`, 'error');\n return;\n }\n launcherId = argument;\n } else {\n launcherId = await openStartLoopOverlay(ctx, launchers);\n if (activeSession !== binding || !launcherId) return;\n }\n\n const instance = await binding.launchers.launch(launcherId);\n if (activeSession !== binding) return;\n if (instance) ctx.ui.notify(`${instance.label ?? instance.launcherLabel} started.`, NOTIFY_INFO_LEVEL);\n } catch (error) {\n if (activeSession !== binding) return;\n ctx.ui.notify(`Loop could not start: ${error instanceof Error ? error.message : String(error)}`, 'error');\n } finally {\n launchesInProgress.delete(binding);\n }\n },\n async list(ctx) {\n const binding = currentSession(ctx);\n if (!binding) return;\n await openLoopListOverlay(ctx, binding.launchers);\n },\n },\n minorModes: [mode],\n onDispose() {\n active = false;\n const binding = activeSession;\n activeSession = undefined;\n if (binding) clearStatuses(binding);\n mode?.publish();\n disposeLeader?.();\n disposeLeader = undefined;\n },\n };\n}\n","import type { PiPluginContext, PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { piMinorModes } from '@agimon-ai/doompi-minor-mode';\n\nimport { PACKAGE_SOURCE } from '../../../../../constants/piLoop';\nimport { createLoopCommands } from '../../../../../services/loopCommand';\nimport { createLoopPiRuntime } from '../../../../../tui/loopRuntime';\n\nexport default (({ pi }) => {\n const runtime = createLoopPiRuntime(pi);\n return {\n services: [...(runtime.services ?? []), piMinorModes(runtime.minorModes)],\n events: { agent_settled: runtime.onAgentSettled },\n commands: createLoopCommands(runtime.handlers),\n\n onDispose: () => runtime.onDispose(),\n resources: [\n {\n source: PACKAGE_SOURCE,\n moduleUrl: import.meta.url,\n skills: [\n {\n name: 'doompi-use-loop',\n description: 'Use Doom Pi Loop to start, inspect, and stop session-scoped recurring prompts safely.',\n },\n ],\n },\n ],\n };\n}) satisfies (context: PiPluginContext<undefined>) => PiPluginContributions<undefined>;\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport runtime from './_lib/runtime.cli';\n\nexport default defineRoot((context: PiPluginContext<undefined>) => {\n const value = runtime(context);\n return {\n value,\n services: value.services,\n onDispose: value.onDispose,\n };\n});\n","import { defineCliCommand, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\n\nexport default defineCliCommand(\n (context: WithRoot<PiPluginContext<undefined>, PiPluginContributions<undefined>>) => context.root.commands![0]!,\n);\n","import { defineCliCommand, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\n\nexport default defineCliCommand(\n (context: WithRoot<PiPluginContext<undefined>, PiPluginContributions<undefined>>) => context.root.commands![1]!,\n);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\n\nexport default defineCliHook(\n (context: WithRoot<PiPluginContext<undefined>, PiPluginContributions<undefined>>) =>\n context.root.events!['agent_settled']!,\n);\n","import { defineResource, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\n\nexport default defineResource(\n (context: WithRoot<PiPluginContext<undefined>, PiPluginContributions<undefined>>) => context.root.resources![0]!,\n);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\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":"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"}
|
|
@@ -2,14 +2,326 @@ Object.defineProperties(exports, {
|
|
|
2
2
|
__esModule: { value: true },
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
const require_loopView = require("../loopView-CLIBhqYC.cjs");
|
|
6
|
+
let _agimon_ai_doompi_core_extensionFile = require("@agimon-ai/doompi-core/extensionFile");
|
|
7
|
+
let _agimon_ai_doompi_minor_mode = require("@agimon-ai/doompi-minor-mode");
|
|
8
|
+
let _agimon_ai_doompi_core_serverFacet = require("@agimon-ai/doompi-core/serverFacet");
|
|
9
|
+
//#region src/services/serverRuntime/index.ts
|
|
10
|
+
const SOURCE = "@agimon-ai/doompi-loop";
|
|
11
|
+
const MODE_ID = "loop.active";
|
|
12
|
+
const DEFAULT_LAUNCHER_ID = "doompi.default";
|
|
13
|
+
const DEFAULT_INTERVAL_SECONDS = 300;
|
|
14
|
+
const MIN_INTERVAL_SECONDS = 30;
|
|
15
|
+
const MAX_INTERVAL_SECONDS = 3600;
|
|
16
|
+
function notify(context, body, level = "info") {
|
|
17
|
+
return Promise.resolve(context.client.notify({
|
|
18
|
+
body,
|
|
19
|
+
level
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
function numberInput(value, fallback) {
|
|
23
|
+
if (typeof value !== "string" || value.trim() === "") return fallback;
|
|
24
|
+
const parsed = Number(value);
|
|
25
|
+
if (!Number.isInteger(parsed) || parsed < MIN_INTERVAL_SECONDS || parsed > MAX_INTERVAL_SECONDS) throw new Error(`Interval must be between ${MIN_INTERVAL_SECONDS} and ${MAX_INTERVAL_SECONDS} seconds.`);
|
|
26
|
+
return parsed;
|
|
27
|
+
}
|
|
28
|
+
function createSessionState(host) {
|
|
29
|
+
let launchers;
|
|
30
|
+
let defaultRegistration;
|
|
31
|
+
let unsubscribe;
|
|
32
|
+
let modeOwner;
|
|
33
|
+
const modeSelected = () => (host.context.selection.state?.["minor-mode"] ?? []).includes(MODE_ID);
|
|
34
|
+
const modeState = () => {
|
|
35
|
+
const launcherCount = launchers?.listLaunchers().length ?? 0;
|
|
36
|
+
const active = (launchers?.listInstances().length ?? 0) > 0;
|
|
37
|
+
const canStart = launcherCount > 0 || !modeSelected();
|
|
38
|
+
return {
|
|
39
|
+
activation: active ? "active" : "inactive",
|
|
40
|
+
condition: launchers?.listInstances().some(({ state }) => state !== "running") ? "queued" : "ready",
|
|
41
|
+
...active ? {
|
|
42
|
+
detail: `${launchers?.listInstances().length} active`,
|
|
43
|
+
color: "warning"
|
|
44
|
+
} : {},
|
|
45
|
+
actions: [{
|
|
46
|
+
id: "start",
|
|
47
|
+
enabled: canStart,
|
|
48
|
+
...canStart ? {} : { disabledReason: "No loop launchers are registered." }
|
|
49
|
+
}, {
|
|
50
|
+
id: "stop",
|
|
51
|
+
enabled: active,
|
|
52
|
+
...active ? {} : { disabledReason: "No loops are active." }
|
|
53
|
+
}]
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* The instances the activity dock lists.
|
|
58
|
+
*
|
|
59
|
+
* An empty list publishes an empty value rather than nothing, because the key
|
|
60
|
+
* being present is what keeps the group on screen as a launcher. The group
|
|
61
|
+
* declares no `hideWhenEmpty`, so an empty value is a header with no rows.
|
|
62
|
+
*/
|
|
63
|
+
const publishView = () => host.context.client.setStatus(require_loopView.LOOP_VIEW_STATUS_KEY, require_loopView.formatLoopStatusView(launchers?.listInstances() ?? []));
|
|
64
|
+
/** Both surfaces a loop shows up on: the minor-mode catalog and the activity dock. */
|
|
65
|
+
const publishMode = () => {
|
|
66
|
+
modeOwner?.publish();
|
|
67
|
+
publishView();
|
|
68
|
+
};
|
|
69
|
+
const startActivity = async (execution) => {
|
|
70
|
+
if (launchers !== void 0) return async () => void 0;
|
|
71
|
+
const dependencies = {
|
|
72
|
+
generation: `${execution.sessionId}:loop-launchers`,
|
|
73
|
+
createInstanceId: () => crypto.randomUUID(),
|
|
74
|
+
timestamp: () => (/* @__PURE__ */ new Date()).toISOString()
|
|
75
|
+
};
|
|
76
|
+
const service = require_loopView.createDoomLoopLaunchersService(dependencies);
|
|
77
|
+
const registration = service.register({
|
|
78
|
+
id: DEFAULT_LAUNCHER_ID,
|
|
79
|
+
source: SOURCE,
|
|
80
|
+
label: "Default loop",
|
|
81
|
+
description: "Run a prompt in this session on an interval.",
|
|
82
|
+
async launch({ instanceId, signal }) {
|
|
83
|
+
const promptValue = await execution.client.request({
|
|
84
|
+
kind: "input",
|
|
85
|
+
title: "Loop prompt",
|
|
86
|
+
multiline: true
|
|
87
|
+
}, signal);
|
|
88
|
+
const prompt = typeof promptValue === "string" ? promptValue.trim() : "";
|
|
89
|
+
if (!prompt || signal.aborted) return void 0;
|
|
90
|
+
const interval = numberInput(await execution.client.request({
|
|
91
|
+
kind: "input",
|
|
92
|
+
title: "Loop interval in seconds",
|
|
93
|
+
initialValue: String(DEFAULT_INTERVAL_SECONDS)
|
|
94
|
+
}, signal), DEFAULT_INTERVAL_SECONDS);
|
|
95
|
+
let stopped = false;
|
|
96
|
+
const tick = () => {
|
|
97
|
+
if (stopped || signal.aborted) return;
|
|
98
|
+
execution.session.prompt(prompt).catch((error) => {
|
|
99
|
+
notify(execution, `Loop pass failed: ${error instanceof Error ? error.message : String(error)}`, "warning");
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
const timer = setInterval(tick, interval * 1e3);
|
|
103
|
+
timer.unref?.();
|
|
104
|
+
tick();
|
|
105
|
+
return {
|
|
106
|
+
instanceId,
|
|
107
|
+
label: "Default loop",
|
|
108
|
+
detail: `every ${interval}s`,
|
|
109
|
+
stop() {
|
|
110
|
+
stopped = true;
|
|
111
|
+
clearInterval(timer);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
launchers = service;
|
|
117
|
+
defaultRegistration = registration;
|
|
118
|
+
unsubscribe = service.subscribe(publishMode);
|
|
119
|
+
publishMode();
|
|
120
|
+
return async () => {
|
|
121
|
+
unsubscribe?.();
|
|
122
|
+
unsubscribe = void 0;
|
|
123
|
+
await registration.dispose("Headless loop activity stopped.");
|
|
124
|
+
await service.dispose("Headless loop activity stopped.");
|
|
125
|
+
if (launchers === service) launchers = void 0;
|
|
126
|
+
if (defaultRegistration === registration) defaultRegistration = void 0;
|
|
127
|
+
publishMode();
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
modeOwner = (0, _agimon_ai_doompi_minor_mode.defineMinorMode)({
|
|
131
|
+
descriptor: {
|
|
132
|
+
source: SOURCE,
|
|
133
|
+
id: MODE_ID,
|
|
134
|
+
label: "Loop",
|
|
135
|
+
description: "Session-scoped recurring prompt loops.",
|
|
136
|
+
order: 60,
|
|
137
|
+
actions: [{
|
|
138
|
+
id: "start",
|
|
139
|
+
label: "Start",
|
|
140
|
+
description: "Start a loop with a registered launcher.",
|
|
141
|
+
contexts: ["headless"],
|
|
142
|
+
parameters: [{
|
|
143
|
+
name: "launcherId",
|
|
144
|
+
label: "Launcher",
|
|
145
|
+
kind: "string",
|
|
146
|
+
required: true,
|
|
147
|
+
minLength: 1
|
|
148
|
+
}, {
|
|
149
|
+
name: "instanceId",
|
|
150
|
+
label: "Instance ID",
|
|
151
|
+
kind: "string",
|
|
152
|
+
required: false,
|
|
153
|
+
minLength: 1
|
|
154
|
+
}]
|
|
155
|
+
}, {
|
|
156
|
+
id: "stop",
|
|
157
|
+
label: "Stop",
|
|
158
|
+
description: "Stop one active loop instance.",
|
|
159
|
+
contexts: ["headless"],
|
|
160
|
+
parameters: [{
|
|
161
|
+
name: "instanceId",
|
|
162
|
+
label: "Instance ID",
|
|
163
|
+
kind: "string",
|
|
164
|
+
required: true,
|
|
165
|
+
minLength: 1
|
|
166
|
+
}, {
|
|
167
|
+
name: "reason",
|
|
168
|
+
label: "Reason",
|
|
169
|
+
kind: "string",
|
|
170
|
+
required: false,
|
|
171
|
+
minLength: 1
|
|
172
|
+
}]
|
|
173
|
+
}]
|
|
174
|
+
},
|
|
175
|
+
state: modeState,
|
|
176
|
+
async handleAction(_runtime, actionId, argumentsValue, { signal }) {
|
|
177
|
+
signal.throwIfAborted();
|
|
178
|
+
if (actionId === "start" && !launchers) {
|
|
179
|
+
const modes = (host.context.selection.state?.["minor-mode"] ?? []).filter((mode) => mode !== MODE_ID);
|
|
180
|
+
await host.changeSelection({
|
|
181
|
+
axis: "state",
|
|
182
|
+
key: "minor-mode",
|
|
183
|
+
values: [...modes, MODE_ID]
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
if (!launchers) throw new Error("Loop activity is not active.");
|
|
187
|
+
if (actionId === "start") {
|
|
188
|
+
const instance = await launchers.launch(String(argumentsValue.launcherId ?? ""), argumentsValue.instanceId ? { instanceId: String(argumentsValue.instanceId) } : {});
|
|
189
|
+
publishMode();
|
|
190
|
+
return { message: instance ? `Loop '${instance.instanceId}' started.` : "Loop launch was cancelled." };
|
|
191
|
+
}
|
|
192
|
+
if (actionId === "stop") {
|
|
193
|
+
const stopped = await launchers.stop(String(argumentsValue.instanceId ?? ""), String(argumentsValue.reason ?? "Stopped through minor_mode."));
|
|
194
|
+
if (stopped && launchers.listInstances().length === 0) {
|
|
195
|
+
const modes = (host.context.selection.state?.["minor-mode"] ?? []).filter((mode) => mode !== MODE_ID);
|
|
196
|
+
await host.changeSelection({
|
|
197
|
+
axis: "state",
|
|
198
|
+
key: "minor-mode",
|
|
199
|
+
values: modes
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
publishMode();
|
|
203
|
+
return { message: stopped ? "Loop stopped." : "Loop instance was not active." };
|
|
204
|
+
}
|
|
205
|
+
throw new Error(`Unknown loop mode action: ${actionId}`);
|
|
206
|
+
}
|
|
207
|
+
}).createOwner(void 0);
|
|
208
|
+
return {
|
|
209
|
+
services: [(0, _agimon_ai_doompi_minor_mode.serverMinorModes)([modeOwner])],
|
|
210
|
+
resources: [{
|
|
211
|
+
when: {
|
|
212
|
+
state: { "minor-mode": MODE_ID },
|
|
213
|
+
attribution: {
|
|
214
|
+
kind: "minor",
|
|
215
|
+
mode: MODE_ID
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
name: "doompi-use-loop",
|
|
219
|
+
kind: "skill",
|
|
220
|
+
read: () => (0, _agimon_ai_doompi_core_serverFacet.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/doompi-use-loop/SKILL.md")
|
|
221
|
+
}],
|
|
222
|
+
activities: [{
|
|
223
|
+
when: {
|
|
224
|
+
state: { "minor-mode": MODE_ID },
|
|
225
|
+
attribution: {
|
|
226
|
+
kind: "minor",
|
|
227
|
+
mode: MODE_ID
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
name: "doompi-loop",
|
|
231
|
+
start: startActivity
|
|
232
|
+
}],
|
|
233
|
+
commands: [{
|
|
234
|
+
name: require_loopView.START_COMMAND_NAME,
|
|
235
|
+
description: "Start a registered loop.",
|
|
236
|
+
async execute(args, execution) {
|
|
237
|
+
if (!launchers) {
|
|
238
|
+
const modes = host.context.selection.state?.["minor-mode"] ?? [];
|
|
239
|
+
await host.changeSelection({
|
|
240
|
+
axis: "state",
|
|
241
|
+
key: "minor-mode",
|
|
242
|
+
values: [...modes, MODE_ID]
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
if (!launchers) throw new Error("Loop activity is not active.");
|
|
246
|
+
const available = launchers.listLaunchers();
|
|
247
|
+
const selected = args.trim() || await execution.client.request({
|
|
248
|
+
kind: "select",
|
|
249
|
+
title: "Choose a loop launcher",
|
|
250
|
+
options: available.map((entry) => ({
|
|
251
|
+
label: entry.label,
|
|
252
|
+
value: entry.id
|
|
253
|
+
}))
|
|
254
|
+
});
|
|
255
|
+
const launcherId = args.trim() || (typeof selected === "string" ? selected : "");
|
|
256
|
+
if (!launcherId) return;
|
|
257
|
+
const instance = await launchers.launch(launcherId);
|
|
258
|
+
publishMode();
|
|
259
|
+
await notify(execution, instance ? `Loop '${instance.instanceId}' started.` : "Loop launch was cancelled.");
|
|
260
|
+
}
|
|
261
|
+
}, {
|
|
262
|
+
name: require_loopView.LIST_COMMAND_NAME,
|
|
263
|
+
description: "List and stop active loops.",
|
|
264
|
+
async execute(_args, execution) {
|
|
265
|
+
const instances = launchers?.listInstances() ?? [];
|
|
266
|
+
await notify(execution, instances.length === 0 ? "No loops are active." : JSON.stringify(instances, null, 2));
|
|
267
|
+
}
|
|
268
|
+
}],
|
|
269
|
+
hooks: [{
|
|
270
|
+
event: "session_start",
|
|
271
|
+
async handle() {
|
|
272
|
+
publishView();
|
|
273
|
+
}
|
|
274
|
+
}, {
|
|
275
|
+
when: {
|
|
276
|
+
state: { "minor-mode": MODE_ID },
|
|
277
|
+
attribution: {
|
|
278
|
+
kind: "minor",
|
|
279
|
+
mode: MODE_ID
|
|
280
|
+
}
|
|
281
|
+
},
|
|
282
|
+
event: "session_shutdown",
|
|
283
|
+
async handle() {
|
|
284
|
+
await launchers?.stopAll("Headless session shutdown.");
|
|
285
|
+
}
|
|
286
|
+
}],
|
|
287
|
+
async onDispose() {
|
|
288
|
+
await defaultRegistration?.dispose("Headless loop facet disposed.");
|
|
289
|
+
await launchers?.dispose("Headless loop facet disposed.");
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
//#endregion
|
|
294
|
+
//#region src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.ts
|
|
295
|
+
var runtime_server_default = (({ agent }) => agent ? createSessionState(agent) : {});
|
|
296
|
+
//#endregion
|
|
297
|
+
//#region src/extensions/workspaces/sessions/(backend)/root.server.ts
|
|
298
|
+
var root_server_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoot)((context) => {
|
|
299
|
+
const value = runtime_server_default(context);
|
|
300
|
+
return {
|
|
301
|
+
value,
|
|
302
|
+
services: value.services,
|
|
303
|
+
activities: value.activities,
|
|
304
|
+
onStart: value.onStart,
|
|
305
|
+
onStop: value.onStop,
|
|
306
|
+
onDispose: value.onDispose
|
|
307
|
+
};
|
|
308
|
+
});
|
|
309
|
+
//#endregion
|
|
310
|
+
//#region src/extensions/workspaces/sessions/(backend)/command/loop.server.ts
|
|
311
|
+
var loop_server_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoutedContribution)((context) => context.root.commands?.[0], { cardinality: "optional" });
|
|
312
|
+
//#endregion
|
|
313
|
+
//#region src/extensions/workspaces/sessions/(backend)/command/loops.server.ts
|
|
314
|
+
var loops_server_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoutedContribution)((context) => context.root.commands?.[1], { cardinality: "optional" });
|
|
315
|
+
//#endregion
|
|
316
|
+
//#region src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.ts
|
|
317
|
+
var session_shutdown_server_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoutedContribution)((context) => context.root.hooks?.find((hook) => hook.event === "session_shutdown"), { cardinality: "optional" });
|
|
318
|
+
//#endregion
|
|
319
|
+
//#region src/extensions/workspaces/sessions/(backend)/hook/session-start.server.ts
|
|
320
|
+
var session_start_server_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoutedContribution)((context) => context.root.hooks?.find((hook) => hook.event === "session_start"), { cardinality: "optional" });
|
|
321
|
+
//#endregion
|
|
322
|
+
//#region src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.ts
|
|
323
|
+
var doompi_use_loop_server_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoutedContribution)((context) => context.root.resources?.[0], { cardinality: "optional" });
|
|
324
|
+
//#endregion
|
|
13
325
|
//#region generated/server.ts
|
|
14
326
|
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
15
327
|
/* v8 ignore next -- generated normalization branch */
|
|
@@ -18,24 +330,24 @@ const via = (identity, value) => ({
|
|
|
18
330
|
...identity,
|
|
19
331
|
...value
|
|
20
332
|
});
|
|
21
|
-
const facet = (0,
|
|
333
|
+
const facet = (0, _agimon_ai_doompi_core_serverFacet.defineServerPlugin)({
|
|
22
334
|
name: "@agimon-ai/doompi-loop",
|
|
23
335
|
session: async (context) => {
|
|
24
|
-
const scopeSession = await
|
|
336
|
+
const scopeSession = await root_server_default(context);
|
|
25
337
|
const contextSession = {
|
|
26
338
|
...context,
|
|
27
339
|
root: scopeSession.value
|
|
28
340
|
};
|
|
29
341
|
return {
|
|
30
|
-
...(0,
|
|
342
|
+
...(0, _agimon_ai_doompi_core_extensionFile.composeRootHooks)(scopeSession),
|
|
31
343
|
get commands() {
|
|
32
|
-
return defined([via({ name: "loop" }, at(
|
|
344
|
+
return defined([via({ name: "loop" }, at(loop_server_default, contextSession)), via({ name: "loops" }, at(loops_server_default, contextSession))]);
|
|
33
345
|
},
|
|
34
346
|
get hooks() {
|
|
35
|
-
return defined([via({ event: "session_shutdown" }, at(
|
|
347
|
+
return defined([via({ event: "session_shutdown" }, at(session_shutdown_server_default, contextSession)), via({ event: "session_start" }, at(session_start_server_default, contextSession))]);
|
|
36
348
|
},
|
|
37
349
|
get resources() {
|
|
38
|
-
return defined([at(
|
|
350
|
+
return defined([at(doompi_use_loop_server_default, contextSession)]);
|
|
39
351
|
},
|
|
40
352
|
services: [...scopeSession.services ?? []],
|
|
41
353
|
get activities() {
|
|
@@ -1 +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"}
|
|
1
|
+
{"version":3,"file":"server.cjs","names":["LOOP_VIEW_STATUS_KEY","formatLoopStatusView","createDoomLoopLaunchersService","defineMinorMode","serverMinorModes","readPackageResource","START_COMMAND_NAME","LIST_COMMAND_NAME","defineRoot","runtime","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineServerPlugin","rootSession","composeRootHooks","commandLoop","commandLoops","hookSessionShutdown","hookSessionStart","resourceDoompiUseLoop"],"sources":["../../src/services/serverRuntime/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/runtime.server.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/command/loop.server.ts","../../src/extensions/workspaces/sessions/(backend)/command/loops.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server.ts","../../generated/server.ts"],"sourcesContent":["import { serverMinorModes } from '@agimon-ai/doompi-minor-mode';\nimport { defineMinorMode, type MinorModeOwner, type MinorModeState } from '@agimon-ai/doompi-minor-mode';\n\nimport { LIST_COMMAND_NAME, START_COMMAND_NAME } from '../../constants/loop';\nimport type { DoomLoopLaunchersService, LoopLauncherRegistration, StoppableLoop } from '../../schemas/loopLaunchers';\nimport { createDoomLoopLaunchersService, type LoopLaunchersDependencies } from '../../services/loopLaunchers';\nimport { formatLoopStatusView, LOOP_VIEW_STATUS_KEY } from '../../types/loopView';\n\nconst SOURCE = '@agimon-ai/doompi-loop';\nconst MODE_ID = 'loop.active';\nconst DEFAULT_LAUNCHER_ID = 'doompi.default';\nconst DEFAULT_INTERVAL_SECONDS = 300;\nconst MIN_INTERVAL_SECONDS = 30;\nconst MAX_INTERVAL_SECONDS = 3600;\n\nfunction notify(\n context: {\n client: { notify(request: { body: string; level?: 'info' | 'warning' | 'error' }): void | Promise<void> };\n },\n body: string,\n level: 'info' | 'warning' | 'error' = 'info',\n): Promise<void> {\n return Promise.resolve(context.client.notify({ body, level }));\n}\n\nfunction numberInput(value: unknown, fallback: number): number {\n if (typeof value !== 'string' || value.trim() === '') return fallback;\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < MIN_INTERVAL_SECONDS || parsed > MAX_INTERVAL_SECONDS) {\n throw new Error(`Interval must be between ${MIN_INTERVAL_SECONDS} and ${MAX_INTERVAL_SECONDS} seconds.`);\n }\n return parsed;\n}\n\nimport { type DoomHeadlessExecutionContext, type DoomHeadlessHostService } from '@agimon-ai/doompi-core/headless';\nimport { readPackageResource, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nexport function createSessionState(host: DoomHeadlessHostService): DoomServerSessionPlugin {\n let launchers: DoomLoopLaunchersService | undefined;\n let defaultRegistration: LoopLauncherRegistration | undefined;\n let unsubscribe: (() => void) | undefined;\n let modeOwner: MinorModeOwner | undefined;\n const modeSelected = (): boolean => (host.context.selection.state?.['minor-mode'] ?? []).includes(MODE_ID);\n const modeState = (): MinorModeState => {\n const launcherCount = launchers?.listLaunchers().length ?? 0;\n const active = (launchers?.listInstances().length ?? 0) > 0;\n const canStart = launcherCount > 0 || !modeSelected();\n return {\n activation: active ? 'active' : 'inactive',\n condition: launchers?.listInstances().some(({ state }) => state !== 'running') ? 'queued' : 'ready',\n ...(active ? { detail: `${launchers?.listInstances().length} active`, color: 'warning' } : {}),\n actions: [\n {\n id: 'start',\n enabled: canStart,\n ...(canStart ? {} : { disabledReason: 'No loop launchers are registered.' }),\n },\n {\n id: 'stop',\n enabled: active,\n ...(active ? {} : { disabledReason: 'No loops are active.' }),\n },\n ],\n };\n };\n /**\n * The instances the activity dock lists.\n *\n * An empty list publishes an empty value rather than nothing, because the key\n * being present is what keeps the group on screen as a launcher. The group\n * declares no `hideWhenEmpty`, so an empty value is a header with no rows.\n */\n const publishView = (): void =>\n host.context.client.setStatus(LOOP_VIEW_STATUS_KEY, formatLoopStatusView(launchers?.listInstances() ?? []));\n /** Both surfaces a loop shows up on: the minor-mode catalog and the activity dock. */\n const publishMode = (): void => {\n modeOwner?.publish();\n publishView();\n };\n const startActivity = async (execution: typeof host.context): Promise<() => Promise<void>> => {\n if (launchers !== undefined) return async () => undefined;\n const dependencies: LoopLaunchersDependencies = {\n generation: `${execution.sessionId}:loop-launchers`,\n createInstanceId: () => crypto.randomUUID(),\n timestamp: () => new Date().toISOString(),\n };\n const service = createDoomLoopLaunchersService(dependencies);\n const registration = service.register({\n id: DEFAULT_LAUNCHER_ID,\n source: SOURCE,\n label: 'Default loop',\n description: 'Run a prompt in this session on an interval.',\n async launch({ instanceId, signal }): Promise<StoppableLoop | undefined> {\n const promptValue = await execution.client.request(\n { kind: 'input', title: 'Loop prompt', multiline: true },\n signal,\n );\n const prompt = typeof promptValue === 'string' ? promptValue.trim() : '';\n if (!prompt || signal.aborted) return undefined;\n const interval = numberInput(\n await execution.client.request(\n { kind: 'input', title: 'Loop interval in seconds', initialValue: String(DEFAULT_INTERVAL_SECONDS) },\n signal,\n ),\n DEFAULT_INTERVAL_SECONDS,\n );\n let stopped = false;\n const tick = (): void => {\n if (stopped || signal.aborted) return;\n void execution.session.prompt(prompt).catch((error) => {\n void notify(\n execution,\n `Loop pass failed: ${error instanceof Error ? error.message : String(error)}`,\n 'warning',\n );\n });\n };\n const timer = setInterval(tick, interval * 1000);\n timer.unref?.();\n tick();\n return {\n instanceId,\n label: 'Default loop',\n detail: `every ${interval}s`,\n stop() {\n stopped = true;\n clearInterval(timer);\n },\n };\n },\n });\n launchers = service;\n defaultRegistration = registration;\n unsubscribe = service.subscribe(publishMode);\n publishMode();\n return async () => {\n unsubscribe?.();\n unsubscribe = undefined;\n await registration.dispose('Headless loop activity stopped.');\n await service.dispose('Headless loop activity stopped.');\n if (launchers === service) launchers = undefined;\n if (defaultRegistration === registration) defaultRegistration = undefined;\n publishMode();\n };\n };\n modeOwner = defineMinorMode({\n descriptor: {\n source: SOURCE,\n id: MODE_ID,\n label: 'Loop',\n description: 'Session-scoped recurring prompt loops.',\n order: 60,\n actions: [\n {\n id: 'start',\n label: 'Start',\n description: 'Start a loop with a registered launcher.',\n contexts: ['headless'],\n parameters: [\n { name: 'launcherId', label: 'Launcher', kind: 'string', required: true, minLength: 1 },\n { name: 'instanceId', label: 'Instance ID', kind: 'string', required: false, minLength: 1 },\n ],\n },\n {\n id: 'stop',\n label: 'Stop',\n description: 'Stop one active loop instance.',\n contexts: ['headless'],\n parameters: [\n { name: 'instanceId', label: 'Instance ID', kind: 'string', required: true, minLength: 1 },\n { name: 'reason', label: 'Reason', kind: 'string', required: false, minLength: 1 },\n ],\n },\n ],\n },\n state: modeState,\n async handleAction(_runtime, actionId, argumentsValue, { signal }) {\n signal.throwIfAborted();\n if (actionId === 'start' && !launchers) {\n const modes = (host.context.selection.state?.['minor-mode'] ?? []).filter((mode) => mode !== MODE_ID);\n await host.changeSelection({ axis: 'state', key: 'minor-mode', values: [...modes, MODE_ID] });\n }\n if (!launchers) throw new Error('Loop activity is not active.');\n if (actionId === 'start') {\n const instance = await launchers.launch(\n String(argumentsValue.launcherId ?? ''),\n argumentsValue.instanceId ? { instanceId: String(argumentsValue.instanceId) } : {},\n );\n publishMode();\n return { message: instance ? `Loop '${instance.instanceId}' started.` : 'Loop launch was cancelled.' };\n }\n if (actionId === 'stop') {\n const stopped = await launchers.stop(\n String(argumentsValue.instanceId ?? ''),\n String(argumentsValue.reason ?? 'Stopped through minor_mode.'),\n );\n if (stopped && launchers.listInstances().length === 0) {\n const modes = (host.context.selection.state?.['minor-mode'] ?? []).filter((mode) => mode !== MODE_ID);\n await host.changeSelection({ axis: 'state', key: 'minor-mode', values: modes });\n }\n publishMode();\n return { message: stopped ? 'Loop stopped.' : 'Loop instance was not active.' };\n }\n throw new Error(`Unknown loop mode action: ${actionId}`);\n },\n }).createOwner(undefined);\n return {\n services: [serverMinorModes([modeOwner])],\n resources: [\n {\n when: { state: { 'minor-mode': MODE_ID }, attribution: { kind: 'minor', mode: MODE_ID } },\n name: 'doompi-use-loop',\n kind: 'skill',\n read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-use-loop/SKILL.md'),\n },\n ],\n activities: [\n {\n when: { state: { 'minor-mode': MODE_ID }, attribution: { kind: 'minor', mode: MODE_ID } },\n name: 'doompi-loop',\n start: startActivity,\n },\n ],\n commands: [\n {\n name: START_COMMAND_NAME,\n description: 'Start a registered loop.',\n async execute(args: string, execution: DoomHeadlessExecutionContext) {\n if (!launchers) {\n const modes = host.context.selection.state?.['minor-mode'] ?? [];\n await host.changeSelection({ axis: 'state', key: 'minor-mode', values: [...modes, MODE_ID] });\n }\n if (!launchers) throw new Error('Loop activity is not active.');\n const available = launchers.listLaunchers();\n const selected =\n args.trim() ||\n (await execution.client.request({\n kind: 'select',\n title: 'Choose a loop launcher',\n options: available.map((entry) => ({ label: entry.label, value: entry.id })),\n }));\n const launcherId = args.trim() || (typeof selected === 'string' ? selected : '');\n if (!launcherId) return;\n const instance = await launchers.launch(launcherId);\n publishMode();\n await notify(execution, instance ? `Loop '${instance.instanceId}' started.` : 'Loop launch was cancelled.');\n },\n },\n {\n name: LIST_COMMAND_NAME,\n description: 'List and stop active loops.',\n async execute(_args: string, execution: DoomHeadlessExecutionContext) {\n const instances = launchers?.listInstances() ?? [];\n await notify(execution, instances.length === 0 ? 'No loops are active.' : JSON.stringify(instances, null, 2));\n },\n },\n ],\n hooks: [\n {\n // Ungated on purpose: the dock's loops group is a way in, so it has to\n // exist before anyone selects loop mode. The activity below is gated on\n // that selection and cannot do this job.\n event: 'session_start',\n async handle() {\n publishView();\n },\n },\n {\n when: { state: { 'minor-mode': MODE_ID }, attribution: { kind: 'minor', mode: MODE_ID } },\n event: 'session_shutdown',\n async handle() {\n await launchers?.stopAll('Headless session shutdown.');\n },\n },\n ],\n async onDispose() {\n await defaultRegistration?.dispose('Headless loop facet disposed.');\n await launchers?.dispose('Headless loop facet disposed.');\n },\n };\n}\n","import type { DoomServerPluginDefinition, DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createSessionState } from '../../../../../services/serverRuntime';\n\nexport default (({ agent }): Partial<DoomServerSessionPlugin> =>\n agent ? createSessionState(agent) : {}) satisfies NonNullable<DoomServerPluginDefinition['session']>;\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport runtime from './_lib/runtime.server';\n\nexport default defineRoot((context: DoomServerPluginContext) => {\n const value = runtime(context);\n return {\n value,\n services: value.services,\n activities: value.activities,\n onStart: value.onStart,\n onStop: value.onStop,\n onDispose: value.onDispose,\n };\n});\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext, DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<DoomServerPluginContext, Partial<DoomServerSessionPlugin>>) => context.root.commands?.[0],\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext, DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<DoomServerPluginContext, Partial<DoomServerSessionPlugin>>) => context.root.commands?.[1],\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext, DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<DoomServerPluginContext, Partial<DoomServerSessionPlugin>>) =>\n context.root.hooks?.find((hook) => hook.event === 'session_shutdown'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext, DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<DoomServerPluginContext, Partial<DoomServerSessionPlugin>>) =>\n context.root.hooks?.find((hook) => hook.event === 'session_start'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext, DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<DoomServerPluginContext, Partial<DoomServerSessionPlugin>>) => context.root.resources?.[0],\n { cardinality: 'optional' },\n);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport commandLoop from '../src/extensions/workspaces/sessions/(backend)/command/loop.server';\nimport commandLoops from '../src/extensions/workspaces/sessions/(backend)/command/loops.server';\nimport hookSessionShutdown from '../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/session-start.server';\nimport resourceDoompiUseLoop from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-loop.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n/* v8 ignore next -- generated normalization branch */\nconst defined = <T>(values: readonly (T | undefined)[]): T[] =>\n values.filter((value): value is T => value !== undefined);\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T => ({ ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-loop',\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): DoomServerSessionPlugin['commands'] { return defined([via({ name: 'loop' }, at(commandLoop, contextSession)), via({ name: 'loops' }, at(commandLoops, contextSession))]); },\n get hooks(): DoomServerSessionPlugin['hooks'] { return defined([via({ event: 'session_shutdown' }, at(hookSessionShutdown, contextSession)), via({ event: 'session_start' }, at(hookSessionStart, contextSession))]); },\n get resources(): DoomServerSessionPlugin['resources'] { return defined([at(resourceDoompiUseLoop, contextSession)]); },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region generated/server.d.ts
|
|
2
|
-
export declare const facet: import("@agimon-ai/doompi-core/
|
|
2
|
+
export declare const facet: import("@agimon-ai/doompi-core/serverFacet").DoomServerFacet;
|
|
3
3
|
//#endregion
|
|
4
4
|
export { facet as default };
|
|
5
5
|
//# sourceMappingURL=server.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.mts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAmBa,
|
|
1
|
+
{"version":3,"file":"server.d.mts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAmBa,oDAAK"}
|