@agimon-ai/po-loop 0.0.0-alpha.13 → 0.0.0-alpha.14
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/apiContracts.cjs +1 -1
- package/dist/apiContracts.cjs.map +1 -1
- package/dist/apiContracts.d.mts +1 -1
- package/dist/apiContracts.mjs +1 -1
- package/dist/apiContracts.mjs.map +1 -1
- package/dist/extensions/server.cjs +12 -11
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.d.mts +2 -2
- package/dist/extensions/server.d.mts.map +1 -1
- package/dist/extensions/server.mjs +7 -6
- package/dist/extensions/server.mjs.map +1 -1
- package/package.json +9 -9
package/dist/apiContracts.cjs
CHANGED
|
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
|
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
5
|
//#region src/schemas/apiContracts.ts
|
|
6
|
-
/** This
|
|
6
|
+
/** This server plugin contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
|
|
7
7
|
const apiContracts = (0, require("@agimon-ai/po-core/apiContracts").defineApiContract)({
|
|
8
8
|
version: 1,
|
|
9
9
|
http: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiContracts.cjs","names":["defineApiContract"],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/po-core/apiContracts';\n\n/** This
|
|
1
|
+
{"version":3,"file":"apiContracts.cjs","names":["defineApiContract"],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/po-core/apiContracts';\n\n/** This server plugin 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,gBAAA,4CAAeA,CAAAA,CAAAA,kBAAAA,CAAkB;CAAE,SAAS;CAAG,MAAM,CAAC;CAAG,SAAS,CAAC;CAAG,SAAS,CAAC;AAAE,CAAC"}
|
package/dist/apiContracts.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/schemas/apiContracts.d.ts
|
|
2
|
-
/** This
|
|
2
|
+
/** This server plugin contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
|
|
3
3
|
export declare const apiContracts: {
|
|
4
4
|
version: 1;
|
|
5
5
|
protocols?: Record<string, string> | undefined;
|
package/dist/apiContracts.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineApiContract } from "@agimon-ai/po-core/apiContracts";
|
|
2
2
|
//#region src/schemas/apiContracts.ts
|
|
3
|
-
/** This
|
|
3
|
+
/** This server plugin contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
|
|
4
4
|
const apiContracts = defineApiContract({
|
|
5
5
|
version: 1,
|
|
6
6
|
http: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/po-core/apiContracts';\n\n/** This
|
|
1
|
+
{"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/po-core/apiContracts';\n\n/** This server plugin 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"}
|
|
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
|
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
5
|
const require_loopLaunchers = require("../loopLaunchers-BV1e61Uj.cjs");
|
|
6
|
-
let
|
|
6
|
+
let _agimon_ai_po_core_serverPlugin = require("@agimon-ai/po-core/serverPlugin");
|
|
7
7
|
let _agimon_ai_po_core_extensionFile = require("@agimon-ai/po-core/extensionFile");
|
|
8
8
|
let _agimon_ai_po_minor_mode = require("@agimon-ai/po-minor-mode");
|
|
9
9
|
let croner = require("croner");
|
|
@@ -296,7 +296,7 @@ function result(details) {
|
|
|
296
296
|
}
|
|
297
297
|
function createLoopTools(launchers, assertEnabled) {
|
|
298
298
|
return [
|
|
299
|
-
(0,
|
|
299
|
+
(0, _agimon_ai_po_core_serverPlugin.defineTool)({
|
|
300
300
|
name: "loop_list",
|
|
301
301
|
label: "List loops",
|
|
302
302
|
description: "List active session loops and available launcher types with their configuration schemas.",
|
|
@@ -312,7 +312,7 @@ function createLoopTools(launchers, assertEnabled) {
|
|
|
312
312
|
});
|
|
313
313
|
}
|
|
314
314
|
}),
|
|
315
|
-
(0,
|
|
315
|
+
(0, _agimon_ai_po_core_serverPlugin.defineTool)({
|
|
316
316
|
name: "loop_start",
|
|
317
317
|
label: "Start loop",
|
|
318
318
|
description: "Start a session-scoped loop without operator dialogs. Read loop_list for launcher IDs and input schemas. Loops stop when the session shuts down.",
|
|
@@ -329,7 +329,7 @@ function createLoopTools(launchers, assertEnabled) {
|
|
|
329
329
|
}) ?? { cancelled: true });
|
|
330
330
|
}
|
|
331
331
|
}),
|
|
332
|
-
(0,
|
|
332
|
+
(0, _agimon_ai_po_core_serverPlugin.defineTool)({
|
|
333
333
|
name: "loop_stop",
|
|
334
334
|
label: "Stop loop",
|
|
335
335
|
description: "Stop one loop instance owned by the current session. Does not disable Loop mode or stop other loops.",
|
|
@@ -516,7 +516,7 @@ function createSessionState(host) {
|
|
|
516
516
|
},
|
|
517
517
|
name: "po-use-loop",
|
|
518
518
|
kind: "skill",
|
|
519
|
-
read: () => (0,
|
|
519
|
+
read: () => (0, _agimon_ai_po_core_serverPlugin.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/po-use-loop/SKILL.md")
|
|
520
520
|
}],
|
|
521
521
|
activities: [{
|
|
522
522
|
name: "po-loop",
|
|
@@ -575,7 +575,7 @@ function createSessionState(host) {
|
|
|
575
575
|
disposed = true;
|
|
576
576
|
pending.clear();
|
|
577
577
|
unsubscribe();
|
|
578
|
-
await launchers.dispose("
|
|
578
|
+
await launchers.dispose("Loop server plugin disposed.");
|
|
579
579
|
}
|
|
580
580
|
};
|
|
581
581
|
}
|
|
@@ -628,11 +628,12 @@ const via = (identity, value) => value === void 0 ? void 0 : {
|
|
|
628
628
|
...identity,
|
|
629
629
|
...value
|
|
630
630
|
};
|
|
631
|
-
const
|
|
631
|
+
const serverPlugin = (0, _agimon_ai_po_core_serverPlugin.defineServerPlugin)({
|
|
632
632
|
name: "@agimon-ai/po-loop",
|
|
633
|
-
providerOverrides: (0,
|
|
633
|
+
providerOverrides: (0, _agimon_ai_po_core_serverPlugin.composeServerProviderOverrides)(root_server_default),
|
|
634
|
+
injects: (0, _agimon_ai_po_core_extensionFile.composeRootInjects)({ session: [root_server_default] }),
|
|
634
635
|
session: async (context) => {
|
|
635
|
-
const scopeSession = await root_server_default
|
|
636
|
+
const scopeSession = await context.scopeRoot("session", root_server_default, context);
|
|
636
637
|
const contextSession = {
|
|
637
638
|
...context,
|
|
638
639
|
root: scopeSession.value
|
|
@@ -667,7 +668,7 @@ const facet = (0, _agimon_ai_po_core_serverFacet.defineServerPlugin)({
|
|
|
667
668
|
}
|
|
668
669
|
});
|
|
669
670
|
//#endregion
|
|
670
|
-
exports.default =
|
|
671
|
-
exports.
|
|
671
|
+
exports.default = serverPlugin;
|
|
672
|
+
exports.serverPlugin = serverPlugin;
|
|
672
673
|
|
|
673
674
|
//# sourceMappingURL=server.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.cjs","names":["Type","Check","defineTool","Check","defineMinorMode","Cron","PO_LOOP_LAUNCHERS_SERVICE","serverMinorModes","readPackageResource","defineRoot","runtime","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineTool","defineTool","defineTool","defineServerPlugin","composeServerProviderOverrides","rootSession","composeRootHooks","commandLoops","hookAgentSettled","hookSessionShutdown","hookSessionStart","resourcePoUseLoop","toolLoopList","toolLoopStart","toolLoopStop"],"sources":["../../src/constants/loop.ts","../../src/constants/piLoop.ts","../../src/schemas/loopTools.ts","../../src/types/loopView.ts","../../src/services/loopLaunchers/index.ts","../../src/services/loopTools/index.ts","../../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/loops.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.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/po-use-loop.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/loop-list.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/loop-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/loop-stop.server.ts","../../generated/server.ts"],"sourcesContent":["export const START_COMMAND_DESCRIPTION = 'Start a registered loop';\nexport const LIST_COMMAND_DESCRIPTION = 'List and stop active loops';\nexport const START_COMMAND_NAME = 'loop';\nexport const LIST_COMMAND_NAME = 'loops';\n","export const PACKAGE_SOURCE = '@agimon-ai/po-loop';\nexport const LOOPS_GROUP_ORDER = 60;\nexport const STATUS_KEY = 'po-loop';\nexport const MODE_STATUS_ID = 'loop';\nexport const ACTIVE_MODE_COLOR = 'warning';\nexport const NOTIFY_INFO_LEVEL = 'info';\nexport const NOTIFY_WARNING_LEVEL = 'warning';\n","import { type Static, Type } from 'typebox';\nimport { Check } from 'typebox/value';\n\nexport const LoopListSchema = Type.Object({}, { additionalProperties: false });\nexport const LoopStartSchema = Type.Object(\n {\n launcherId: Type.String({ minLength: 1, maxLength: 256 }),\n instanceId: Type.Optional(Type.String({ minLength: 1, maxLength: 256 })),\n input: Type.Record(Type.String(), Type.Unknown()),\n },\n { additionalProperties: false },\n);\nexport const LoopStopSchema = Type.Object(\n {\n instanceId: Type.String({ minLength: 1, maxLength: 256 }),\n reason: Type.Optional(Type.String({ minLength: 1, maxLength: 512 })),\n },\n { additionalProperties: false },\n);\n\nexport const IntervalLoopSchema = Type.Object(\n {\n prompt: Type.String({ minLength: 1, maxLength: 32768 }),\n intervalSeconds: Type.Integer({ minimum: 30, maximum: 3600 }),\n },\n { additionalProperties: false },\n);\nexport const CronLoopSchema = Type.Object(\n {\n prompt: Type.String({ minLength: 1, maxLength: 32768 }),\n cron: Type.String({ minLength: 1, maxLength: 256 }),\n timezone: Type.Optional(Type.String({ minLength: 1, maxLength: 128 })),\n },\n { additionalProperties: false },\n);\nexport type IntervalLoopInput = Static<typeof IntervalLoopSchema>;\nexport type CronLoopInput = Static<typeof CronLoopSchema>;\n\nexport function parseIntervalLoop(input: unknown): IntervalLoopInput {\n if (!Check(IntervalLoopSchema, input) || !input.prompt.trim()) {\n throw new Error('Provide a non-empty prompt and an integer intervalSeconds between 30 and 3600.');\n }\n return { ...input, prompt: input.prompt.trim() };\n}\n\nexport function parseCronLoop(input: unknown): CronLoopInput {\n if (!Check(CronLoopSchema, input) || !input.prompt.trim() || input.cron.trim().split(/\\s+/u).length !== 5) {\n throw new Error('Provide a non-empty prompt and a five-field cron expression, with an optional IANA timezone.');\n }\n const timezone = input.timezone ?? 'UTC';\n new Intl.DateTimeFormat('en', { timeZone: timezone }).format();\n return { ...input, prompt: input.prompt.trim(), cron: input.cron.trim(), timezone };\n}\n","/** The browser-only status that carries active Loop instances into the activity dock. */\nexport const LOOP_VIEW_STATUS_KEY = 'po-loop-instances';\n\nexport type LoopStatusState = 'starting' | 'running' | 'stopping';\n\n/** The small, serializable Loop view the cockpit needs for one activity row. */\nexport interface LoopStatusItem {\n readonly instanceId: string;\n readonly label: string;\n readonly detail: string;\n readonly state: LoopStatusState;\n}\n\ninterface LoopStatusSource {\n readonly instanceId: string;\n readonly launcherLabel: string;\n readonly label?: string;\n readonly detail?: string;\n readonly state: LoopStatusState;\n}\n\nconst ANSI = new RegExp(String.raw`\\u001b\\[[0-9;]*m`, 'gu');\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isState(value: unknown): value is LoopStatusState {\n return value === 'starting' || value === 'running' || value === 'stopping';\n}\n\n/** Projects runtime snapshots into the JSON status consumed by the web plugin. */\nexport function formatLoopStatusView(instances: readonly LoopStatusSource[]): string {\n if (instances.length === 0) return '';\n return JSON.stringify(\n instances.map((instance) => ({\n instanceId: instance.instanceId,\n label: instance.label ?? instance.launcherLabel,\n detail: instance.detail ?? instance.instanceId,\n state: instance.state,\n })),\n );\n}\n\n/** Reads a Loop status without letting malformed session data crash the activity dock. */\nexport function parseLoopStatusView(raw: string | undefined): LoopStatusItem[] | undefined {\n if (raw === undefined) return undefined;\n const text = raw.replace(ANSI, '').trim();\n if (text === '') return undefined;\n\n try {\n const value: unknown = JSON.parse(text);\n if (!Array.isArray(value) || value.length === 0) return undefined;\n const items: LoopStatusItem[] = [];\n for (const item of value) {\n if (\n !isRecord(item) ||\n typeof item.instanceId !== 'string' ||\n item.instanceId.trim() === '' ||\n typeof item.label !== 'string' ||\n item.label.trim() === '' ||\n typeof item.detail !== 'string' ||\n !isState(item.state)\n ) {\n return undefined;\n }\n items.push({ instanceId: item.instanceId, label: item.label, detail: item.detail, state: item.state });\n }\n return items;\n } catch {\n return undefined;\n }\n}\n","import type {\n PoLoopLaunchersService,\n LoopInstanceSnapshot,\n LoopLauncherDefinition,\n LoopLauncherRegistration,\n StoppableLoop,\n} from '../../schemas/loopLaunchers';\n\nconst MAX_ID_LENGTH = 256;\nconst MAX_GENERATION_LENGTH = 256;\nconst LAUNCHER_ID_LABEL = 'loop launcher id';\nconst INSTANCE_ID_LABEL = 'loop instance id';\n\ninterface LauncherEntry {\n readonly token: symbol;\n readonly definition: LoopLauncherDefinition;\n}\n\ninterface InstanceEntry {\n readonly instanceId: string;\n readonly launcher: LauncherEntry;\n readonly abortController: AbortController;\n state: LoopInstanceSnapshot['state'];\n handle?: StoppableLoop;\n startedAt?: string;\n}\n\nexport interface LoopLaunchersDependencies {\n readonly generation: string;\n readonly createInstanceId: () => string;\n readonly timestamp: () => string;\n}\n\nfunction validId(value: string, label: string): string {\n if (typeof value !== 'string') throw new TypeError(`Invalid ${label}.`);\n const normalized = value.trim();\n let hasControl = false;\n for (const character of normalized) {\n const code = character.codePointAt(0);\n if (code !== undefined && (code <= 0x1f || code === 0x7f)) {\n hasControl = true;\n break;\n }\n }\n if (!normalized || normalized.length > MAX_ID_LENGTH || hasControl) throw new Error(`Invalid ${label}.`);\n return normalized;\n}\n\nfunction snapshot(entry: InstanceEntry): LoopInstanceSnapshot {\n return {\n instanceId: entry.instanceId,\n launcherId: entry.launcher.definition.id,\n launcherLabel: entry.launcher.definition.label,\n ...(entry.handle?.label ? { label: entry.handle.label } : {}),\n ...(entry.handle?.detail ? { detail: entry.handle.detail } : {}),\n state: entry.state,\n ...(entry.startedAt ? { startedAt: entry.startedAt } : {}),\n };\n}\n\n/** Creates the provider-owned launcher registry for one active Po session. */\nexport function createPoLoopLaunchersService({\n generation,\n createInstanceId,\n timestamp,\n}: LoopLaunchersDependencies): PoLoopLaunchersService {\n if (!generation || generation.length > MAX_GENERATION_LENGTH) {\n throw new TypeError('Po loop launchers require a valid generation.');\n }\n\n const launchers = new Map<string, LauncherEntry>();\n const instances = new Map<string, InstanceEntry>();\n const listeners = new Set<() => void>();\n let registrationSequence = 0;\n let disposed = false;\n\n const ensureActive = (): void => {\n if (disposed) throw new Error('The Po loop-launchers service is disposed.');\n };\n const notify = (): void => {\n for (const listener of listeners) listener();\n };\n const stopEntry = async (entry: InstanceEntry, reason?: string): Promise<void> => {\n if (instances.get(entry.instanceId) !== entry) return;\n entry.state = 'stopping';\n entry.abortController.abort(reason);\n notify();\n try {\n await entry.handle?.stop(reason);\n } finally {\n if (instances.get(entry.instanceId) === entry) instances.delete(entry.instanceId);\n notify();\n }\n };\n\n const service: PoLoopLaunchersService = {\n generation,\n register(definition): LoopLauncherRegistration {\n ensureActive();\n const id = validId(definition.id, LAUNCHER_ID_LABEL);\n if (launchers.has(id)) throw new Error(`Loop launcher '${id}' is already registered.`);\n const token = Symbol(id);\n const entry: LauncherEntry = { token, definition: { ...definition, id } };\n launchers.set(id, entry);\n registrationSequence += 1;\n notify();\n let registrationDisposed = false;\n return Object.freeze({\n id,\n generation: `${generation}:launcher:${registrationSequence}`,\n async dispose(reason = 'Loop launcher disposed.'): Promise<void> {\n if (registrationDisposed) return;\n registrationDisposed = true;\n if (launchers.get(id)?.token !== token) return;\n launchers.delete(id);\n const owned = [...instances.values()].filter((instance) => instance.launcher.token === token);\n await Promise.allSettled(owned.map((instance) => stopEntry(instance, reason)));\n notify();\n },\n });\n },\n listLaunchers() {\n ensureActive();\n return [...launchers.values()]\n .map(({ definition }) => ({\n id: definition.id,\n source: definition.source,\n label: definition.label,\n ...(definition.description ? { description: definition.description } : {}),\n ...(definition.inputSchema ? { inputSchema: definition.inputSchema } : {}),\n }))\n .sort((left, right) => left.label.localeCompare(right.label) || left.id.localeCompare(right.id));\n },\n listInstances() {\n ensureActive();\n return [...instances.values()]\n .map(snapshot)\n .sort((left, right) => left.instanceId.localeCompare(right.instanceId));\n },\n subscribe(listener) {\n ensureActive();\n listeners.add(listener);\n let subscribed = true;\n return () => {\n if (!subscribed) return;\n subscribed = false;\n listeners.delete(listener);\n };\n },\n async launch(launcherId, options) {\n ensureActive();\n options?.signal?.throwIfAborted();\n const normalizedLauncherId = validId(launcherId, LAUNCHER_ID_LABEL);\n const launcher = launchers.get(normalizedLauncherId);\n if (!launcher) throw new Error(`Loop launcher '${normalizedLauncherId}' is unavailable.`);\n const instanceId = validId(options?.instanceId ?? createInstanceId(), INSTANCE_ID_LABEL);\n if (instances.has(instanceId)) throw new Error(`Loop instance '${instanceId}' already exists.`);\n const entry: InstanceEntry = { instanceId, launcher, abortController: new AbortController(), state: 'starting' };\n const abortSetup = (): void => entry.abortController.abort(options?.signal?.reason);\n options?.signal?.addEventListener('abort', abortSetup, { once: true });\n instances.set(instanceId, entry);\n notify();\n try {\n if (options?.interactive === false && !launcher.definition.inputSchema) {\n throw new Error(`Loop launcher '${normalizedLauncherId}' requires manual setup in Activity.`);\n }\n const handle = await launcher.definition.launch({\n instanceId,\n signal: entry.abortController.signal,\n ...(options?.input === undefined ? {} : { input: options.input }),\n ...(options?.interactive === undefined ? {} : { interactive: options.interactive }),\n });\n const active = !disposed && instances.get(instanceId) === entry && !entry.abortController.signal.aborted;\n if (!handle) {\n if (instances.get(instanceId) === entry) instances.delete(instanceId);\n notify();\n return undefined;\n }\n if (!active || handle.instanceId !== instanceId) {\n await handle.stop(active ? 'Loop launcher returned a mismatched instance id.' : 'Loop launch was cancelled.');\n if (instances.get(instanceId) === entry) instances.delete(instanceId);\n notify();\n if (active) throw new Error(`Loop launcher '${normalizedLauncherId}' returned a mismatched instance id.`);\n return undefined;\n }\n entry.handle = handle;\n entry.state = 'running';\n entry.startedAt = timestamp();\n notify();\n return snapshot(entry);\n } catch (error) {\n const cancelled = entry.abortController.signal.aborted || disposed;\n if (instances.get(instanceId) === entry) instances.delete(instanceId);\n notify();\n if (cancelled) return undefined;\n throw error;\n } finally {\n options?.signal?.removeEventListener('abort', abortSetup);\n }\n },\n async stop(instanceId, reason) {\n ensureActive();\n const entry = instances.get(validId(instanceId, INSTANCE_ID_LABEL));\n if (!entry) return false;\n await stopEntry(entry, reason);\n return true;\n },\n async stopAll(reason) {\n if (disposed && instances.size === 0) return;\n await Promise.allSettled([...instances.values()].map((entry) => stopEntry(entry, reason)));\n },\n async dispose(reason = 'Po loop-launchers service disposed.') {\n if (disposed) return;\n disposed = true;\n launchers.clear();\n await Promise.allSettled([...instances.values()].map((entry) => stopEntry(entry, reason)));\n listeners.clear();\n },\n };\n\n return Object.freeze(service);\n}\n","import { defineTool, type PoPluginTool, type PoPluginToolResult } from '@agimon-ai/po-core/serverFacet';\nimport { Check } from 'typebox/value';\n\nimport type { PoLoopLaunchersService } from '../../schemas/loopLaunchers';\nimport { LoopListSchema, LoopStartSchema, LoopStopSchema } from '../../schemas/loopTools';\n\nfunction result(details: unknown): PoPluginToolResult {\n return { content: [{ type: 'text', text: JSON.stringify(details, null, 2) }], details };\n}\n\nexport function createLoopTools(\n launchers: () => PoLoopLaunchersService,\n assertEnabled: () => void,\n): readonly PoPluginTool[] {\n return [\n defineTool({\n name: 'loop_list',\n label: 'List loops',\n description: 'List active session loops and available launcher types with their configuration schemas.',\n parameters: LoopListSchema,\n async execute(input, { signal }) {\n assertEnabled();\n signal?.throwIfAborted();\n if (!Check(LoopListSchema, input)) throw new Error('loop_list takes no arguments.');\n const service = launchers();\n return result({ launchers: service.listLaunchers(), instances: service.listInstances() });\n },\n }),\n defineTool({\n name: 'loop_start',\n label: 'Start loop',\n description:\n 'Start a session-scoped loop without operator dialogs. Read loop_list for launcher IDs and input schemas. Loops stop when the session shuts down.',\n parameters: LoopStartSchema,\n executionMode: 'serial',\n async execute(input, { signal }) {\n assertEnabled();\n signal?.throwIfAborted();\n if (!Check(LoopStartSchema, input)) throw new Error('Provide launcherId, input, and optionally instanceId.');\n return result(\n (await launchers().launch(input.launcherId, { ...input, interactive: false, signal })) ?? { cancelled: true },\n );\n },\n }),\n defineTool({\n name: 'loop_stop',\n label: 'Stop loop',\n description:\n 'Stop one loop instance owned by the current session. Does not disable Loop mode or stop other loops.',\n parameters: LoopStopSchema,\n executionMode: 'serial',\n async execute(input, { signal }) {\n assertEnabled();\n signal?.throwIfAborted();\n if (!Check(LoopStopSchema, input)) throw new Error('Provide instanceId and an optional reason.');\n return result({ stopped: await launchers().stop(input.instanceId, input.reason ?? 'Stopped by the agent.') });\n },\n }),\n ];\n}\n","import type { PoHeadlessExecutionContext, PoHeadlessHostService } from '@agimon-ai/po-core/headless';\nimport { readPackageResource, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\nimport { defineMinorMode, serverMinorModes } from '@agimon-ai/po-minor-mode';\nimport { Cron } from 'croner';\n\nimport { LIST_COMMAND_NAME } from '../../constants/loop';\nimport { MODE_STATUS_ID, PACKAGE_SOURCE } from '../../constants/piLoop';\nimport { PO_LOOP_LAUNCHERS_SERVICE, type LoopLaunchRequest } from '../../schemas/loopLaunchers';\nimport { CronLoopSchema, IntervalLoopSchema, parseCronLoop, parseIntervalLoop } from '../../schemas/loopTools';\nimport { formatLoopStatusView, LOOP_VIEW_STATUS_KEY } from '../../types/loopView';\nimport { createPoLoopLaunchersService } from '../loopLaunchers';\nimport { createLoopTools } from '../loopTools';\nimport type { LoopToolsRoot } from '../loopTools/type';\n\nexport type LoopServerState = PoServerSessionPlugin & LoopToolsRoot;\n\n/** Loops are set by the agent, so a launch always carries its configuration. */\nfunction prepareLoop(request: LoopLaunchRequest, cron: boolean) {\n if (request.input === undefined) throw new Error('Loop configuration is required. Ask the agent to set the loop.');\n return cron ? parseCronLoop(request.input) : parseIntervalLoop(request.input);\n}\n\nexport function createSessionState(host: PoHeadlessHostService): LoopServerState {\n const launchers = createPoLoopLaunchersService({\n generation: `${host.context.sessionId}:loop-launchers`,\n createInstanceId: () => crypto.randomUUID(),\n timestamp: () => new Date().toISOString(),\n });\n let disposed = false;\n const modeSelected = (): boolean =>\n !disposed && (host.context.selection.state?.['minor-mode'] ?? []).includes(MODE_STATUS_ID);\n const publishView = (): void =>\n host.context.client.setStatus(LOOP_VIEW_STATUS_KEY, formatLoopStatusView(launchers.listInstances()));\n const modeOwner = defineMinorMode({\n descriptor: {\n source: PACKAGE_SOURCE,\n id: MODE_STATUS_ID,\n label: 'Loop',\n description: 'Give the agent tools to create, inspect, and stop session loops.',\n order: 60,\n actions: [\n {\n id: 'activate',\n label: 'Activate',\n description: 'Expose loop tools to the agent.',\n contexts: ['headless'],\n parameters: [],\n },\n {\n id: 'deactivate',\n label: 'Deactivate',\n description: 'Hide agent loop tools. Existing loops and manual controls remain available.',\n contexts: ['headless'],\n parameters: [],\n },\n ],\n },\n state: () => ({\n activation: modeSelected() ? 'active' : 'inactive',\n condition: 'ready',\n ...(modeSelected() ? { detail: `${launchers.listInstances().length} loops`, color: 'accent' } : {}),\n actions: [\n {\n id: 'activate',\n enabled: !modeSelected(),\n ...(modeSelected() ? { disabledReason: 'Loop mode is already active.' } : {}),\n },\n {\n id: 'deactivate',\n enabled: modeSelected(),\n ...(modeSelected() ? {} : { disabledReason: 'Loop mode is not active.' }),\n },\n ],\n }),\n async handleAction(_runtime, actionId, _arguments, { signal }) {\n signal.throwIfAborted();\n if (actionId !== 'activate' && actionId !== 'deactivate')\n throw new Error(`Unknown loop mode action: ${actionId}`);\n const modes = (host.context.selection.state?.['minor-mode'] ?? []).filter((mode) => mode !== MODE_STATUS_ID);\n await host.changeSelection({\n axis: 'state',\n key: 'minor-mode',\n values: actionId === 'activate' ? [...modes, MODE_STATUS_ID] : modes,\n });\n modeOwner.publish();\n return {\n message:\n actionId === 'activate' ? 'Loop tools activated.' : 'Loop tools deactivated. Existing loops are unchanged.',\n };\n },\n }).createOwner(undefined);\n const publish = (): void => {\n if (disposed) return;\n modeOwner.publish();\n publishView();\n };\n const unsubscribe = launchers.subscribe(publish);\n let submitting = false;\n const pending = new Set<() => Promise<void>>();\n for (const cron of [false, true]) {\n launchers.register({\n id: cron ? 'po.cron' : 'po.default',\n source: PACKAGE_SOURCE,\n label: cron ? 'Cron loop' : 'Default loop',\n description: cron\n ? 'Run a prompt on a five-field cron schedule.'\n : 'Run a prompt in this session on an interval.',\n inputSchema: { ...(cron ? CronLoopSchema : IntervalLoopSchema) },\n async launch(request) {\n const execution = host.context;\n const prepared = prepareLoop(request, cron);\n if (!prepared || request.signal.aborted) return undefined;\n let stopped = false;\n const tick = async (due = true): Promise<void> => {\n if (disposed || stopped || request.signal.aborted) return;\n if (due) pending.add(replay);\n if (submitting || !pending.has(replay)) return;\n submitting = true;\n try {\n const activity = await execution.session.activity();\n if (disposed || stopped || request.signal.aborted || !activity.isIdle || activity.hasPendingMessages)\n return;\n pending.delete(replay);\n if (!execution.session.admitPrompt) throw new Error('Loop prompt admission is unavailable.');\n await execution.session.admitPrompt(prepared.prompt);\n } catch (error) {\n await execution.client.notify({\n body: `Loop pass failed: ${error instanceof Error ? error.message : String(error)}`,\n level: 'warning',\n });\n } finally {\n submitting = false;\n }\n };\n const replay = (): Promise<void> => tick(false);\n let stopTimer: () => void;\n let detail: string;\n if ('cron' in prepared) {\n const job = new Cron(prepared.cron, { timezone: prepared.timezone, unref: true }, () => tick());\n if (job.nextRun() === null) {\n job.stop();\n throw new Error('Cron expression has no future run.');\n }\n stopTimer = () => {\n job.stop();\n };\n detail = `${prepared.cron} (${prepared.timezone})`;\n } else {\n const timer = setInterval(() => {\n void tick();\n }, prepared.intervalSeconds * 1000);\n timer.unref?.();\n stopTimer = () => clearInterval(timer);\n detail = `every ${prepared.intervalSeconds}s`;\n void tick();\n }\n return {\n instanceId: request.instanceId,\n label: cron ? 'Cron loop' : 'Default loop',\n detail,\n stop() {\n stopped = true;\n pending.delete(replay);\n stopTimer();\n },\n };\n },\n });\n }\n const loopTools = createLoopTools(\n () => launchers,\n () => {\n if (!modeSelected()) throw new Error('Enable Loop minor mode before using agent loop tools.');\n },\n ).map((tool) => ({\n ...tool,\n when: { state: { 'minor-mode': MODE_STATUS_ID }, attribution: { kind: 'minor' as const, mode: MODE_STATUS_ID } },\n }));\n return {\n loopTools,\n services: [\n (context) => {\n context.plugin((provider) => {\n provider.provide(PO_LOOP_LAUNCHERS_SERVICE, launchers);\n });\n context.effect(() => host.subscribeSelection(publish));\n },\n serverMinorModes([modeOwner]),\n ],\n resources: [\n {\n when: { state: { 'minor-mode': MODE_STATUS_ID }, attribution: { kind: 'minor', mode: MODE_STATUS_ID } },\n name: 'po-use-loop',\n kind: 'skill',\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-use-loop/SKILL.md'),\n },\n ],\n activities: [\n {\n name: 'po-loop',\n async start() {\n publish();\n return async () => {\n await launchers.stopAll('Session loop activity stopped.');\n publish();\n };\n },\n },\n ],\n commands: [\n {\n name: LIST_COMMAND_NAME,\n description: 'List or stop session loops. Usage: /loops [stop instanceId].',\n async execute(args: string, execution: PoHeadlessExecutionContext) {\n const parts = args.trim().split(/\\s+/u);\n if (parts[0] === 'stop' && parts.length === 2) {\n const stopped = await launchers.stop(parts[1]!, 'Stopped manually.');\n await execution.client.notify({\n body: stopped ? 'Loop stopped.' : 'Loop instance was not active.',\n level: 'info',\n });\n return;\n }\n if (args.trim()) throw new Error('Usage: /loops [stop instanceId]');\n const instances = launchers.listInstances();\n await execution.client.notify({\n body: instances.length === 0 ? 'No loops are active.' : JSON.stringify(instances, null, 2),\n level: 'info',\n });\n },\n },\n ],\n hooks: [\n {\n event: 'agent_settled',\n async handle() {\n if (!disposed) await pending.values().next().value?.();\n },\n },\n {\n event: 'session_start',\n async handle() {\n publish();\n },\n },\n {\n event: 'session_shutdown',\n async handle() {\n await launchers.stopAll('Headless session shutdown.');\n },\n },\n ],\n onStart: publish,\n async onDispose() {\n if (disposed) return;\n disposed = true;\n pending.clear();\n unsubscribe();\n await launchers.dispose('Headless loop facet disposed.');\n },\n };\n}\n","import type { PoServerPluginDefinition } from '@agimon-ai/po-core/serverFacet';\n\nimport { createSessionState, type LoopServerState } from '../../../../../services/serverRuntime';\n\nexport default (({ agent }): LoopServerState =>\n agent ? createSessionState(agent) : { loopTools: [] }) satisfies NonNullable<PoServerPluginDefinition['session']>;\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport runtime from './_lib/runtime.server';\n\nexport default defineRoot((context: PoServerPluginContext) => {\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/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) => context.root.commands?.[0],\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) =>\n context.root.hooks?.find((hook) => hook.event === 'agent_settled'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) =>\n context.root.hooks?.find((hook) => hook.event === 'session_shutdown'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) =>\n context.root.hooks?.find((hook) => hook.event === 'session_start'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) => context.root.resources?.[0],\n { cardinality: 'optional' },\n);\n","import { defineTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport type { LoopToolsRoot } from '../../../../../services/loopTools/type';\n\nexport default defineTool((context: WithRoot<unknown, LoopToolsRoot>) => context.root.loopTools[0]!);\n","import { defineTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport type { LoopToolsRoot } from '../../../../../services/loopTools/type';\n\nexport default defineTool((context: WithRoot<unknown, LoopToolsRoot>) => context.root.loopTools[1]!);\n","import { defineTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport type { LoopToolsRoot } from '../../../../../services/loopTools/type';\n\nexport default defineTool((context: WithRoot<unknown, LoopToolsRoot>) => context.root.loopTools[2]!);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport commandLoops from '../src/extensions/workspaces/sessions/(backend)/command/loops.server';\nimport hookAgentSettled from '../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.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 resourcePoUseLoop from '../src/extensions/workspaces/sessions/(backend)/resource/po-use-loop.server';\nimport toolLoopList from '../src/extensions/workspaces/sessions/(backend)/tool/loop-list.server';\nimport toolLoopStart from '../src/extensions/workspaces/sessions/(backend)/tool/loop-start.server';\nimport toolLoopStop from '../src/extensions/workspaces/sessions/(backend)/tool/loop-stop.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 =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/po-loop',\n providerOverrides: composeServerProviderOverrides(rootSession),\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(): PoServerSessionPlugin['commands'] { return defined([via({ name: 'loops' }, at(commandLoops, contextSession))]); },\n get hooks(): PoServerSessionPlugin['hooks'] { return defined([via({ event: 'agent_settled' }, at(hookAgentSettled, contextSession)), via({ event: 'session_shutdown' }, at(hookSessionShutdown, contextSession)), via({ event: 'session_start' }, at(hookSessionStart, contextSession))]); },\n get resources(): PoServerSessionPlugin['resources'] { return defined([at(resourcePoUseLoop, contextSession)]); },\n get tools(): PoServerSessionPlugin['tools'] { return [via({ name: 'loop_list' }, at(toolLoopList, contextSession)), via({ name: 'loop_start' }, at(toolLoopStart, contextSession)), via({ name: 'loop_stop' }, at(toolLoopStop, contextSession))]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.cjs","names":["Type","Check","defineTool","Check","defineMinorMode","Cron","PO_LOOP_LAUNCHERS_SERVICE","serverMinorModes","readPackageResource","defineRoot","runtime","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineTool","defineTool","defineTool","defineServerPlugin","composeServerProviderOverrides","rootSession","composeRootInjects","composeRootHooks","commandLoops","hookAgentSettled","hookSessionShutdown","hookSessionStart","resourcePoUseLoop","toolLoopList","toolLoopStart","toolLoopStop"],"sources":["../../src/constants/loop.ts","../../src/constants/piLoop.ts","../../src/schemas/loopTools.ts","../../src/types/loopView.ts","../../src/services/loopLaunchers/index.ts","../../src/services/loopTools/index.ts","../../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/loops.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.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/po-use-loop.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/loop-list.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/loop-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/loop-stop.server.ts","../../generated/server.ts"],"sourcesContent":["export const START_COMMAND_DESCRIPTION = 'Start a registered loop';\nexport const LIST_COMMAND_DESCRIPTION = 'List and stop active loops';\nexport const START_COMMAND_NAME = 'loop';\nexport const LIST_COMMAND_NAME = 'loops';\n","export const PACKAGE_SOURCE = '@agimon-ai/po-loop';\nexport const LOOPS_GROUP_ORDER = 60;\nexport const STATUS_KEY = 'po-loop';\nexport const MODE_STATUS_ID = 'loop';\nexport const ACTIVE_MODE_COLOR = 'warning';\nexport const NOTIFY_INFO_LEVEL = 'info';\nexport const NOTIFY_WARNING_LEVEL = 'warning';\n","import { type Static, Type } from 'typebox';\nimport { Check } from 'typebox/value';\n\nexport const LoopListSchema = Type.Object({}, { additionalProperties: false });\nexport const LoopStartSchema = Type.Object(\n {\n launcherId: Type.String({ minLength: 1, maxLength: 256 }),\n instanceId: Type.Optional(Type.String({ minLength: 1, maxLength: 256 })),\n input: Type.Record(Type.String(), Type.Unknown()),\n },\n { additionalProperties: false },\n);\nexport const LoopStopSchema = Type.Object(\n {\n instanceId: Type.String({ minLength: 1, maxLength: 256 }),\n reason: Type.Optional(Type.String({ minLength: 1, maxLength: 512 })),\n },\n { additionalProperties: false },\n);\n\nexport const IntervalLoopSchema = Type.Object(\n {\n prompt: Type.String({ minLength: 1, maxLength: 32768 }),\n intervalSeconds: Type.Integer({ minimum: 30, maximum: 3600 }),\n },\n { additionalProperties: false },\n);\nexport const CronLoopSchema = Type.Object(\n {\n prompt: Type.String({ minLength: 1, maxLength: 32768 }),\n cron: Type.String({ minLength: 1, maxLength: 256 }),\n timezone: Type.Optional(Type.String({ minLength: 1, maxLength: 128 })),\n },\n { additionalProperties: false },\n);\nexport type IntervalLoopInput = Static<typeof IntervalLoopSchema>;\nexport type CronLoopInput = Static<typeof CronLoopSchema>;\n\nexport function parseIntervalLoop(input: unknown): IntervalLoopInput {\n if (!Check(IntervalLoopSchema, input) || !input.prompt.trim()) {\n throw new Error('Provide a non-empty prompt and an integer intervalSeconds between 30 and 3600.');\n }\n return { ...input, prompt: input.prompt.trim() };\n}\n\nexport function parseCronLoop(input: unknown): CronLoopInput {\n if (!Check(CronLoopSchema, input) || !input.prompt.trim() || input.cron.trim().split(/\\s+/u).length !== 5) {\n throw new Error('Provide a non-empty prompt and a five-field cron expression, with an optional IANA timezone.');\n }\n const timezone = input.timezone ?? 'UTC';\n new Intl.DateTimeFormat('en', { timeZone: timezone }).format();\n return { ...input, prompt: input.prompt.trim(), cron: input.cron.trim(), timezone };\n}\n","/** The browser-only status that carries active Loop instances into the activity dock. */\nexport const LOOP_VIEW_STATUS_KEY = 'po-loop-instances';\n\nexport type LoopStatusState = 'starting' | 'running' | 'stopping';\n\n/** The small, serializable Loop view the cockpit needs for one activity row. */\nexport interface LoopStatusItem {\n readonly instanceId: string;\n readonly label: string;\n readonly detail: string;\n readonly state: LoopStatusState;\n}\n\ninterface LoopStatusSource {\n readonly instanceId: string;\n readonly launcherLabel: string;\n readonly label?: string;\n readonly detail?: string;\n readonly state: LoopStatusState;\n}\n\nconst ANSI = new RegExp(String.raw`\\u001b\\[[0-9;]*m`, 'gu');\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isState(value: unknown): value is LoopStatusState {\n return value === 'starting' || value === 'running' || value === 'stopping';\n}\n\n/** Projects runtime snapshots into the JSON status consumed by the web plugin. */\nexport function formatLoopStatusView(instances: readonly LoopStatusSource[]): string {\n if (instances.length === 0) return '';\n return JSON.stringify(\n instances.map((instance) => ({\n instanceId: instance.instanceId,\n label: instance.label ?? instance.launcherLabel,\n detail: instance.detail ?? instance.instanceId,\n state: instance.state,\n })),\n );\n}\n\n/** Reads a Loop status without letting malformed session data crash the activity dock. */\nexport function parseLoopStatusView(raw: string | undefined): LoopStatusItem[] | undefined {\n if (raw === undefined) return undefined;\n const text = raw.replace(ANSI, '').trim();\n if (text === '') return undefined;\n\n try {\n const value: unknown = JSON.parse(text);\n if (!Array.isArray(value) || value.length === 0) return undefined;\n const items: LoopStatusItem[] = [];\n for (const item of value) {\n if (\n !isRecord(item) ||\n typeof item.instanceId !== 'string' ||\n item.instanceId.trim() === '' ||\n typeof item.label !== 'string' ||\n item.label.trim() === '' ||\n typeof item.detail !== 'string' ||\n !isState(item.state)\n ) {\n return undefined;\n }\n items.push({ instanceId: item.instanceId, label: item.label, detail: item.detail, state: item.state });\n }\n return items;\n } catch {\n return undefined;\n }\n}\n","import type {\n PoLoopLaunchersService,\n LoopInstanceSnapshot,\n LoopLauncherDefinition,\n LoopLauncherRegistration,\n StoppableLoop,\n} from '../../schemas/loopLaunchers';\n\nconst MAX_ID_LENGTH = 256;\nconst MAX_GENERATION_LENGTH = 256;\nconst LAUNCHER_ID_LABEL = 'loop launcher id';\nconst INSTANCE_ID_LABEL = 'loop instance id';\n\ninterface LauncherEntry {\n readonly token: symbol;\n readonly definition: LoopLauncherDefinition;\n}\n\ninterface InstanceEntry {\n readonly instanceId: string;\n readonly launcher: LauncherEntry;\n readonly abortController: AbortController;\n state: LoopInstanceSnapshot['state'];\n handle?: StoppableLoop;\n startedAt?: string;\n}\n\nexport interface LoopLaunchersDependencies {\n readonly generation: string;\n readonly createInstanceId: () => string;\n readonly timestamp: () => string;\n}\n\nfunction validId(value: string, label: string): string {\n if (typeof value !== 'string') throw new TypeError(`Invalid ${label}.`);\n const normalized = value.trim();\n let hasControl = false;\n for (const character of normalized) {\n const code = character.codePointAt(0);\n if (code !== undefined && (code <= 0x1f || code === 0x7f)) {\n hasControl = true;\n break;\n }\n }\n if (!normalized || normalized.length > MAX_ID_LENGTH || hasControl) throw new Error(`Invalid ${label}.`);\n return normalized;\n}\n\nfunction snapshot(entry: InstanceEntry): LoopInstanceSnapshot {\n return {\n instanceId: entry.instanceId,\n launcherId: entry.launcher.definition.id,\n launcherLabel: entry.launcher.definition.label,\n ...(entry.handle?.label ? { label: entry.handle.label } : {}),\n ...(entry.handle?.detail ? { detail: entry.handle.detail } : {}),\n state: entry.state,\n ...(entry.startedAt ? { startedAt: entry.startedAt } : {}),\n };\n}\n\n/** Creates the provider-owned launcher registry for one active Po session. */\nexport function createPoLoopLaunchersService({\n generation,\n createInstanceId,\n timestamp,\n}: LoopLaunchersDependencies): PoLoopLaunchersService {\n if (!generation || generation.length > MAX_GENERATION_LENGTH) {\n throw new TypeError('Po loop launchers require a valid generation.');\n }\n\n const launchers = new Map<string, LauncherEntry>();\n const instances = new Map<string, InstanceEntry>();\n const listeners = new Set<() => void>();\n let registrationSequence = 0;\n let disposed = false;\n\n const ensureActive = (): void => {\n if (disposed) throw new Error('The Po loop-launchers service is disposed.');\n };\n const notify = (): void => {\n for (const listener of listeners) listener();\n };\n const stopEntry = async (entry: InstanceEntry, reason?: string): Promise<void> => {\n if (instances.get(entry.instanceId) !== entry) return;\n entry.state = 'stopping';\n entry.abortController.abort(reason);\n notify();\n try {\n await entry.handle?.stop(reason);\n } finally {\n if (instances.get(entry.instanceId) === entry) instances.delete(entry.instanceId);\n notify();\n }\n };\n\n const service: PoLoopLaunchersService = {\n generation,\n register(definition): LoopLauncherRegistration {\n ensureActive();\n const id = validId(definition.id, LAUNCHER_ID_LABEL);\n if (launchers.has(id)) throw new Error(`Loop launcher '${id}' is already registered.`);\n const token = Symbol(id);\n const entry: LauncherEntry = { token, definition: { ...definition, id } };\n launchers.set(id, entry);\n registrationSequence += 1;\n notify();\n let registrationDisposed = false;\n return Object.freeze({\n id,\n generation: `${generation}:launcher:${registrationSequence}`,\n async dispose(reason = 'Loop launcher disposed.'): Promise<void> {\n if (registrationDisposed) return;\n registrationDisposed = true;\n if (launchers.get(id)?.token !== token) return;\n launchers.delete(id);\n const owned = [...instances.values()].filter((instance) => instance.launcher.token === token);\n await Promise.allSettled(owned.map((instance) => stopEntry(instance, reason)));\n notify();\n },\n });\n },\n listLaunchers() {\n ensureActive();\n return [...launchers.values()]\n .map(({ definition }) => ({\n id: definition.id,\n source: definition.source,\n label: definition.label,\n ...(definition.description ? { description: definition.description } : {}),\n ...(definition.inputSchema ? { inputSchema: definition.inputSchema } : {}),\n }))\n .sort((left, right) => left.label.localeCompare(right.label) || left.id.localeCompare(right.id));\n },\n listInstances() {\n ensureActive();\n return [...instances.values()]\n .map(snapshot)\n .sort((left, right) => left.instanceId.localeCompare(right.instanceId));\n },\n subscribe(listener) {\n ensureActive();\n listeners.add(listener);\n let subscribed = true;\n return () => {\n if (!subscribed) return;\n subscribed = false;\n listeners.delete(listener);\n };\n },\n async launch(launcherId, options) {\n ensureActive();\n options?.signal?.throwIfAborted();\n const normalizedLauncherId = validId(launcherId, LAUNCHER_ID_LABEL);\n const launcher = launchers.get(normalizedLauncherId);\n if (!launcher) throw new Error(`Loop launcher '${normalizedLauncherId}' is unavailable.`);\n const instanceId = validId(options?.instanceId ?? createInstanceId(), INSTANCE_ID_LABEL);\n if (instances.has(instanceId)) throw new Error(`Loop instance '${instanceId}' already exists.`);\n const entry: InstanceEntry = { instanceId, launcher, abortController: new AbortController(), state: 'starting' };\n const abortSetup = (): void => entry.abortController.abort(options?.signal?.reason);\n options?.signal?.addEventListener('abort', abortSetup, { once: true });\n instances.set(instanceId, entry);\n notify();\n try {\n if (options?.interactive === false && !launcher.definition.inputSchema) {\n throw new Error(`Loop launcher '${normalizedLauncherId}' requires manual setup in Activity.`);\n }\n const handle = await launcher.definition.launch({\n instanceId,\n signal: entry.abortController.signal,\n ...(options?.input === undefined ? {} : { input: options.input }),\n ...(options?.interactive === undefined ? {} : { interactive: options.interactive }),\n });\n const active = !disposed && instances.get(instanceId) === entry && !entry.abortController.signal.aborted;\n if (!handle) {\n if (instances.get(instanceId) === entry) instances.delete(instanceId);\n notify();\n return undefined;\n }\n if (!active || handle.instanceId !== instanceId) {\n await handle.stop(active ? 'Loop launcher returned a mismatched instance id.' : 'Loop launch was cancelled.');\n if (instances.get(instanceId) === entry) instances.delete(instanceId);\n notify();\n if (active) throw new Error(`Loop launcher '${normalizedLauncherId}' returned a mismatched instance id.`);\n return undefined;\n }\n entry.handle = handle;\n entry.state = 'running';\n entry.startedAt = timestamp();\n notify();\n return snapshot(entry);\n } catch (error) {\n const cancelled = entry.abortController.signal.aborted || disposed;\n if (instances.get(instanceId) === entry) instances.delete(instanceId);\n notify();\n if (cancelled) return undefined;\n throw error;\n } finally {\n options?.signal?.removeEventListener('abort', abortSetup);\n }\n },\n async stop(instanceId, reason) {\n ensureActive();\n const entry = instances.get(validId(instanceId, INSTANCE_ID_LABEL));\n if (!entry) return false;\n await stopEntry(entry, reason);\n return true;\n },\n async stopAll(reason) {\n if (disposed && instances.size === 0) return;\n await Promise.allSettled([...instances.values()].map((entry) => stopEntry(entry, reason)));\n },\n async dispose(reason = 'Po loop-launchers service disposed.') {\n if (disposed) return;\n disposed = true;\n launchers.clear();\n await Promise.allSettled([...instances.values()].map((entry) => stopEntry(entry, reason)));\n listeners.clear();\n },\n };\n\n return Object.freeze(service);\n}\n","import { defineTool, type PoPluginTool, type PoPluginToolResult } from '@agimon-ai/po-core/serverPlugin';\nimport { Check } from 'typebox/value';\n\nimport type { PoLoopLaunchersService } from '../../schemas/loopLaunchers';\nimport { LoopListSchema, LoopStartSchema, LoopStopSchema } from '../../schemas/loopTools';\n\nfunction result(details: unknown): PoPluginToolResult {\n return { content: [{ type: 'text', text: JSON.stringify(details, null, 2) }], details };\n}\n\nexport function createLoopTools(\n launchers: () => PoLoopLaunchersService,\n assertEnabled: () => void,\n): readonly PoPluginTool[] {\n return [\n defineTool({\n name: 'loop_list',\n label: 'List loops',\n description: 'List active session loops and available launcher types with their configuration schemas.',\n parameters: LoopListSchema,\n async execute(input, { signal }) {\n assertEnabled();\n signal?.throwIfAborted();\n if (!Check(LoopListSchema, input)) throw new Error('loop_list takes no arguments.');\n const service = launchers();\n return result({ launchers: service.listLaunchers(), instances: service.listInstances() });\n },\n }),\n defineTool({\n name: 'loop_start',\n label: 'Start loop',\n description:\n 'Start a session-scoped loop without operator dialogs. Read loop_list for launcher IDs and input schemas. Loops stop when the session shuts down.',\n parameters: LoopStartSchema,\n executionMode: 'serial',\n async execute(input, { signal }) {\n assertEnabled();\n signal?.throwIfAborted();\n if (!Check(LoopStartSchema, input)) throw new Error('Provide launcherId, input, and optionally instanceId.');\n return result(\n (await launchers().launch(input.launcherId, { ...input, interactive: false, signal })) ?? { cancelled: true },\n );\n },\n }),\n defineTool({\n name: 'loop_stop',\n label: 'Stop loop',\n description:\n 'Stop one loop instance owned by the current session. Does not disable Loop mode or stop other loops.',\n parameters: LoopStopSchema,\n executionMode: 'serial',\n async execute(input, { signal }) {\n assertEnabled();\n signal?.throwIfAborted();\n if (!Check(LoopStopSchema, input)) throw new Error('Provide instanceId and an optional reason.');\n return result({ stopped: await launchers().stop(input.instanceId, input.reason ?? 'Stopped by the agent.') });\n },\n }),\n ];\n}\n","import type { PoHeadlessExecutionContext, PoHeadlessHostService } from '@agimon-ai/po-core/headless';\nimport { readPackageResource, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\nimport { defineMinorMode, serverMinorModes } from '@agimon-ai/po-minor-mode';\nimport { Cron } from 'croner';\n\nimport { LIST_COMMAND_NAME } from '../../constants/loop';\nimport { MODE_STATUS_ID, PACKAGE_SOURCE } from '../../constants/piLoop';\nimport { PO_LOOP_LAUNCHERS_SERVICE, type LoopLaunchRequest } from '../../schemas/loopLaunchers';\nimport { CronLoopSchema, IntervalLoopSchema, parseCronLoop, parseIntervalLoop } from '../../schemas/loopTools';\nimport { formatLoopStatusView, LOOP_VIEW_STATUS_KEY } from '../../types/loopView';\nimport { createPoLoopLaunchersService } from '../loopLaunchers';\nimport { createLoopTools } from '../loopTools';\nimport type { LoopToolsRoot } from '../loopTools/type';\n\nexport type LoopServerState = PoServerSessionPlugin & LoopToolsRoot;\n\n/** Loops are set by the agent, so a launch always carries its configuration. */\nfunction prepareLoop(request: LoopLaunchRequest, cron: boolean) {\n if (request.input === undefined) throw new Error('Loop configuration is required. Ask the agent to set the loop.');\n return cron ? parseCronLoop(request.input) : parseIntervalLoop(request.input);\n}\n\nexport function createSessionState(host: PoHeadlessHostService): LoopServerState {\n const launchers = createPoLoopLaunchersService({\n generation: `${host.context.sessionId}:loop-launchers`,\n createInstanceId: () => crypto.randomUUID(),\n timestamp: () => new Date().toISOString(),\n });\n let disposed = false;\n const modeSelected = (): boolean =>\n !disposed && (host.context.selection.state?.['minor-mode'] ?? []).includes(MODE_STATUS_ID);\n const publishView = (): void =>\n host.context.client.setStatus(LOOP_VIEW_STATUS_KEY, formatLoopStatusView(launchers.listInstances()));\n const modeOwner = defineMinorMode({\n descriptor: {\n source: PACKAGE_SOURCE,\n id: MODE_STATUS_ID,\n label: 'Loop',\n description: 'Give the agent tools to create, inspect, and stop session loops.',\n order: 60,\n actions: [\n {\n id: 'activate',\n label: 'Activate',\n description: 'Expose loop tools to the agent.',\n contexts: ['headless'],\n parameters: [],\n },\n {\n id: 'deactivate',\n label: 'Deactivate',\n description: 'Hide agent loop tools. Existing loops and manual controls remain available.',\n contexts: ['headless'],\n parameters: [],\n },\n ],\n },\n state: () => ({\n activation: modeSelected() ? 'active' : 'inactive',\n condition: 'ready',\n ...(modeSelected() ? { detail: `${launchers.listInstances().length} loops`, color: 'accent' } : {}),\n actions: [\n {\n id: 'activate',\n enabled: !modeSelected(),\n ...(modeSelected() ? { disabledReason: 'Loop mode is already active.' } : {}),\n },\n {\n id: 'deactivate',\n enabled: modeSelected(),\n ...(modeSelected() ? {} : { disabledReason: 'Loop mode is not active.' }),\n },\n ],\n }),\n async handleAction(_runtime, actionId, _arguments, { signal }) {\n signal.throwIfAborted();\n if (actionId !== 'activate' && actionId !== 'deactivate')\n throw new Error(`Unknown loop mode action: ${actionId}`);\n const modes = (host.context.selection.state?.['minor-mode'] ?? []).filter((mode) => mode !== MODE_STATUS_ID);\n await host.changeSelection({\n axis: 'state',\n key: 'minor-mode',\n values: actionId === 'activate' ? [...modes, MODE_STATUS_ID] : modes,\n });\n modeOwner.publish();\n return {\n message:\n actionId === 'activate' ? 'Loop tools activated.' : 'Loop tools deactivated. Existing loops are unchanged.',\n };\n },\n }).createOwner(undefined);\n const publish = (): void => {\n if (disposed) return;\n modeOwner.publish();\n publishView();\n };\n const unsubscribe = launchers.subscribe(publish);\n let submitting = false;\n const pending = new Set<() => Promise<void>>();\n for (const cron of [false, true]) {\n launchers.register({\n id: cron ? 'po.cron' : 'po.default',\n source: PACKAGE_SOURCE,\n label: cron ? 'Cron loop' : 'Default loop',\n description: cron\n ? 'Run a prompt on a five-field cron schedule.'\n : 'Run a prompt in this session on an interval.',\n inputSchema: { ...(cron ? CronLoopSchema : IntervalLoopSchema) },\n async launch(request) {\n const execution = host.context;\n const prepared = prepareLoop(request, cron);\n if (!prepared || request.signal.aborted) return undefined;\n let stopped = false;\n const tick = async (due = true): Promise<void> => {\n if (disposed || stopped || request.signal.aborted) return;\n if (due) pending.add(replay);\n if (submitting || !pending.has(replay)) return;\n submitting = true;\n try {\n const activity = await execution.session.activity();\n if (disposed || stopped || request.signal.aborted || !activity.isIdle || activity.hasPendingMessages)\n return;\n pending.delete(replay);\n if (!execution.session.admitPrompt) throw new Error('Loop prompt admission is unavailable.');\n await execution.session.admitPrompt(prepared.prompt);\n } catch (error) {\n await execution.client.notify({\n body: `Loop pass failed: ${error instanceof Error ? error.message : String(error)}`,\n level: 'warning',\n });\n } finally {\n submitting = false;\n }\n };\n const replay = (): Promise<void> => tick(false);\n let stopTimer: () => void;\n let detail: string;\n if ('cron' in prepared) {\n const job = new Cron(prepared.cron, { timezone: prepared.timezone, unref: true }, () => tick());\n if (job.nextRun() === null) {\n job.stop();\n throw new Error('Cron expression has no future run.');\n }\n stopTimer = () => {\n job.stop();\n };\n detail = `${prepared.cron} (${prepared.timezone})`;\n } else {\n const timer = setInterval(() => {\n void tick();\n }, prepared.intervalSeconds * 1000);\n timer.unref?.();\n stopTimer = () => clearInterval(timer);\n detail = `every ${prepared.intervalSeconds}s`;\n void tick();\n }\n return {\n instanceId: request.instanceId,\n label: cron ? 'Cron loop' : 'Default loop',\n detail,\n stop() {\n stopped = true;\n pending.delete(replay);\n stopTimer();\n },\n };\n },\n });\n }\n const loopTools = createLoopTools(\n () => launchers,\n () => {\n if (!modeSelected()) throw new Error('Enable Loop minor mode before using agent loop tools.');\n },\n ).map((tool) => ({\n ...tool,\n when: { state: { 'minor-mode': MODE_STATUS_ID }, attribution: { kind: 'minor' as const, mode: MODE_STATUS_ID } },\n }));\n return {\n loopTools,\n services: [\n (context) => {\n context.plugin((provider) => {\n provider.provide(PO_LOOP_LAUNCHERS_SERVICE, launchers);\n });\n context.effect(() => host.subscribeSelection(publish));\n },\n serverMinorModes([modeOwner]),\n ],\n resources: [\n {\n when: { state: { 'minor-mode': MODE_STATUS_ID }, attribution: { kind: 'minor', mode: MODE_STATUS_ID } },\n name: 'po-use-loop',\n kind: 'skill',\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-use-loop/SKILL.md'),\n },\n ],\n activities: [\n {\n name: 'po-loop',\n async start() {\n publish();\n return async () => {\n await launchers.stopAll('Session loop activity stopped.');\n publish();\n };\n },\n },\n ],\n commands: [\n {\n name: LIST_COMMAND_NAME,\n description: 'List or stop session loops. Usage: /loops [stop instanceId].',\n async execute(args: string, execution: PoHeadlessExecutionContext) {\n const parts = args.trim().split(/\\s+/u);\n if (parts[0] === 'stop' && parts.length === 2) {\n const stopped = await launchers.stop(parts[1]!, 'Stopped manually.');\n await execution.client.notify({\n body: stopped ? 'Loop stopped.' : 'Loop instance was not active.',\n level: 'info',\n });\n return;\n }\n if (args.trim()) throw new Error('Usage: /loops [stop instanceId]');\n const instances = launchers.listInstances();\n await execution.client.notify({\n body: instances.length === 0 ? 'No loops are active.' : JSON.stringify(instances, null, 2),\n level: 'info',\n });\n },\n },\n ],\n hooks: [\n {\n event: 'agent_settled',\n async handle() {\n if (!disposed) await pending.values().next().value?.();\n },\n },\n {\n event: 'session_start',\n async handle() {\n publish();\n },\n },\n {\n event: 'session_shutdown',\n async handle() {\n await launchers.stopAll('Headless session shutdown.');\n },\n },\n ],\n onStart: publish,\n async onDispose() {\n if (disposed) return;\n disposed = true;\n pending.clear();\n unsubscribe();\n await launchers.dispose('Loop server plugin disposed.');\n },\n };\n}\n","import type { PoServerPluginDefinition } from '@agimon-ai/po-core/serverPlugin';\n\nimport { createSessionState, type LoopServerState } from '../../../../../services/serverRuntime';\n\nexport default (({ agent }): LoopServerState =>\n agent ? createSessionState(agent) : { loopTools: [] }) satisfies NonNullable<PoServerPluginDefinition['session']>;\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport runtime from './_lib/runtime.server';\n\nexport default defineRoot((context: PoServerPluginContext) => {\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/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) => context.root.commands?.[0],\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) =>\n context.root.hooks?.find((hook) => hook.event === 'agent_settled'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) =>\n context.root.hooks?.find((hook) => hook.event === 'session_shutdown'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) =>\n context.root.hooks?.find((hook) => hook.event === 'session_start'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) => context.root.resources?.[0],\n { cardinality: 'optional' },\n);\n","import { defineTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport type { LoopToolsRoot } from '../../../../../services/loopTools/type';\n\nexport default defineTool((context: WithRoot<unknown, LoopToolsRoot>) => context.root.loopTools[0]!);\n","import { defineTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport type { LoopToolsRoot } from '../../../../../services/loopTools/type';\n\nexport default defineTool((context: WithRoot<unknown, LoopToolsRoot>) => context.root.loopTools[1]!);\n","import { defineTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport type { LoopToolsRoot } from '../../../../../services/loopTools/type';\n\nexport default defineTool((context: WithRoot<unknown, LoopToolsRoot>) => context.root.loopTools[2]!);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverPlugin';\nimport { composeRootHooks, composeRootInjects } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport commandLoops from '../src/extensions/workspaces/sessions/(backend)/command/loops.server';\nimport hookAgentSettled from '../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.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 resourcePoUseLoop from '../src/extensions/workspaces/sessions/(backend)/resource/po-use-loop.server';\nimport toolLoopList from '../src/extensions/workspaces/sessions/(backend)/tool/loop-list.server';\nimport toolLoopStart from '../src/extensions/workspaces/sessions/(backend)/tool/loop-start.server';\nimport toolLoopStop from '../src/extensions/workspaces/sessions/(backend)/tool/loop-stop.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 =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const serverPlugin = defineServerPlugin({\n name: '@agimon-ai/po-loop',\n providerOverrides: composeServerProviderOverrides(rootSession),\n injects: composeRootInjects({ session: [rootSession] }),\n session: async (context) => {\n const scopeSession = await context.scopeRoot('session', rootSession, context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): PoServerSessionPlugin['commands'] { return defined([via({ name: 'loops' }, at(commandLoops, contextSession))]); },\n get hooks(): PoServerSessionPlugin['hooks'] { return defined([via({ event: 'agent_settled' }, at(hookAgentSettled, contextSession)), via({ event: 'session_shutdown' }, at(hookSessionShutdown, contextSession)), via({ event: 'session_start' }, at(hookSessionStart, contextSession))]); },\n get resources(): PoServerSessionPlugin['resources'] { return defined([at(resourcePoUseLoop, contextSession)]); },\n get tools(): PoServerSessionPlugin['tools'] { return [via({ name: 'loop_list' }, at(toolLoopList, contextSession)), via({ name: 'loop_start' }, at(toolLoopStart, contextSession)), via({ name: 'loop_stop' }, at(toolLoopStop, contextSession))]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default serverPlugin;\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region generated/server.d.ts
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const serverPlugin: import("@agimon-ai/po-core/serverPlugin").PoServerPlugin;
|
|
3
3
|
//#endregion
|
|
4
|
-
export {
|
|
4
|
+
export { serverPlugin as default };
|
|
5
5
|
//# sourceMappingURL=server.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.mts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAwBa,
|
|
1
|
+
{"version":3,"file":"server.d.mts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAwBa,wDAAY"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as PO_LOOP_LAUNCHERS_SERVICE } from "../loopLaunchers-BCVj0k8F.mjs";
|
|
2
|
-
import { composeServerProviderOverrides, defineServerPlugin, defineTool, readPackageResource } from "@agimon-ai/po-core/
|
|
3
|
-
import { composeRootHooks, defineRoot, defineRoutedContribution, defineTool as defineTool$1 } from "@agimon-ai/po-core/extensionFile";
|
|
2
|
+
import { composeServerProviderOverrides, defineServerPlugin, defineTool, readPackageResource } from "@agimon-ai/po-core/serverPlugin";
|
|
3
|
+
import { composeRootHooks, composeRootInjects, defineRoot, defineRoutedContribution, defineTool as defineTool$1 } from "@agimon-ai/po-core/extensionFile";
|
|
4
4
|
import { defineMinorMode, serverMinorModes } from "@agimon-ai/po-minor-mode";
|
|
5
5
|
import { Cron } from "croner";
|
|
6
6
|
import { Type } from "typebox";
|
|
@@ -571,7 +571,7 @@ function createSessionState(host) {
|
|
|
571
571
|
disposed = true;
|
|
572
572
|
pending.clear();
|
|
573
573
|
unsubscribe();
|
|
574
|
-
await launchers.dispose("
|
|
574
|
+
await launchers.dispose("Loop server plugin disposed.");
|
|
575
575
|
}
|
|
576
576
|
};
|
|
577
577
|
}
|
|
@@ -624,11 +624,12 @@ const via = (identity, value) => value === void 0 ? void 0 : {
|
|
|
624
624
|
...identity,
|
|
625
625
|
...value
|
|
626
626
|
};
|
|
627
|
-
const
|
|
627
|
+
const serverPlugin = defineServerPlugin({
|
|
628
628
|
name: "@agimon-ai/po-loop",
|
|
629
629
|
providerOverrides: composeServerProviderOverrides(root_server_default),
|
|
630
|
+
injects: composeRootInjects({ session: [root_server_default] }),
|
|
630
631
|
session: async (context) => {
|
|
631
|
-
const scopeSession = await root_server_default
|
|
632
|
+
const scopeSession = await context.scopeRoot("session", root_server_default, context);
|
|
632
633
|
const contextSession = {
|
|
633
634
|
...context,
|
|
634
635
|
root: scopeSession.value
|
|
@@ -663,6 +664,6 @@ const facet = defineServerPlugin({
|
|
|
663
664
|
}
|
|
664
665
|
});
|
|
665
666
|
//#endregion
|
|
666
|
-
export {
|
|
667
|
+
export { serverPlugin as default, serverPlugin };
|
|
667
668
|
|
|
668
669
|
//# sourceMappingURL=server.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.mjs","names":["runtime","defineTool","defineTool","defineTool","rootSession","commandLoops","hookAgentSettled","hookSessionShutdown","hookSessionStart","resourcePoUseLoop","toolLoopList","toolLoopStart","toolLoopStop"],"sources":["../../src/constants/loop.ts","../../src/constants/piLoop.ts","../../src/schemas/loopTools.ts","../../src/types/loopView.ts","../../src/services/loopLaunchers/index.ts","../../src/services/loopTools/index.ts","../../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/loops.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.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/po-use-loop.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/loop-list.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/loop-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/loop-stop.server.ts","../../generated/server.ts"],"sourcesContent":["export const START_COMMAND_DESCRIPTION = 'Start a registered loop';\nexport const LIST_COMMAND_DESCRIPTION = 'List and stop active loops';\nexport const START_COMMAND_NAME = 'loop';\nexport const LIST_COMMAND_NAME = 'loops';\n","export const PACKAGE_SOURCE = '@agimon-ai/po-loop';\nexport const LOOPS_GROUP_ORDER = 60;\nexport const STATUS_KEY = 'po-loop';\nexport const MODE_STATUS_ID = 'loop';\nexport const ACTIVE_MODE_COLOR = 'warning';\nexport const NOTIFY_INFO_LEVEL = 'info';\nexport const NOTIFY_WARNING_LEVEL = 'warning';\n","import { type Static, Type } from 'typebox';\nimport { Check } from 'typebox/value';\n\nexport const LoopListSchema = Type.Object({}, { additionalProperties: false });\nexport const LoopStartSchema = Type.Object(\n {\n launcherId: Type.String({ minLength: 1, maxLength: 256 }),\n instanceId: Type.Optional(Type.String({ minLength: 1, maxLength: 256 })),\n input: Type.Record(Type.String(), Type.Unknown()),\n },\n { additionalProperties: false },\n);\nexport const LoopStopSchema = Type.Object(\n {\n instanceId: Type.String({ minLength: 1, maxLength: 256 }),\n reason: Type.Optional(Type.String({ minLength: 1, maxLength: 512 })),\n },\n { additionalProperties: false },\n);\n\nexport const IntervalLoopSchema = Type.Object(\n {\n prompt: Type.String({ minLength: 1, maxLength: 32768 }),\n intervalSeconds: Type.Integer({ minimum: 30, maximum: 3600 }),\n },\n { additionalProperties: false },\n);\nexport const CronLoopSchema = Type.Object(\n {\n prompt: Type.String({ minLength: 1, maxLength: 32768 }),\n cron: Type.String({ minLength: 1, maxLength: 256 }),\n timezone: Type.Optional(Type.String({ minLength: 1, maxLength: 128 })),\n },\n { additionalProperties: false },\n);\nexport type IntervalLoopInput = Static<typeof IntervalLoopSchema>;\nexport type CronLoopInput = Static<typeof CronLoopSchema>;\n\nexport function parseIntervalLoop(input: unknown): IntervalLoopInput {\n if (!Check(IntervalLoopSchema, input) || !input.prompt.trim()) {\n throw new Error('Provide a non-empty prompt and an integer intervalSeconds between 30 and 3600.');\n }\n return { ...input, prompt: input.prompt.trim() };\n}\n\nexport function parseCronLoop(input: unknown): CronLoopInput {\n if (!Check(CronLoopSchema, input) || !input.prompt.trim() || input.cron.trim().split(/\\s+/u).length !== 5) {\n throw new Error('Provide a non-empty prompt and a five-field cron expression, with an optional IANA timezone.');\n }\n const timezone = input.timezone ?? 'UTC';\n new Intl.DateTimeFormat('en', { timeZone: timezone }).format();\n return { ...input, prompt: input.prompt.trim(), cron: input.cron.trim(), timezone };\n}\n","/** The browser-only status that carries active Loop instances into the activity dock. */\nexport const LOOP_VIEW_STATUS_KEY = 'po-loop-instances';\n\nexport type LoopStatusState = 'starting' | 'running' | 'stopping';\n\n/** The small, serializable Loop view the cockpit needs for one activity row. */\nexport interface LoopStatusItem {\n readonly instanceId: string;\n readonly label: string;\n readonly detail: string;\n readonly state: LoopStatusState;\n}\n\ninterface LoopStatusSource {\n readonly instanceId: string;\n readonly launcherLabel: string;\n readonly label?: string;\n readonly detail?: string;\n readonly state: LoopStatusState;\n}\n\nconst ANSI = new RegExp(String.raw`\\u001b\\[[0-9;]*m`, 'gu');\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isState(value: unknown): value is LoopStatusState {\n return value === 'starting' || value === 'running' || value === 'stopping';\n}\n\n/** Projects runtime snapshots into the JSON status consumed by the web plugin. */\nexport function formatLoopStatusView(instances: readonly LoopStatusSource[]): string {\n if (instances.length === 0) return '';\n return JSON.stringify(\n instances.map((instance) => ({\n instanceId: instance.instanceId,\n label: instance.label ?? instance.launcherLabel,\n detail: instance.detail ?? instance.instanceId,\n state: instance.state,\n })),\n );\n}\n\n/** Reads a Loop status without letting malformed session data crash the activity dock. */\nexport function parseLoopStatusView(raw: string | undefined): LoopStatusItem[] | undefined {\n if (raw === undefined) return undefined;\n const text = raw.replace(ANSI, '').trim();\n if (text === '') return undefined;\n\n try {\n const value: unknown = JSON.parse(text);\n if (!Array.isArray(value) || value.length === 0) return undefined;\n const items: LoopStatusItem[] = [];\n for (const item of value) {\n if (\n !isRecord(item) ||\n typeof item.instanceId !== 'string' ||\n item.instanceId.trim() === '' ||\n typeof item.label !== 'string' ||\n item.label.trim() === '' ||\n typeof item.detail !== 'string' ||\n !isState(item.state)\n ) {\n return undefined;\n }\n items.push({ instanceId: item.instanceId, label: item.label, detail: item.detail, state: item.state });\n }\n return items;\n } catch {\n return undefined;\n }\n}\n","import type {\n PoLoopLaunchersService,\n LoopInstanceSnapshot,\n LoopLauncherDefinition,\n LoopLauncherRegistration,\n StoppableLoop,\n} from '../../schemas/loopLaunchers';\n\nconst MAX_ID_LENGTH = 256;\nconst MAX_GENERATION_LENGTH = 256;\nconst LAUNCHER_ID_LABEL = 'loop launcher id';\nconst INSTANCE_ID_LABEL = 'loop instance id';\n\ninterface LauncherEntry {\n readonly token: symbol;\n readonly definition: LoopLauncherDefinition;\n}\n\ninterface InstanceEntry {\n readonly instanceId: string;\n readonly launcher: LauncherEntry;\n readonly abortController: AbortController;\n state: LoopInstanceSnapshot['state'];\n handle?: StoppableLoop;\n startedAt?: string;\n}\n\nexport interface LoopLaunchersDependencies {\n readonly generation: string;\n readonly createInstanceId: () => string;\n readonly timestamp: () => string;\n}\n\nfunction validId(value: string, label: string): string {\n if (typeof value !== 'string') throw new TypeError(`Invalid ${label}.`);\n const normalized = value.trim();\n let hasControl = false;\n for (const character of normalized) {\n const code = character.codePointAt(0);\n if (code !== undefined && (code <= 0x1f || code === 0x7f)) {\n hasControl = true;\n break;\n }\n }\n if (!normalized || normalized.length > MAX_ID_LENGTH || hasControl) throw new Error(`Invalid ${label}.`);\n return normalized;\n}\n\nfunction snapshot(entry: InstanceEntry): LoopInstanceSnapshot {\n return {\n instanceId: entry.instanceId,\n launcherId: entry.launcher.definition.id,\n launcherLabel: entry.launcher.definition.label,\n ...(entry.handle?.label ? { label: entry.handle.label } : {}),\n ...(entry.handle?.detail ? { detail: entry.handle.detail } : {}),\n state: entry.state,\n ...(entry.startedAt ? { startedAt: entry.startedAt } : {}),\n };\n}\n\n/** Creates the provider-owned launcher registry for one active Po session. */\nexport function createPoLoopLaunchersService({\n generation,\n createInstanceId,\n timestamp,\n}: LoopLaunchersDependencies): PoLoopLaunchersService {\n if (!generation || generation.length > MAX_GENERATION_LENGTH) {\n throw new TypeError('Po loop launchers require a valid generation.');\n }\n\n const launchers = new Map<string, LauncherEntry>();\n const instances = new Map<string, InstanceEntry>();\n const listeners = new Set<() => void>();\n let registrationSequence = 0;\n let disposed = false;\n\n const ensureActive = (): void => {\n if (disposed) throw new Error('The Po loop-launchers service is disposed.');\n };\n const notify = (): void => {\n for (const listener of listeners) listener();\n };\n const stopEntry = async (entry: InstanceEntry, reason?: string): Promise<void> => {\n if (instances.get(entry.instanceId) !== entry) return;\n entry.state = 'stopping';\n entry.abortController.abort(reason);\n notify();\n try {\n await entry.handle?.stop(reason);\n } finally {\n if (instances.get(entry.instanceId) === entry) instances.delete(entry.instanceId);\n notify();\n }\n };\n\n const service: PoLoopLaunchersService = {\n generation,\n register(definition): LoopLauncherRegistration {\n ensureActive();\n const id = validId(definition.id, LAUNCHER_ID_LABEL);\n if (launchers.has(id)) throw new Error(`Loop launcher '${id}' is already registered.`);\n const token = Symbol(id);\n const entry: LauncherEntry = { token, definition: { ...definition, id } };\n launchers.set(id, entry);\n registrationSequence += 1;\n notify();\n let registrationDisposed = false;\n return Object.freeze({\n id,\n generation: `${generation}:launcher:${registrationSequence}`,\n async dispose(reason = 'Loop launcher disposed.'): Promise<void> {\n if (registrationDisposed) return;\n registrationDisposed = true;\n if (launchers.get(id)?.token !== token) return;\n launchers.delete(id);\n const owned = [...instances.values()].filter((instance) => instance.launcher.token === token);\n await Promise.allSettled(owned.map((instance) => stopEntry(instance, reason)));\n notify();\n },\n });\n },\n listLaunchers() {\n ensureActive();\n return [...launchers.values()]\n .map(({ definition }) => ({\n id: definition.id,\n source: definition.source,\n label: definition.label,\n ...(definition.description ? { description: definition.description } : {}),\n ...(definition.inputSchema ? { inputSchema: definition.inputSchema } : {}),\n }))\n .sort((left, right) => left.label.localeCompare(right.label) || left.id.localeCompare(right.id));\n },\n listInstances() {\n ensureActive();\n return [...instances.values()]\n .map(snapshot)\n .sort((left, right) => left.instanceId.localeCompare(right.instanceId));\n },\n subscribe(listener) {\n ensureActive();\n listeners.add(listener);\n let subscribed = true;\n return () => {\n if (!subscribed) return;\n subscribed = false;\n listeners.delete(listener);\n };\n },\n async launch(launcherId, options) {\n ensureActive();\n options?.signal?.throwIfAborted();\n const normalizedLauncherId = validId(launcherId, LAUNCHER_ID_LABEL);\n const launcher = launchers.get(normalizedLauncherId);\n if (!launcher) throw new Error(`Loop launcher '${normalizedLauncherId}' is unavailable.`);\n const instanceId = validId(options?.instanceId ?? createInstanceId(), INSTANCE_ID_LABEL);\n if (instances.has(instanceId)) throw new Error(`Loop instance '${instanceId}' already exists.`);\n const entry: InstanceEntry = { instanceId, launcher, abortController: new AbortController(), state: 'starting' };\n const abortSetup = (): void => entry.abortController.abort(options?.signal?.reason);\n options?.signal?.addEventListener('abort', abortSetup, { once: true });\n instances.set(instanceId, entry);\n notify();\n try {\n if (options?.interactive === false && !launcher.definition.inputSchema) {\n throw new Error(`Loop launcher '${normalizedLauncherId}' requires manual setup in Activity.`);\n }\n const handle = await launcher.definition.launch({\n instanceId,\n signal: entry.abortController.signal,\n ...(options?.input === undefined ? {} : { input: options.input }),\n ...(options?.interactive === undefined ? {} : { interactive: options.interactive }),\n });\n const active = !disposed && instances.get(instanceId) === entry && !entry.abortController.signal.aborted;\n if (!handle) {\n if (instances.get(instanceId) === entry) instances.delete(instanceId);\n notify();\n return undefined;\n }\n if (!active || handle.instanceId !== instanceId) {\n await handle.stop(active ? 'Loop launcher returned a mismatched instance id.' : 'Loop launch was cancelled.');\n if (instances.get(instanceId) === entry) instances.delete(instanceId);\n notify();\n if (active) throw new Error(`Loop launcher '${normalizedLauncherId}' returned a mismatched instance id.`);\n return undefined;\n }\n entry.handle = handle;\n entry.state = 'running';\n entry.startedAt = timestamp();\n notify();\n return snapshot(entry);\n } catch (error) {\n const cancelled = entry.abortController.signal.aborted || disposed;\n if (instances.get(instanceId) === entry) instances.delete(instanceId);\n notify();\n if (cancelled) return undefined;\n throw error;\n } finally {\n options?.signal?.removeEventListener('abort', abortSetup);\n }\n },\n async stop(instanceId, reason) {\n ensureActive();\n const entry = instances.get(validId(instanceId, INSTANCE_ID_LABEL));\n if (!entry) return false;\n await stopEntry(entry, reason);\n return true;\n },\n async stopAll(reason) {\n if (disposed && instances.size === 0) return;\n await Promise.allSettled([...instances.values()].map((entry) => stopEntry(entry, reason)));\n },\n async dispose(reason = 'Po loop-launchers service disposed.') {\n if (disposed) return;\n disposed = true;\n launchers.clear();\n await Promise.allSettled([...instances.values()].map((entry) => stopEntry(entry, reason)));\n listeners.clear();\n },\n };\n\n return Object.freeze(service);\n}\n","import { defineTool, type PoPluginTool, type PoPluginToolResult } from '@agimon-ai/po-core/serverFacet';\nimport { Check } from 'typebox/value';\n\nimport type { PoLoopLaunchersService } from '../../schemas/loopLaunchers';\nimport { LoopListSchema, LoopStartSchema, LoopStopSchema } from '../../schemas/loopTools';\n\nfunction result(details: unknown): PoPluginToolResult {\n return { content: [{ type: 'text', text: JSON.stringify(details, null, 2) }], details };\n}\n\nexport function createLoopTools(\n launchers: () => PoLoopLaunchersService,\n assertEnabled: () => void,\n): readonly PoPluginTool[] {\n return [\n defineTool({\n name: 'loop_list',\n label: 'List loops',\n description: 'List active session loops and available launcher types with their configuration schemas.',\n parameters: LoopListSchema,\n async execute(input, { signal }) {\n assertEnabled();\n signal?.throwIfAborted();\n if (!Check(LoopListSchema, input)) throw new Error('loop_list takes no arguments.');\n const service = launchers();\n return result({ launchers: service.listLaunchers(), instances: service.listInstances() });\n },\n }),\n defineTool({\n name: 'loop_start',\n label: 'Start loop',\n description:\n 'Start a session-scoped loop without operator dialogs. Read loop_list for launcher IDs and input schemas. Loops stop when the session shuts down.',\n parameters: LoopStartSchema,\n executionMode: 'serial',\n async execute(input, { signal }) {\n assertEnabled();\n signal?.throwIfAborted();\n if (!Check(LoopStartSchema, input)) throw new Error('Provide launcherId, input, and optionally instanceId.');\n return result(\n (await launchers().launch(input.launcherId, { ...input, interactive: false, signal })) ?? { cancelled: true },\n );\n },\n }),\n defineTool({\n name: 'loop_stop',\n label: 'Stop loop',\n description:\n 'Stop one loop instance owned by the current session. Does not disable Loop mode or stop other loops.',\n parameters: LoopStopSchema,\n executionMode: 'serial',\n async execute(input, { signal }) {\n assertEnabled();\n signal?.throwIfAborted();\n if (!Check(LoopStopSchema, input)) throw new Error('Provide instanceId and an optional reason.');\n return result({ stopped: await launchers().stop(input.instanceId, input.reason ?? 'Stopped by the agent.') });\n },\n }),\n ];\n}\n","import type { PoHeadlessExecutionContext, PoHeadlessHostService } from '@agimon-ai/po-core/headless';\nimport { readPackageResource, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\nimport { defineMinorMode, serverMinorModes } from '@agimon-ai/po-minor-mode';\nimport { Cron } from 'croner';\n\nimport { LIST_COMMAND_NAME } from '../../constants/loop';\nimport { MODE_STATUS_ID, PACKAGE_SOURCE } from '../../constants/piLoop';\nimport { PO_LOOP_LAUNCHERS_SERVICE, type LoopLaunchRequest } from '../../schemas/loopLaunchers';\nimport { CronLoopSchema, IntervalLoopSchema, parseCronLoop, parseIntervalLoop } from '../../schemas/loopTools';\nimport { formatLoopStatusView, LOOP_VIEW_STATUS_KEY } from '../../types/loopView';\nimport { createPoLoopLaunchersService } from '../loopLaunchers';\nimport { createLoopTools } from '../loopTools';\nimport type { LoopToolsRoot } from '../loopTools/type';\n\nexport type LoopServerState = PoServerSessionPlugin & LoopToolsRoot;\n\n/** Loops are set by the agent, so a launch always carries its configuration. */\nfunction prepareLoop(request: LoopLaunchRequest, cron: boolean) {\n if (request.input === undefined) throw new Error('Loop configuration is required. Ask the agent to set the loop.');\n return cron ? parseCronLoop(request.input) : parseIntervalLoop(request.input);\n}\n\nexport function createSessionState(host: PoHeadlessHostService): LoopServerState {\n const launchers = createPoLoopLaunchersService({\n generation: `${host.context.sessionId}:loop-launchers`,\n createInstanceId: () => crypto.randomUUID(),\n timestamp: () => new Date().toISOString(),\n });\n let disposed = false;\n const modeSelected = (): boolean =>\n !disposed && (host.context.selection.state?.['minor-mode'] ?? []).includes(MODE_STATUS_ID);\n const publishView = (): void =>\n host.context.client.setStatus(LOOP_VIEW_STATUS_KEY, formatLoopStatusView(launchers.listInstances()));\n const modeOwner = defineMinorMode({\n descriptor: {\n source: PACKAGE_SOURCE,\n id: MODE_STATUS_ID,\n label: 'Loop',\n description: 'Give the agent tools to create, inspect, and stop session loops.',\n order: 60,\n actions: [\n {\n id: 'activate',\n label: 'Activate',\n description: 'Expose loop tools to the agent.',\n contexts: ['headless'],\n parameters: [],\n },\n {\n id: 'deactivate',\n label: 'Deactivate',\n description: 'Hide agent loop tools. Existing loops and manual controls remain available.',\n contexts: ['headless'],\n parameters: [],\n },\n ],\n },\n state: () => ({\n activation: modeSelected() ? 'active' : 'inactive',\n condition: 'ready',\n ...(modeSelected() ? { detail: `${launchers.listInstances().length} loops`, color: 'accent' } : {}),\n actions: [\n {\n id: 'activate',\n enabled: !modeSelected(),\n ...(modeSelected() ? { disabledReason: 'Loop mode is already active.' } : {}),\n },\n {\n id: 'deactivate',\n enabled: modeSelected(),\n ...(modeSelected() ? {} : { disabledReason: 'Loop mode is not active.' }),\n },\n ],\n }),\n async handleAction(_runtime, actionId, _arguments, { signal }) {\n signal.throwIfAborted();\n if (actionId !== 'activate' && actionId !== 'deactivate')\n throw new Error(`Unknown loop mode action: ${actionId}`);\n const modes = (host.context.selection.state?.['minor-mode'] ?? []).filter((mode) => mode !== MODE_STATUS_ID);\n await host.changeSelection({\n axis: 'state',\n key: 'minor-mode',\n values: actionId === 'activate' ? [...modes, MODE_STATUS_ID] : modes,\n });\n modeOwner.publish();\n return {\n message:\n actionId === 'activate' ? 'Loop tools activated.' : 'Loop tools deactivated. Existing loops are unchanged.',\n };\n },\n }).createOwner(undefined);\n const publish = (): void => {\n if (disposed) return;\n modeOwner.publish();\n publishView();\n };\n const unsubscribe = launchers.subscribe(publish);\n let submitting = false;\n const pending = new Set<() => Promise<void>>();\n for (const cron of [false, true]) {\n launchers.register({\n id: cron ? 'po.cron' : 'po.default',\n source: PACKAGE_SOURCE,\n label: cron ? 'Cron loop' : 'Default loop',\n description: cron\n ? 'Run a prompt on a five-field cron schedule.'\n : 'Run a prompt in this session on an interval.',\n inputSchema: { ...(cron ? CronLoopSchema : IntervalLoopSchema) },\n async launch(request) {\n const execution = host.context;\n const prepared = prepareLoop(request, cron);\n if (!prepared || request.signal.aborted) return undefined;\n let stopped = false;\n const tick = async (due = true): Promise<void> => {\n if (disposed || stopped || request.signal.aborted) return;\n if (due) pending.add(replay);\n if (submitting || !pending.has(replay)) return;\n submitting = true;\n try {\n const activity = await execution.session.activity();\n if (disposed || stopped || request.signal.aborted || !activity.isIdle || activity.hasPendingMessages)\n return;\n pending.delete(replay);\n if (!execution.session.admitPrompt) throw new Error('Loop prompt admission is unavailable.');\n await execution.session.admitPrompt(prepared.prompt);\n } catch (error) {\n await execution.client.notify({\n body: `Loop pass failed: ${error instanceof Error ? error.message : String(error)}`,\n level: 'warning',\n });\n } finally {\n submitting = false;\n }\n };\n const replay = (): Promise<void> => tick(false);\n let stopTimer: () => void;\n let detail: string;\n if ('cron' in prepared) {\n const job = new Cron(prepared.cron, { timezone: prepared.timezone, unref: true }, () => tick());\n if (job.nextRun() === null) {\n job.stop();\n throw new Error('Cron expression has no future run.');\n }\n stopTimer = () => {\n job.stop();\n };\n detail = `${prepared.cron} (${prepared.timezone})`;\n } else {\n const timer = setInterval(() => {\n void tick();\n }, prepared.intervalSeconds * 1000);\n timer.unref?.();\n stopTimer = () => clearInterval(timer);\n detail = `every ${prepared.intervalSeconds}s`;\n void tick();\n }\n return {\n instanceId: request.instanceId,\n label: cron ? 'Cron loop' : 'Default loop',\n detail,\n stop() {\n stopped = true;\n pending.delete(replay);\n stopTimer();\n },\n };\n },\n });\n }\n const loopTools = createLoopTools(\n () => launchers,\n () => {\n if (!modeSelected()) throw new Error('Enable Loop minor mode before using agent loop tools.');\n },\n ).map((tool) => ({\n ...tool,\n when: { state: { 'minor-mode': MODE_STATUS_ID }, attribution: { kind: 'minor' as const, mode: MODE_STATUS_ID } },\n }));\n return {\n loopTools,\n services: [\n (context) => {\n context.plugin((provider) => {\n provider.provide(PO_LOOP_LAUNCHERS_SERVICE, launchers);\n });\n context.effect(() => host.subscribeSelection(publish));\n },\n serverMinorModes([modeOwner]),\n ],\n resources: [\n {\n when: { state: { 'minor-mode': MODE_STATUS_ID }, attribution: { kind: 'minor', mode: MODE_STATUS_ID } },\n name: 'po-use-loop',\n kind: 'skill',\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-use-loop/SKILL.md'),\n },\n ],\n activities: [\n {\n name: 'po-loop',\n async start() {\n publish();\n return async () => {\n await launchers.stopAll('Session loop activity stopped.');\n publish();\n };\n },\n },\n ],\n commands: [\n {\n name: LIST_COMMAND_NAME,\n description: 'List or stop session loops. Usage: /loops [stop instanceId].',\n async execute(args: string, execution: PoHeadlessExecutionContext) {\n const parts = args.trim().split(/\\s+/u);\n if (parts[0] === 'stop' && parts.length === 2) {\n const stopped = await launchers.stop(parts[1]!, 'Stopped manually.');\n await execution.client.notify({\n body: stopped ? 'Loop stopped.' : 'Loop instance was not active.',\n level: 'info',\n });\n return;\n }\n if (args.trim()) throw new Error('Usage: /loops [stop instanceId]');\n const instances = launchers.listInstances();\n await execution.client.notify({\n body: instances.length === 0 ? 'No loops are active.' : JSON.stringify(instances, null, 2),\n level: 'info',\n });\n },\n },\n ],\n hooks: [\n {\n event: 'agent_settled',\n async handle() {\n if (!disposed) await pending.values().next().value?.();\n },\n },\n {\n event: 'session_start',\n async handle() {\n publish();\n },\n },\n {\n event: 'session_shutdown',\n async handle() {\n await launchers.stopAll('Headless session shutdown.');\n },\n },\n ],\n onStart: publish,\n async onDispose() {\n if (disposed) return;\n disposed = true;\n pending.clear();\n unsubscribe();\n await launchers.dispose('Headless loop facet disposed.');\n },\n };\n}\n","import type { PoServerPluginDefinition } from '@agimon-ai/po-core/serverFacet';\n\nimport { createSessionState, type LoopServerState } from '../../../../../services/serverRuntime';\n\nexport default (({ agent }): LoopServerState =>\n agent ? createSessionState(agent) : { loopTools: [] }) satisfies NonNullable<PoServerPluginDefinition['session']>;\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport runtime from './_lib/runtime.server';\n\nexport default defineRoot((context: PoServerPluginContext) => {\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/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) => context.root.commands?.[0],\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) =>\n context.root.hooks?.find((hook) => hook.event === 'agent_settled'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) =>\n context.root.hooks?.find((hook) => hook.event === 'session_shutdown'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) =>\n context.root.hooks?.find((hook) => hook.event === 'session_start'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) => context.root.resources?.[0],\n { cardinality: 'optional' },\n);\n","import { defineTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport type { LoopToolsRoot } from '../../../../../services/loopTools/type';\n\nexport default defineTool((context: WithRoot<unknown, LoopToolsRoot>) => context.root.loopTools[0]!);\n","import { defineTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport type { LoopToolsRoot } from '../../../../../services/loopTools/type';\n\nexport default defineTool((context: WithRoot<unknown, LoopToolsRoot>) => context.root.loopTools[1]!);\n","import { defineTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport type { LoopToolsRoot } from '../../../../../services/loopTools/type';\n\nexport default defineTool((context: WithRoot<unknown, LoopToolsRoot>) => context.root.loopTools[2]!);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport commandLoops from '../src/extensions/workspaces/sessions/(backend)/command/loops.server';\nimport hookAgentSettled from '../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.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 resourcePoUseLoop from '../src/extensions/workspaces/sessions/(backend)/resource/po-use-loop.server';\nimport toolLoopList from '../src/extensions/workspaces/sessions/(backend)/tool/loop-list.server';\nimport toolLoopStart from '../src/extensions/workspaces/sessions/(backend)/tool/loop-start.server';\nimport toolLoopStop from '../src/extensions/workspaces/sessions/(backend)/tool/loop-stop.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 =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/po-loop',\n providerOverrides: composeServerProviderOverrides(rootSession),\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(): PoServerSessionPlugin['commands'] { return defined([via({ name: 'loops' }, at(commandLoops, contextSession))]); },\n get hooks(): PoServerSessionPlugin['hooks'] { return defined([via({ event: 'agent_settled' }, at(hookAgentSettled, contextSession)), via({ event: 'session_shutdown' }, at(hookSessionShutdown, contextSession)), via({ event: 'session_start' }, at(hookSessionStart, contextSession))]); },\n get resources(): PoServerSessionPlugin['resources'] { return defined([at(resourcePoUseLoop, contextSession)]); },\n get tools(): PoServerSessionPlugin['tools'] { return [via({ name: 'loop_list' }, at(toolLoopList, contextSession)), via({ name: 'loop_start' }, at(toolLoopStart, contextSession)), via({ name: 'loop_stop' }, at(toolLoopStop, contextSession))]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.mjs","names":["runtime","defineTool","defineTool","defineTool","rootSession","commandLoops","hookAgentSettled","hookSessionShutdown","hookSessionStart","resourcePoUseLoop","toolLoopList","toolLoopStart","toolLoopStop"],"sources":["../../src/constants/loop.ts","../../src/constants/piLoop.ts","../../src/schemas/loopTools.ts","../../src/types/loopView.ts","../../src/services/loopLaunchers/index.ts","../../src/services/loopTools/index.ts","../../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/loops.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.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/po-use-loop.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/loop-list.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/loop-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/loop-stop.server.ts","../../generated/server.ts"],"sourcesContent":["export const START_COMMAND_DESCRIPTION = 'Start a registered loop';\nexport const LIST_COMMAND_DESCRIPTION = 'List and stop active loops';\nexport const START_COMMAND_NAME = 'loop';\nexport const LIST_COMMAND_NAME = 'loops';\n","export const PACKAGE_SOURCE = '@agimon-ai/po-loop';\nexport const LOOPS_GROUP_ORDER = 60;\nexport const STATUS_KEY = 'po-loop';\nexport const MODE_STATUS_ID = 'loop';\nexport const ACTIVE_MODE_COLOR = 'warning';\nexport const NOTIFY_INFO_LEVEL = 'info';\nexport const NOTIFY_WARNING_LEVEL = 'warning';\n","import { type Static, Type } from 'typebox';\nimport { Check } from 'typebox/value';\n\nexport const LoopListSchema = Type.Object({}, { additionalProperties: false });\nexport const LoopStartSchema = Type.Object(\n {\n launcherId: Type.String({ minLength: 1, maxLength: 256 }),\n instanceId: Type.Optional(Type.String({ minLength: 1, maxLength: 256 })),\n input: Type.Record(Type.String(), Type.Unknown()),\n },\n { additionalProperties: false },\n);\nexport const LoopStopSchema = Type.Object(\n {\n instanceId: Type.String({ minLength: 1, maxLength: 256 }),\n reason: Type.Optional(Type.String({ minLength: 1, maxLength: 512 })),\n },\n { additionalProperties: false },\n);\n\nexport const IntervalLoopSchema = Type.Object(\n {\n prompt: Type.String({ minLength: 1, maxLength: 32768 }),\n intervalSeconds: Type.Integer({ minimum: 30, maximum: 3600 }),\n },\n { additionalProperties: false },\n);\nexport const CronLoopSchema = Type.Object(\n {\n prompt: Type.String({ minLength: 1, maxLength: 32768 }),\n cron: Type.String({ minLength: 1, maxLength: 256 }),\n timezone: Type.Optional(Type.String({ minLength: 1, maxLength: 128 })),\n },\n { additionalProperties: false },\n);\nexport type IntervalLoopInput = Static<typeof IntervalLoopSchema>;\nexport type CronLoopInput = Static<typeof CronLoopSchema>;\n\nexport function parseIntervalLoop(input: unknown): IntervalLoopInput {\n if (!Check(IntervalLoopSchema, input) || !input.prompt.trim()) {\n throw new Error('Provide a non-empty prompt and an integer intervalSeconds between 30 and 3600.');\n }\n return { ...input, prompt: input.prompt.trim() };\n}\n\nexport function parseCronLoop(input: unknown): CronLoopInput {\n if (!Check(CronLoopSchema, input) || !input.prompt.trim() || input.cron.trim().split(/\\s+/u).length !== 5) {\n throw new Error('Provide a non-empty prompt and a five-field cron expression, with an optional IANA timezone.');\n }\n const timezone = input.timezone ?? 'UTC';\n new Intl.DateTimeFormat('en', { timeZone: timezone }).format();\n return { ...input, prompt: input.prompt.trim(), cron: input.cron.trim(), timezone };\n}\n","/** The browser-only status that carries active Loop instances into the activity dock. */\nexport const LOOP_VIEW_STATUS_KEY = 'po-loop-instances';\n\nexport type LoopStatusState = 'starting' | 'running' | 'stopping';\n\n/** The small, serializable Loop view the cockpit needs for one activity row. */\nexport interface LoopStatusItem {\n readonly instanceId: string;\n readonly label: string;\n readonly detail: string;\n readonly state: LoopStatusState;\n}\n\ninterface LoopStatusSource {\n readonly instanceId: string;\n readonly launcherLabel: string;\n readonly label?: string;\n readonly detail?: string;\n readonly state: LoopStatusState;\n}\n\nconst ANSI = new RegExp(String.raw`\\u001b\\[[0-9;]*m`, 'gu');\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isState(value: unknown): value is LoopStatusState {\n return value === 'starting' || value === 'running' || value === 'stopping';\n}\n\n/** Projects runtime snapshots into the JSON status consumed by the web plugin. */\nexport function formatLoopStatusView(instances: readonly LoopStatusSource[]): string {\n if (instances.length === 0) return '';\n return JSON.stringify(\n instances.map((instance) => ({\n instanceId: instance.instanceId,\n label: instance.label ?? instance.launcherLabel,\n detail: instance.detail ?? instance.instanceId,\n state: instance.state,\n })),\n );\n}\n\n/** Reads a Loop status without letting malformed session data crash the activity dock. */\nexport function parseLoopStatusView(raw: string | undefined): LoopStatusItem[] | undefined {\n if (raw === undefined) return undefined;\n const text = raw.replace(ANSI, '').trim();\n if (text === '') return undefined;\n\n try {\n const value: unknown = JSON.parse(text);\n if (!Array.isArray(value) || value.length === 0) return undefined;\n const items: LoopStatusItem[] = [];\n for (const item of value) {\n if (\n !isRecord(item) ||\n typeof item.instanceId !== 'string' ||\n item.instanceId.trim() === '' ||\n typeof item.label !== 'string' ||\n item.label.trim() === '' ||\n typeof item.detail !== 'string' ||\n !isState(item.state)\n ) {\n return undefined;\n }\n items.push({ instanceId: item.instanceId, label: item.label, detail: item.detail, state: item.state });\n }\n return items;\n } catch {\n return undefined;\n }\n}\n","import type {\n PoLoopLaunchersService,\n LoopInstanceSnapshot,\n LoopLauncherDefinition,\n LoopLauncherRegistration,\n StoppableLoop,\n} from '../../schemas/loopLaunchers';\n\nconst MAX_ID_LENGTH = 256;\nconst MAX_GENERATION_LENGTH = 256;\nconst LAUNCHER_ID_LABEL = 'loop launcher id';\nconst INSTANCE_ID_LABEL = 'loop instance id';\n\ninterface LauncherEntry {\n readonly token: symbol;\n readonly definition: LoopLauncherDefinition;\n}\n\ninterface InstanceEntry {\n readonly instanceId: string;\n readonly launcher: LauncherEntry;\n readonly abortController: AbortController;\n state: LoopInstanceSnapshot['state'];\n handle?: StoppableLoop;\n startedAt?: string;\n}\n\nexport interface LoopLaunchersDependencies {\n readonly generation: string;\n readonly createInstanceId: () => string;\n readonly timestamp: () => string;\n}\n\nfunction validId(value: string, label: string): string {\n if (typeof value !== 'string') throw new TypeError(`Invalid ${label}.`);\n const normalized = value.trim();\n let hasControl = false;\n for (const character of normalized) {\n const code = character.codePointAt(0);\n if (code !== undefined && (code <= 0x1f || code === 0x7f)) {\n hasControl = true;\n break;\n }\n }\n if (!normalized || normalized.length > MAX_ID_LENGTH || hasControl) throw new Error(`Invalid ${label}.`);\n return normalized;\n}\n\nfunction snapshot(entry: InstanceEntry): LoopInstanceSnapshot {\n return {\n instanceId: entry.instanceId,\n launcherId: entry.launcher.definition.id,\n launcherLabel: entry.launcher.definition.label,\n ...(entry.handle?.label ? { label: entry.handle.label } : {}),\n ...(entry.handle?.detail ? { detail: entry.handle.detail } : {}),\n state: entry.state,\n ...(entry.startedAt ? { startedAt: entry.startedAt } : {}),\n };\n}\n\n/** Creates the provider-owned launcher registry for one active Po session. */\nexport function createPoLoopLaunchersService({\n generation,\n createInstanceId,\n timestamp,\n}: LoopLaunchersDependencies): PoLoopLaunchersService {\n if (!generation || generation.length > MAX_GENERATION_LENGTH) {\n throw new TypeError('Po loop launchers require a valid generation.');\n }\n\n const launchers = new Map<string, LauncherEntry>();\n const instances = new Map<string, InstanceEntry>();\n const listeners = new Set<() => void>();\n let registrationSequence = 0;\n let disposed = false;\n\n const ensureActive = (): void => {\n if (disposed) throw new Error('The Po loop-launchers service is disposed.');\n };\n const notify = (): void => {\n for (const listener of listeners) listener();\n };\n const stopEntry = async (entry: InstanceEntry, reason?: string): Promise<void> => {\n if (instances.get(entry.instanceId) !== entry) return;\n entry.state = 'stopping';\n entry.abortController.abort(reason);\n notify();\n try {\n await entry.handle?.stop(reason);\n } finally {\n if (instances.get(entry.instanceId) === entry) instances.delete(entry.instanceId);\n notify();\n }\n };\n\n const service: PoLoopLaunchersService = {\n generation,\n register(definition): LoopLauncherRegistration {\n ensureActive();\n const id = validId(definition.id, LAUNCHER_ID_LABEL);\n if (launchers.has(id)) throw new Error(`Loop launcher '${id}' is already registered.`);\n const token = Symbol(id);\n const entry: LauncherEntry = { token, definition: { ...definition, id } };\n launchers.set(id, entry);\n registrationSequence += 1;\n notify();\n let registrationDisposed = false;\n return Object.freeze({\n id,\n generation: `${generation}:launcher:${registrationSequence}`,\n async dispose(reason = 'Loop launcher disposed.'): Promise<void> {\n if (registrationDisposed) return;\n registrationDisposed = true;\n if (launchers.get(id)?.token !== token) return;\n launchers.delete(id);\n const owned = [...instances.values()].filter((instance) => instance.launcher.token === token);\n await Promise.allSettled(owned.map((instance) => stopEntry(instance, reason)));\n notify();\n },\n });\n },\n listLaunchers() {\n ensureActive();\n return [...launchers.values()]\n .map(({ definition }) => ({\n id: definition.id,\n source: definition.source,\n label: definition.label,\n ...(definition.description ? { description: definition.description } : {}),\n ...(definition.inputSchema ? { inputSchema: definition.inputSchema } : {}),\n }))\n .sort((left, right) => left.label.localeCompare(right.label) || left.id.localeCompare(right.id));\n },\n listInstances() {\n ensureActive();\n return [...instances.values()]\n .map(snapshot)\n .sort((left, right) => left.instanceId.localeCompare(right.instanceId));\n },\n subscribe(listener) {\n ensureActive();\n listeners.add(listener);\n let subscribed = true;\n return () => {\n if (!subscribed) return;\n subscribed = false;\n listeners.delete(listener);\n };\n },\n async launch(launcherId, options) {\n ensureActive();\n options?.signal?.throwIfAborted();\n const normalizedLauncherId = validId(launcherId, LAUNCHER_ID_LABEL);\n const launcher = launchers.get(normalizedLauncherId);\n if (!launcher) throw new Error(`Loop launcher '${normalizedLauncherId}' is unavailable.`);\n const instanceId = validId(options?.instanceId ?? createInstanceId(), INSTANCE_ID_LABEL);\n if (instances.has(instanceId)) throw new Error(`Loop instance '${instanceId}' already exists.`);\n const entry: InstanceEntry = { instanceId, launcher, abortController: new AbortController(), state: 'starting' };\n const abortSetup = (): void => entry.abortController.abort(options?.signal?.reason);\n options?.signal?.addEventListener('abort', abortSetup, { once: true });\n instances.set(instanceId, entry);\n notify();\n try {\n if (options?.interactive === false && !launcher.definition.inputSchema) {\n throw new Error(`Loop launcher '${normalizedLauncherId}' requires manual setup in Activity.`);\n }\n const handle = await launcher.definition.launch({\n instanceId,\n signal: entry.abortController.signal,\n ...(options?.input === undefined ? {} : { input: options.input }),\n ...(options?.interactive === undefined ? {} : { interactive: options.interactive }),\n });\n const active = !disposed && instances.get(instanceId) === entry && !entry.abortController.signal.aborted;\n if (!handle) {\n if (instances.get(instanceId) === entry) instances.delete(instanceId);\n notify();\n return undefined;\n }\n if (!active || handle.instanceId !== instanceId) {\n await handle.stop(active ? 'Loop launcher returned a mismatched instance id.' : 'Loop launch was cancelled.');\n if (instances.get(instanceId) === entry) instances.delete(instanceId);\n notify();\n if (active) throw new Error(`Loop launcher '${normalizedLauncherId}' returned a mismatched instance id.`);\n return undefined;\n }\n entry.handle = handle;\n entry.state = 'running';\n entry.startedAt = timestamp();\n notify();\n return snapshot(entry);\n } catch (error) {\n const cancelled = entry.abortController.signal.aborted || disposed;\n if (instances.get(instanceId) === entry) instances.delete(instanceId);\n notify();\n if (cancelled) return undefined;\n throw error;\n } finally {\n options?.signal?.removeEventListener('abort', abortSetup);\n }\n },\n async stop(instanceId, reason) {\n ensureActive();\n const entry = instances.get(validId(instanceId, INSTANCE_ID_LABEL));\n if (!entry) return false;\n await stopEntry(entry, reason);\n return true;\n },\n async stopAll(reason) {\n if (disposed && instances.size === 0) return;\n await Promise.allSettled([...instances.values()].map((entry) => stopEntry(entry, reason)));\n },\n async dispose(reason = 'Po loop-launchers service disposed.') {\n if (disposed) return;\n disposed = true;\n launchers.clear();\n await Promise.allSettled([...instances.values()].map((entry) => stopEntry(entry, reason)));\n listeners.clear();\n },\n };\n\n return Object.freeze(service);\n}\n","import { defineTool, type PoPluginTool, type PoPluginToolResult } from '@agimon-ai/po-core/serverPlugin';\nimport { Check } from 'typebox/value';\n\nimport type { PoLoopLaunchersService } from '../../schemas/loopLaunchers';\nimport { LoopListSchema, LoopStartSchema, LoopStopSchema } from '../../schemas/loopTools';\n\nfunction result(details: unknown): PoPluginToolResult {\n return { content: [{ type: 'text', text: JSON.stringify(details, null, 2) }], details };\n}\n\nexport function createLoopTools(\n launchers: () => PoLoopLaunchersService,\n assertEnabled: () => void,\n): readonly PoPluginTool[] {\n return [\n defineTool({\n name: 'loop_list',\n label: 'List loops',\n description: 'List active session loops and available launcher types with their configuration schemas.',\n parameters: LoopListSchema,\n async execute(input, { signal }) {\n assertEnabled();\n signal?.throwIfAborted();\n if (!Check(LoopListSchema, input)) throw new Error('loop_list takes no arguments.');\n const service = launchers();\n return result({ launchers: service.listLaunchers(), instances: service.listInstances() });\n },\n }),\n defineTool({\n name: 'loop_start',\n label: 'Start loop',\n description:\n 'Start a session-scoped loop without operator dialogs. Read loop_list for launcher IDs and input schemas. Loops stop when the session shuts down.',\n parameters: LoopStartSchema,\n executionMode: 'serial',\n async execute(input, { signal }) {\n assertEnabled();\n signal?.throwIfAborted();\n if (!Check(LoopStartSchema, input)) throw new Error('Provide launcherId, input, and optionally instanceId.');\n return result(\n (await launchers().launch(input.launcherId, { ...input, interactive: false, signal })) ?? { cancelled: true },\n );\n },\n }),\n defineTool({\n name: 'loop_stop',\n label: 'Stop loop',\n description:\n 'Stop one loop instance owned by the current session. Does not disable Loop mode or stop other loops.',\n parameters: LoopStopSchema,\n executionMode: 'serial',\n async execute(input, { signal }) {\n assertEnabled();\n signal?.throwIfAborted();\n if (!Check(LoopStopSchema, input)) throw new Error('Provide instanceId and an optional reason.');\n return result({ stopped: await launchers().stop(input.instanceId, input.reason ?? 'Stopped by the agent.') });\n },\n }),\n ];\n}\n","import type { PoHeadlessExecutionContext, PoHeadlessHostService } from '@agimon-ai/po-core/headless';\nimport { readPackageResource, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\nimport { defineMinorMode, serverMinorModes } from '@agimon-ai/po-minor-mode';\nimport { Cron } from 'croner';\n\nimport { LIST_COMMAND_NAME } from '../../constants/loop';\nimport { MODE_STATUS_ID, PACKAGE_SOURCE } from '../../constants/piLoop';\nimport { PO_LOOP_LAUNCHERS_SERVICE, type LoopLaunchRequest } from '../../schemas/loopLaunchers';\nimport { CronLoopSchema, IntervalLoopSchema, parseCronLoop, parseIntervalLoop } from '../../schemas/loopTools';\nimport { formatLoopStatusView, LOOP_VIEW_STATUS_KEY } from '../../types/loopView';\nimport { createPoLoopLaunchersService } from '../loopLaunchers';\nimport { createLoopTools } from '../loopTools';\nimport type { LoopToolsRoot } from '../loopTools/type';\n\nexport type LoopServerState = PoServerSessionPlugin & LoopToolsRoot;\n\n/** Loops are set by the agent, so a launch always carries its configuration. */\nfunction prepareLoop(request: LoopLaunchRequest, cron: boolean) {\n if (request.input === undefined) throw new Error('Loop configuration is required. Ask the agent to set the loop.');\n return cron ? parseCronLoop(request.input) : parseIntervalLoop(request.input);\n}\n\nexport function createSessionState(host: PoHeadlessHostService): LoopServerState {\n const launchers = createPoLoopLaunchersService({\n generation: `${host.context.sessionId}:loop-launchers`,\n createInstanceId: () => crypto.randomUUID(),\n timestamp: () => new Date().toISOString(),\n });\n let disposed = false;\n const modeSelected = (): boolean =>\n !disposed && (host.context.selection.state?.['minor-mode'] ?? []).includes(MODE_STATUS_ID);\n const publishView = (): void =>\n host.context.client.setStatus(LOOP_VIEW_STATUS_KEY, formatLoopStatusView(launchers.listInstances()));\n const modeOwner = defineMinorMode({\n descriptor: {\n source: PACKAGE_SOURCE,\n id: MODE_STATUS_ID,\n label: 'Loop',\n description: 'Give the agent tools to create, inspect, and stop session loops.',\n order: 60,\n actions: [\n {\n id: 'activate',\n label: 'Activate',\n description: 'Expose loop tools to the agent.',\n contexts: ['headless'],\n parameters: [],\n },\n {\n id: 'deactivate',\n label: 'Deactivate',\n description: 'Hide agent loop tools. Existing loops and manual controls remain available.',\n contexts: ['headless'],\n parameters: [],\n },\n ],\n },\n state: () => ({\n activation: modeSelected() ? 'active' : 'inactive',\n condition: 'ready',\n ...(modeSelected() ? { detail: `${launchers.listInstances().length} loops`, color: 'accent' } : {}),\n actions: [\n {\n id: 'activate',\n enabled: !modeSelected(),\n ...(modeSelected() ? { disabledReason: 'Loop mode is already active.' } : {}),\n },\n {\n id: 'deactivate',\n enabled: modeSelected(),\n ...(modeSelected() ? {} : { disabledReason: 'Loop mode is not active.' }),\n },\n ],\n }),\n async handleAction(_runtime, actionId, _arguments, { signal }) {\n signal.throwIfAborted();\n if (actionId !== 'activate' && actionId !== 'deactivate')\n throw new Error(`Unknown loop mode action: ${actionId}`);\n const modes = (host.context.selection.state?.['minor-mode'] ?? []).filter((mode) => mode !== MODE_STATUS_ID);\n await host.changeSelection({\n axis: 'state',\n key: 'minor-mode',\n values: actionId === 'activate' ? [...modes, MODE_STATUS_ID] : modes,\n });\n modeOwner.publish();\n return {\n message:\n actionId === 'activate' ? 'Loop tools activated.' : 'Loop tools deactivated. Existing loops are unchanged.',\n };\n },\n }).createOwner(undefined);\n const publish = (): void => {\n if (disposed) return;\n modeOwner.publish();\n publishView();\n };\n const unsubscribe = launchers.subscribe(publish);\n let submitting = false;\n const pending = new Set<() => Promise<void>>();\n for (const cron of [false, true]) {\n launchers.register({\n id: cron ? 'po.cron' : 'po.default',\n source: PACKAGE_SOURCE,\n label: cron ? 'Cron loop' : 'Default loop',\n description: cron\n ? 'Run a prompt on a five-field cron schedule.'\n : 'Run a prompt in this session on an interval.',\n inputSchema: { ...(cron ? CronLoopSchema : IntervalLoopSchema) },\n async launch(request) {\n const execution = host.context;\n const prepared = prepareLoop(request, cron);\n if (!prepared || request.signal.aborted) return undefined;\n let stopped = false;\n const tick = async (due = true): Promise<void> => {\n if (disposed || stopped || request.signal.aborted) return;\n if (due) pending.add(replay);\n if (submitting || !pending.has(replay)) return;\n submitting = true;\n try {\n const activity = await execution.session.activity();\n if (disposed || stopped || request.signal.aborted || !activity.isIdle || activity.hasPendingMessages)\n return;\n pending.delete(replay);\n if (!execution.session.admitPrompt) throw new Error('Loop prompt admission is unavailable.');\n await execution.session.admitPrompt(prepared.prompt);\n } catch (error) {\n await execution.client.notify({\n body: `Loop pass failed: ${error instanceof Error ? error.message : String(error)}`,\n level: 'warning',\n });\n } finally {\n submitting = false;\n }\n };\n const replay = (): Promise<void> => tick(false);\n let stopTimer: () => void;\n let detail: string;\n if ('cron' in prepared) {\n const job = new Cron(prepared.cron, { timezone: prepared.timezone, unref: true }, () => tick());\n if (job.nextRun() === null) {\n job.stop();\n throw new Error('Cron expression has no future run.');\n }\n stopTimer = () => {\n job.stop();\n };\n detail = `${prepared.cron} (${prepared.timezone})`;\n } else {\n const timer = setInterval(() => {\n void tick();\n }, prepared.intervalSeconds * 1000);\n timer.unref?.();\n stopTimer = () => clearInterval(timer);\n detail = `every ${prepared.intervalSeconds}s`;\n void tick();\n }\n return {\n instanceId: request.instanceId,\n label: cron ? 'Cron loop' : 'Default loop',\n detail,\n stop() {\n stopped = true;\n pending.delete(replay);\n stopTimer();\n },\n };\n },\n });\n }\n const loopTools = createLoopTools(\n () => launchers,\n () => {\n if (!modeSelected()) throw new Error('Enable Loop minor mode before using agent loop tools.');\n },\n ).map((tool) => ({\n ...tool,\n when: { state: { 'minor-mode': MODE_STATUS_ID }, attribution: { kind: 'minor' as const, mode: MODE_STATUS_ID } },\n }));\n return {\n loopTools,\n services: [\n (context) => {\n context.plugin((provider) => {\n provider.provide(PO_LOOP_LAUNCHERS_SERVICE, launchers);\n });\n context.effect(() => host.subscribeSelection(publish));\n },\n serverMinorModes([modeOwner]),\n ],\n resources: [\n {\n when: { state: { 'minor-mode': MODE_STATUS_ID }, attribution: { kind: 'minor', mode: MODE_STATUS_ID } },\n name: 'po-use-loop',\n kind: 'skill',\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-use-loop/SKILL.md'),\n },\n ],\n activities: [\n {\n name: 'po-loop',\n async start() {\n publish();\n return async () => {\n await launchers.stopAll('Session loop activity stopped.');\n publish();\n };\n },\n },\n ],\n commands: [\n {\n name: LIST_COMMAND_NAME,\n description: 'List or stop session loops. Usage: /loops [stop instanceId].',\n async execute(args: string, execution: PoHeadlessExecutionContext) {\n const parts = args.trim().split(/\\s+/u);\n if (parts[0] === 'stop' && parts.length === 2) {\n const stopped = await launchers.stop(parts[1]!, 'Stopped manually.');\n await execution.client.notify({\n body: stopped ? 'Loop stopped.' : 'Loop instance was not active.',\n level: 'info',\n });\n return;\n }\n if (args.trim()) throw new Error('Usage: /loops [stop instanceId]');\n const instances = launchers.listInstances();\n await execution.client.notify({\n body: instances.length === 0 ? 'No loops are active.' : JSON.stringify(instances, null, 2),\n level: 'info',\n });\n },\n },\n ],\n hooks: [\n {\n event: 'agent_settled',\n async handle() {\n if (!disposed) await pending.values().next().value?.();\n },\n },\n {\n event: 'session_start',\n async handle() {\n publish();\n },\n },\n {\n event: 'session_shutdown',\n async handle() {\n await launchers.stopAll('Headless session shutdown.');\n },\n },\n ],\n onStart: publish,\n async onDispose() {\n if (disposed) return;\n disposed = true;\n pending.clear();\n unsubscribe();\n await launchers.dispose('Loop server plugin disposed.');\n },\n };\n}\n","import type { PoServerPluginDefinition } from '@agimon-ai/po-core/serverPlugin';\n\nimport { createSessionState, type LoopServerState } from '../../../../../services/serverRuntime';\n\nexport default (({ agent }): LoopServerState =>\n agent ? createSessionState(agent) : { loopTools: [] }) satisfies NonNullable<PoServerPluginDefinition['session']>;\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport runtime from './_lib/runtime.server';\n\nexport default defineRoot((context: PoServerPluginContext) => {\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/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) => context.root.commands?.[0],\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) =>\n context.root.hooks?.find((hook) => hook.event === 'agent_settled'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) =>\n context.root.hooks?.find((hook) => hook.event === 'session_shutdown'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) =>\n context.root.hooks?.find((hook) => hook.event === 'session_start'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext, PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, Partial<PoServerSessionPlugin>>) => context.root.resources?.[0],\n { cardinality: 'optional' },\n);\n","import { defineTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport type { LoopToolsRoot } from '../../../../../services/loopTools/type';\n\nexport default defineTool((context: WithRoot<unknown, LoopToolsRoot>) => context.root.loopTools[0]!);\n","import { defineTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport type { LoopToolsRoot } from '../../../../../services/loopTools/type';\n\nexport default defineTool((context: WithRoot<unknown, LoopToolsRoot>) => context.root.loopTools[1]!);\n","import { defineTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport type { LoopToolsRoot } from '../../../../../services/loopTools/type';\n\nexport default defineTool((context: WithRoot<unknown, LoopToolsRoot>) => context.root.loopTools[2]!);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverPlugin';\nimport { composeRootHooks, composeRootInjects } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport commandLoops from '../src/extensions/workspaces/sessions/(backend)/command/loops.server';\nimport hookAgentSettled from '../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.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 resourcePoUseLoop from '../src/extensions/workspaces/sessions/(backend)/resource/po-use-loop.server';\nimport toolLoopList from '../src/extensions/workspaces/sessions/(backend)/tool/loop-list.server';\nimport toolLoopStart from '../src/extensions/workspaces/sessions/(backend)/tool/loop-start.server';\nimport toolLoopStop from '../src/extensions/workspaces/sessions/(backend)/tool/loop-stop.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 =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const serverPlugin = defineServerPlugin({\n name: '@agimon-ai/po-loop',\n providerOverrides: composeServerProviderOverrides(rootSession),\n injects: composeRootInjects({ session: [rootSession] }),\n session: async (context) => {\n const scopeSession = await context.scopeRoot('session', rootSession, context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): PoServerSessionPlugin['commands'] { return defined([via({ name: 'loops' }, at(commandLoops, contextSession))]); },\n get hooks(): PoServerSessionPlugin['hooks'] { return defined([via({ event: 'agent_settled' }, at(hookAgentSettled, contextSession)), via({ event: 'session_shutdown' }, at(hookSessionShutdown, contextSession)), via({ event: 'session_start' }, at(hookSessionStart, contextSession))]); },\n get resources(): PoServerSessionPlugin['resources'] { return defined([at(resourcePoUseLoop, contextSession)]); },\n get tools(): PoServerSessionPlugin['tools'] { return [via({ name: 'loop_list' }, at(toolLoopList, contextSession)), via({ name: 'loop_start' }, at(toolLoopStart, contextSession)), via({ name: 'loop_stop' }, at(toolLoopStop, contextSession))]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default serverPlugin;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agimon-ai/po-loop",
|
|
3
|
-
"version": "0.0.0-alpha.
|
|
3
|
+
"version": "0.0.0-alpha.14",
|
|
4
4
|
"description": "Session-scoped recurring prompt scheduler and loop controls for Pi coding agents.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -67,17 +67,17 @@
|
|
|
67
67
|
"access": "public"
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
|
-
"@agimon-ai/po-core": "0.0.0-alpha.
|
|
71
|
-
"@agimon-ai/po-minor-mode": "0.0.0-alpha.
|
|
72
|
-
"@agimon-ai/po-ui": "0.0.0-alpha.
|
|
73
|
-
"@agimon-ai/po-web-components": "0.0.0-alpha.
|
|
74
|
-
"@deepseek-ai/cordis": "4.0.
|
|
70
|
+
"@agimon-ai/po-core": "0.0.0-alpha.14",
|
|
71
|
+
"@agimon-ai/po-minor-mode": "0.0.0-alpha.14",
|
|
72
|
+
"@agimon-ai/po-ui": "0.0.0-alpha.14",
|
|
73
|
+
"@agimon-ai/po-web-components": "0.0.0-alpha.14",
|
|
74
|
+
"@deepseek-ai/cordis": "4.0.5",
|
|
75
75
|
"croner": "10.0.1",
|
|
76
76
|
"typebox": "1.3.37"
|
|
77
77
|
},
|
|
78
78
|
"devDependencies": {
|
|
79
|
-
"@agimon-ai/po-build": "0.0.0-alpha.
|
|
80
|
-
"@agimon-ai/po-native-components": "0.0.0-alpha.
|
|
79
|
+
"@agimon-ai/po-build": "0.0.0-alpha.14",
|
|
80
|
+
"@agimon-ai/po-native-components": "0.0.0-alpha.14",
|
|
81
81
|
"@earendil-works/pi-coding-agent": "1.3.0",
|
|
82
82
|
"@types/node": "26.6.5",
|
|
83
83
|
"@types/react": "19.3.0",
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
"vitest": "5.0.4"
|
|
93
93
|
},
|
|
94
94
|
"peerDependencies": {
|
|
95
|
-
"@agimon-ai/po-native-components": "0.0.0-alpha.
|
|
95
|
+
"@agimon-ai/po-native-components": "0.0.0-alpha.14",
|
|
96
96
|
"@earendil-works/pi-coding-agent": "1.3.0",
|
|
97
97
|
"react-native": "0.86.3",
|
|
98
98
|
"react-native-unistyles": "^3.5.3"
|