@agimon-ai/po-task 0.0.0-alpha.35 → 0.0.0-alpha.37
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.
|
@@ -769,7 +769,7 @@ var tasks_server_default = (0, _agimon_ai_po_core_extensionFile.defineServerComm
|
|
|
769
769
|
//#region src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-task.server.ts
|
|
770
770
|
var codemode_how_to_task_server_default = (0, _agimon_ai_po_core_extensionFile.defineResource)({
|
|
771
771
|
name: "codemode-how-to-task",
|
|
772
|
-
description: "
|
|
772
|
+
description: "Keep a plan that survives compaction and delegate parts of it to background subagents. Use for any multi-step plan, todo list, or delegation.",
|
|
773
773
|
kind: "skill",
|
|
774
774
|
pinned: true,
|
|
775
775
|
path: (0, _agimon_ai_po_core_serverPlugin.packageResourcePath)(require("url").pathToFileURL(__filename).href, "src/prompts/codemode-how-to-task/SKILL.md"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.cjs","names":["path","randomUUID","applyTaskMutation","isCommittingOp","buildToolResult","Check","TaskParamsSchema","formatAssignmentResults","buildAssignmentResult","buildTextResult","defineRoot","createTaskErrorReporter","toFailureReporter","createPoReadinessCoordinator","BACKGROUND_WORK_PROVIDER","getMaxTasks","TaskStore","resolveSessionKey","DelegationManager","getDelegationTimeoutMs","PO_CODEMODE_SERVICE","readPoCodemode","PO_CONTEXT_CONTRIBUTIONS_SERVICE","requirePoContextContributions","PO_BACKGROUND_WORK_SERVICE","readPoBackgroundWorkService","PO_DELEGATION_SERVICE","readPoDelegationService","readPoReadinessCoordinator","TASK_EVENT","removeLegacyStoreDirectoryAsync","hasStorePathOverride","sweepStoreFilesAsync","getStoreTtlMs","runCleanups","defineRoot","contribution","TaskStore","resolveStorePath","resolveSessionKey","createHash","HOME_ENTITY_LIMIT","isBlocked","defineChannel","contribution","COMMAND_NAME","defineServerCommand","contribution","defineResource","packageResourcePath","readPackageResource","defineResource","contribution","defineServerTool","defineServerTool","contribution","defineServerPlugin","composeServerProviderOverrides","rootSession","composeRootInjects","channelTaskGraph","composeRootHooks","commandTasks","resourceCodemodeHowToTask","resourceTaskBoard","toolTask"],"sources":["../../src/services/contextContribution/index.ts","../../src/services/delegationPlatform/index.ts","../../src/services/taskTool/index.ts","../../src/services/taskNamespace/index.ts","../../src/types/webTasks.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/(backend)/channel/_lib/task-graph.ts","../../src/extensions/(backend)/channel/task-graph.server.ts","../../src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.server.ts","../../src/extensions/workspaces/sessions/(backend)/command/tasks.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-task.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/_lib/task-board.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/task-board.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/_lib/task.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/task.server.ts","../../generated/server.ts"],"sourcesContent":["import type { PoContextContribution } from '@agimon-ai/po-core/contextContributions';\n\nimport type { Task } from '../../models/task';\n\nexport const TASK_CONTEXT_CONTRIBUTION_SOURCE = '@agimon-ai/po-task';\nexport const TASK_CONTEXT_CONTRIBUTION_ID = 'active-tasks';\nexport const TASK_CONTEXT_CONTRIBUTION_LABEL = 'Active tasks';\nexport const TASK_CONTEXT_CONTRIBUTION_ORDER = 100;\n\ninterface TaskContextSnapshot {\n readonly id: number;\n readonly status: Task['status'];\n readonly subject: string;\n readonly activeForm?: string;\n readonly owner?: string;\n readonly blockedBy?: readonly number[];\n readonly delegation?: {\n readonly agent: string;\n readonly state: NonNullable<Task['delegation']>['state'];\n readonly error?: string;\n };\n}\n\nexport function activeTaskSnapshots(tasks: readonly Task[]): TaskContextSnapshot[] {\n return tasks\n .filter((task) => task.status === 'pending' || task.status === 'in_progress' || task.status === 'failed')\n .map((task) => ({\n id: task.id,\n status: task.status,\n subject: task.subject,\n ...(task.activeForm ? { activeForm: task.activeForm } : {}),\n ...(task.owner ? { owner: task.owner } : {}),\n ...(task.blockedBy?.length ? { blockedBy: task.blockedBy } : {}),\n ...(task.delegation\n ? {\n delegation: {\n agent: task.delegation.agent,\n state: task.delegation.state,\n ...(task.delegation.result?.error ? { error: task.delegation.result.error } : {}),\n },\n }\n : {}),\n }));\n}\n\nexport function formatTaskSnapshots(tasks: readonly TaskContextSnapshot[]): string {\n if (tasks.length === 0) return '(no active tasks)';\n return tasks\n .map((task) => {\n const details = [\n task.activeForm ? `active: ${task.activeForm}` : undefined,\n task.owner ? `owner: ${task.owner}` : undefined,\n task.blockedBy?.length ? `blocked by: ${task.blockedBy.join(', ')}` : undefined,\n task.delegation ? `delegation: ${task.delegation.agent} (${task.delegation.state})` : undefined,\n task.delegation?.error ? `error: ${task.delegation.error}` : undefined,\n ].filter((value): value is string => Boolean(value));\n return `- #${task.id} [${task.status}] ${task.subject}${details.length > 0 ? ` | ${details.join(' | ')}` : ''}`;\n })\n .join('\\n');\n}\n\n/** Builds Task's bounded, synchronous contribution from its in-memory store snapshot. */\nexport function createTaskContextContribution(readTasks: () => readonly Task[]): PoContextContribution {\n return Object.freeze({\n source: TASK_CONTEXT_CONTRIBUTION_SOURCE,\n id: TASK_CONTEXT_CONTRIBUTION_ID,\n label: TASK_CONTEXT_CONTRIBUTION_LABEL,\n order: TASK_CONTEXT_CONTRIBUTION_ORDER,\n snapshot: () => formatTaskSnapshots(activeTaskSnapshots(readTasks())),\n });\n}\n","import { randomUUID } from 'node:crypto';\nimport path from 'node:path';\n\nimport type { DelegationPlatform } from '../delegation';\n\nfunction formatBriefPath(entry: string, cwd: string): string {\n if (!path.isAbsolute(entry)) return path.normalize(entry);\n const relative = path.relative(cwd, entry);\n // Outside the run directory the original beats a `../../` chain.\n return relative && !relative.startsWith('..') ? relative : entry;\n}\n\n/** Supply Node-owned process and path facilities to the host-neutral manager. */\nexport function createNodeDelegationPlatform(\n environment: Readonly<Record<string, string | undefined>> = process.env,\n): DelegationPlatform {\n return {\n environment,\n processId: process.pid,\n createRequestId: randomUUID,\n formatBriefPath,\n };\n}\n","import type { PoHeadlessTool, PoHeadlessToolResult } from '@agimon-ai/po-core/headless';\nimport { Check } from 'typebox/value';\n\nimport type { TaskMutationParams } from '../../models/task';\nimport { TaskParamsSchema, type TaskParams, type TaskAssignmentParams } from '../../schemas/task';\nimport type { DelegationManager } from '../delegation';\nimport { applyTaskMutation, isCommittingOp, type ReducerAction } from '../reducer';\nimport { buildAssignmentResult, buildTextResult, buildToolResult, formatAssignmentResults } from '../taskResult';\nimport type { TaskStore } from '../taskStore';\n\nfunction output(value: unknown): PoHeadlessToolResult {\n if (typeof value === 'object' && value !== null && 'content' in value) return value as PoHeadlessToolResult;\n const text = typeof value === 'string' ? value : JSON.stringify(value, null, 2);\n return { content: [{ type: 'text', text }], details: value };\n}\n\nfunction failure(error: unknown): PoHeadlessToolResult {\n return { content: [{ type: 'text', text: error instanceof Error ? error.message : String(error) }], isError: true };\n}\n\nexport async function reducerAction(\n store: TaskStore,\n action: ReducerAction,\n params: TaskMutationParams,\n maxTasks: number,\n): Promise<PoHeadlessToolResult> {\n const { document, value } = await store.mutate((current) => {\n const result = applyTaskMutation(current, action, params, undefined, maxTasks);\n return { ...(isCommittingOp(result.op) ? { document: result.document } : {}), value: result };\n });\n if (value.op.kind === 'error') throw new Error(value.op.message);\n return buildToolResult(action, params, document, value.op);\n}\n\ninterface AssignmentItemResult {\n index: number;\n id: number;\n agent: string;\n ok: boolean;\n message: string;\n}\n\nasync function assignmentBatch(\n manager: DelegationManager,\n assignments: readonly TaskAssignmentParams[],\n signal?: AbortSignal,\n): Promise<AssignmentItemResult[]> {\n const result: AssignmentItemResult[] = [];\n for (const [index, assignment] of assignments.entries()) {\n try {\n const outcome = await manager.assign(assignment.id, {\n agent: assignment.agent,\n inlineAgent: assignment.inlineAgent,\n instructions: assignment.instructions,\n relevantFiles: assignment.relevantFiles,\n priorFindings: assignment.priorFindings,\n model: assignment.model,\n ...(assignment.context === 'fork' || assignment.context === 'fresh' ? { context: assignment.context } : {}),\n signal,\n });\n result.push({ index, id: assignment.id, agent: assignment.agent, ...outcome });\n } catch (error) {\n result.push({ index, id: assignment.id, agent: assignment.agent, ok: false, message: String(error) });\n }\n }\n return result;\n}\n\n/** One task action against the session store, shared by the `task` tool and the `tasks` code-mode namespace. */\nexport async function runTaskAction(\n store: TaskStore,\n manager: DelegationManager | undefined,\n maxTasks: number,\n rawParams: unknown,\n signal?: AbortSignal,\n onUpdate?: (result: PoHeadlessToolResult) => void,\n): Promise<PoHeadlessToolResult> {\n if (!Check(TaskParamsSchema, rawParams)) return failure('Invalid task parameters.');\n const params = rawParams as TaskParams;\n try {\n if ((params.action === 'assign' || params.action === 'cancel') && !manager)\n throw new Error('Delegation is not available on this connection.');\n if (params.action === 'assign') {\n if (!params.assignments?.length) throw new Error('assign requires a non-empty assignments[] array');\n onUpdate?.(\n output(`Delegating ${params.assignments.length} task${params.assignments.length === 1 ? '' : 's'}...`),\n );\n const items = await assignmentBatch(manager!, params.assignments, signal);\n const assigned = items.filter((item) => item.ok).map((item) => item.id);\n const text = formatAssignmentResults(items);\n if (assigned.length === 0) throw new Error(text);\n return buildAssignmentResult(params as TaskMutationParams, store.snapshot, text, {\n assigned,\n failed: items.length - assigned.length,\n });\n }\n if (params.action === 'cancel') {\n const outcome = await manager!.cancel(params.id ?? Number.NaN);\n if (!outcome.ok) throw new Error(outcome.message);\n return buildTextResult('cancel', params as TaskMutationParams, store.snapshot, outcome.message);\n }\n return reducerAction(store, params.action as ReducerAction, params as TaskMutationParams, maxTasks);\n } catch (error) {\n return failure(error);\n }\n}\n\nexport function createHeadlessTaskTool(\n store: TaskStore,\n /** Absent on remote MCP connections, which track tasks but never delegate. */\n manager: DelegationManager | undefined,\n maxTasks: number,\n): PoHeadlessTool<typeof TaskParamsSchema> {\n return {\n name: 'task',\n label: 'Task',\n description: 'Maintain a persistent task graph and delegate ready tasks to background agents.',\n parameters: TaskParamsSchema,\n promptSnippet: 'Track complex work persistently and delegate ready tasks',\n executionMode: 'serial',\n execute: (_toolCallId, rawParams, signal, onUpdate) =>\n runTaskAction(store, manager, maxTasks, rawParams, signal, onUpdate),\n };\n}\n","import type { PoCodemodeNamespace } from '@agimon-ai/po-core/codemode';\n\nimport type { TaskDocument } from '../../models/task';\nimport { runTaskAction } from '../taskTool';\nimport type { TaskNamespaceOptions } from './type';\n\nconst DECLARATIONS = `type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';\n\ntype DelegationState = 'requested' | 'running' | 'completed' | 'failed' | 'cancelled';\n\ninterface DelegationResult {\n status: string;\n output?: string;\n outputPath?: string;\n sessionFile?: string;\n error?: string;\n durationMs?: number;\n toolCount?: number;\n}\n\ninterface TaskDelegation {\n requestId: string;\n agent: string;\n identity?: string;\n state: DelegationState;\n sessionId?: string;\n pid?: number;\n runId?: string;\n model?: string;\n startedAt?: string;\n endedAt?: string;\n result?: DelegationResult;\n}\n\ninterface Task {\n id: number;\n subject: string;\n description?: string;\n activeForm?: string;\n status: TaskStatus;\n blockedBy?: number[];\n owner?: string;\n metadata?: Record<string, unknown>;\n createdAt?: string;\n updatedAt?: string;\n delegation?: TaskDelegation;\n}\n\ninterface TaskDocument {\n version: number;\n rev: number;\n nextId: number;\n tasks: Task[];\n}\ninterface TaskItem {\n /** Existing task id to change. Omit to create; an unknown id fails only that entry. */\n id?: number;\n /** Temporary name so a LATER entry in the same call can list it in blockedBy. Never stored. */\n ref?: string;\n /** Short and imperative. Required when creating. */\n subject?: string;\n /** The durable brief handed to a subagent on assign. */\n description?: string;\n /** Present-continuous label shown while in_progress, such as 'writing tests'. */\n activeForm?: string;\n status?: TaskStatus;\n /** For a NEW entry: task ids or earlier refs. */\n blockedBy?: (number | string)[];\n /** For an entry with an id: dependencies to add or remove. */\n addBlockedBy?: (number | string)[];\n removeBlockedBy?: (number | string)[];\n owner?: string;\n /** Merged into the task; a null value deletes that key. */\n metadata?: Record<string, unknown>;\n}\n\ninterface TaskAssignment {\n /** A pending, unblocked task. */\n id: number;\n /** Exact name from subagent({ action: 'agents' }). */\n agent: string;\n instructions?: string;\n /** Only files you actually read or located. */\n relevantFiles?: string[];\n /** Only verified facts, not directives. */\n priorFindings?: string;\n model?: string;\n context?: 'fresh' | 'fork';\n}\n\n/** What a write returns: the text the task tool would print, and the graph after the write. */\ninterface TaskWrite {\n message: string;\n document: TaskDocument;\n /** upsert only: ids that landed and how many entries failed. Nothing landing throws; a partial failure does not. */\n applied?: number[];\n failed?: number;\n}\ndeclare const tasks: {\n /** The whole task graph, tombstones included. Filter it in the script. */\n snapshot(): Promise<TaskDocument>;\n /**\n * Create or change tasks, applied in array order. Never mark a task completed while tests fail or the\n * work is partial: use failed, or keep it in_progress and add a task for the blocker in the same call.\n * Status flow is pending, in_progress, completed. failed is recoverable and deleted is a tombstone.\n */\n upsert(tasks: TaskItem[]): Promise<TaskWrite>;\n /** Tombstone one task. Refused while it has a running delegation. */\n delete(id: number): Promise<TaskWrite>;\n /** Remove every task. Refused while a delegation is running. */\n clear(): Promise<TaskWrite>;\n /** Hand ready tasks to background subagents. Batch independent tasks in one call. */\n assign(assignments: TaskAssignment[]): Promise<TaskWrite>;\n /** Cancel a task's running delegation. */\n cancel(id: number): Promise<TaskWrite>;\n};`;\n\n/** The owning session's task graph: `snapshot` reads without locking, the rest write through the same store as the `task` tool. */\nexport function createTaskNamespace(options: TaskNamespaceOptions): PoCodemodeNamespace {\n return {\n name: 'tasks',\n summary:\n 'The session task graph: tasks.snapshot() reads it, tasks.upsert/delete/clear change it, tasks.assign/cancel hand tasks to background subagents. Use it to track multi-step work.',\n declarations: DECLARATIONS,\n bind(run) {\n if (run.sessionId !== options.sessionId) throw new Error('Tasks namespace belongs to another session.');\n let disposed = false;\n run.onDispose(() => {\n disposed = true;\n });\n const assertAvailable = (): void => {\n run.signal.throwIfAborted();\n if (disposed) throw new Error('Tasks namespace run is disposed.');\n options.assertAvailable();\n };\n const members: Record<string, unknown> = Object.create(null);\n members.snapshot = async (): Promise<TaskDocument> => {\n assertAvailable();\n const storePath = options.store.storePath;\n const errors: unknown[] = [];\n const document = await options.store.readAsync(\n () => false,\n (error) => errors.push(error),\n );\n assertAvailable();\n if (options.store.storePath !== storePath) throw new Error('Task store path changed during snapshot.');\n if (errors.length > 0) throw new Error('Task snapshot read failed.', { cause: errors[0] });\n return JSON.parse(JSON.stringify(document)) as TaskDocument;\n };\n const write = async (params: Record<string, unknown>) => {\n assertAvailable();\n const started = Date.now();\n const result = await runTaskAction(options.store, options.manager, options.maxTasks, params, run.signal);\n assertAvailable();\n const message = result.content.flatMap((part) => (part.type === 'text' ? [part.text] : [])).join('\\n');\n const upsert = (result.details as { upsert?: { applied: number[]; failed: number } } | undefined)?.upsert;\n const failure =\n result.isError || (upsert && upsert.applied.length === 0 && upsert.failed > 0) ? message : undefined;\n // The `task` tool's card draws the call, from the same args and result the tool would have had.\n run.record?.({\n name: `tasks.${String(params.action)}`,\n tool: 'task',\n args: params,\n ok: failure === undefined,\n ms: Date.now() - started,\n ...(failure === undefined ? {} : { error: failure }),\n result: { content: result.content, details: result.details },\n });\n if (failure !== undefined) throw new Error(failure);\n return {\n message,\n document: JSON.parse(JSON.stringify(options.store.snapshot)) as TaskDocument,\n ...(upsert ? { applied: upsert.applied, failed: upsert.failed } : {}),\n };\n };\n members.upsert = (tasks: unknown) => write({ action: 'upsert', tasks });\n members.delete = (id: unknown) => write({ action: 'delete', id });\n members.clear = () => write({ action: 'clear' });\n members.assign = (assignments: unknown) => write({ action: 'assign', assignments });\n members.cancel = (id: unknown) => write({ action: 'cancel', id });\n return members;\n },\n };\n}\n","/** Browser-safe task view published by the cockpit hub channel. */\nexport const TASKS_CHANNEL_TYPE = 'task_graph';\n\nexport type WebTaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';\n\nexport interface WebTask {\n id: number;\n subject: string;\n description?: string;\n activeForm?: string;\n status: WebTaskStatus;\n blockedBy: number[];\n owner?: string;\n updatedAt?: string;\n delegation?: {\n agent?: string;\n identity?: string;\n state?: string;\n };\n}\n\nexport interface WebTasksPayload {\n tasks: WebTask[];\n rev: number;\n}\n","import {\n PO_BACKGROUND_WORK_SERVICE,\n readPoBackgroundWorkService,\n type BackgroundWorkProviderHandle,\n type PoBackgroundWorkService,\n} from '@agimon-ai/po-core/backgroundWork';\nimport { PO_CODEMODE_SERVICE, readPoCodemode } from '@agimon-ai/po-core/codemode';\nimport {\n PO_CONTEXT_CONTRIBUTIONS_SERVICE,\n requirePoContextContributions,\n} from '@agimon-ai/po-core/contextContributions';\nimport { PO_DELEGATION_SERVICE, readPoDelegationService } from '@agimon-ai/po-core/delegation';\nimport { defineRoot, runCleanups } from '@agimon-ai/po-core/extensionFile';\nimport { createPoReadinessCoordinator, readPoReadinessCoordinator } from '@agimon-ai/po-core/readiness';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { getDelegationTimeoutMs, getMaxTasks, getStoreTtlMs } from '../../../../../services/config';\nimport { createTaskContextContribution } from '../../../../../services/contextContribution';\nimport { BACKGROUND_WORK_PROVIDER, DelegationManager } from '../../../../../services/delegation';\nimport { createNodeDelegationPlatform } from '../../../../../services/delegationPlatform';\nimport { createTaskErrorReporter, toFailureReporter, TASK_EVENT } from '../../../../../services/logSinkTelemetry';\nimport {\n hasStorePathOverride,\n removeLegacyStoreDirectoryAsync,\n resolveSessionKey,\n sweepStoreFilesAsync,\n} from '../../../../../services/paths';\nimport { createTaskNamespace } from '../../../../../services/taskNamespace';\nimport { TaskStore } from '../../../../../services/taskStore';\nimport { TASKS_CHANNEL_TYPE } from '../../../../../types/webTasks';\n\nconst SOURCE = '@agimon-ai/po-task';\n\n/** The notification body: one line, since `client.notify` collapses the rest anyway. */\nfunction headlineOf(content: string): string {\n return content.split('\\n').find((line) => line.trim().length > 0) ?? content;\n}\n\nconst root = defineRoot(({ host: serverHost, agent: host, signal: pluginSignal }: PoServerPluginContext) => {\n if (!host) throw new Error('Task session requires the headless host.');\n const execution = host.context;\n if (serverHost.context.directEvents === undefined)\n throw new Error('Task server plugin requires the session direct event bus.');\n const directEvents = serverHost.context.directEvents;\n const reporter = createTaskErrorReporter({ cwd: execution.cwd, env: execution.environment });\n const report = toFailureReporter(reporter);\n let active = true;\n let disposed = false;\n let generation = 0;\n let unwatch: (() => void) | undefined;\n let backgroundService: PoBackgroundWorkService | undefined;\n let background: BackgroundWorkProviderHandle | undefined;\n let serviceContext: Context | undefined;\n let startup: Promise<void> = Promise.resolve();\n let startupAbort = new AbortController();\n const ownedReadiness = createPoReadinessCoordinator({\n notify: (notification) =>\n execution.client.notify({\n body: notification.error?.message ?? notification.diagnostics.join('; '),\n level: 'warning',\n }),\n });\n const refresh = (): void => {\n if (!active || disposed) return;\n execution.client.setStatus(SOURCE, `tasks: ${store.snapshot.tasks.length}`);\n background?.update();\n };\n const registerBackground = (): void => {\n if (!active || disposed || !backgroundService || background) return;\n background = backgroundService.register({\n provider: BACKGROUND_WORK_PROVIDER,\n listActiveWork: () => (active && !disposed ? manager.listActiveWork() : []),\n });\n };\n const maxTasks = getMaxTasks(execution.environment);\n const store = new TaskStore({\n cwd: execution.cwd,\n env: execution.environment,\n report,\n });\n store.configureSession(resolveSessionKey(execution.sessionId, execution.environment));\n let notifications: Promise<void> = Promise.resolve();\n const manager = new DelegationManager({\n store,\n cwd: execution.cwd,\n platform: createNodeDelegationPlatform(execution.environment),\n getSessionId: () => execution.sessionId,\n report,\n notify: (message, options) => {\n const ownGeneration = generation;\n const isCurrent = (): boolean => active && !disposed && !pluginSignal?.aborted && generation === ownGeneration;\n // `DelegationNotifier` is Pi's `sendMessage` shape, and the Pi extension\n // forwards it verbatim (`root.cli.ts`). A headless session has no such\n // single call, so the three jobs are done by hand:\n //\n // toast `client.notify` - operator-facing only, flattened to one\n // line and capped at 4096 chars, and the model never sees a\n // custom entry. It gets the headline, not the whole result.\n // transcript `session.appendCustomEntry` under the same custom type,\n // carrying the full multi-line content.\n // wake `session.admitPrompt(content, 'steer')` - the only call\n // that puts the completion in front of the model.\n // `session.prompt(_, 'steer')` is enqueue-only and parks the\n // message on an idle lane, which is why a finished subagent\n // used to leave the agent sitting idle.\n //\n // Sequenced so two delegations settling in the same tick each observe\n // settled lane state rather than racing.\n notifications = notifications\n .then(async () => {\n if (!isCurrent()) return;\n await execution.client.notify({ body: headlineOf(message.content), level: 'info' });\n if (!isCurrent()) return;\n await execution.session.appendCustomEntry(message.customType, { content: message.content });\n // `triggerTurn: false` has no faithful headless mapping - there is no\n // way to reach model context without starting or joining a turn - so\n // it stays a toast, as it is today. `DelegationManager` always sends\n // `true`, so this is defensive rather than live.\n if (!isCurrent() || options?.triggerTurn === false) return;\n // Matching the voice server plugin, which also refuses rather than degrading:\n // `session.prompt(_, 'steer')` is NOT a fallback here, because it is\n // enqueue-only and would park the message on an idle lane - the\n // original bug.\n if (!execution.session.admitPrompt) throw new Error('The session cannot admit a task notification.');\n await execution.session.admitPrompt(message.content, 'steer');\n })\n .catch((error: unknown) => {\n // Mirrors `onNotifyError` below. The delegation is already committed,\n // so a failed notification costs the model its wake-up, not the\n // result, and must not stall later notifications.\n if (isCurrent()) void execution.client.notify({ body: String(error), level: 'warning' });\n });\n },\n onChange: refresh,\n runTimeoutMs: getDelegationTimeoutMs(execution.environment),\n onNotifyError: (error, taskId) => {\n void reporter.recordNotificationError(error, taskId);\n if (active && !disposed) void execution.client.notify({ body: String(error), level: 'warning' });\n },\n });\n return {\n value: { store, manager, maxTasks },\n services: [\n (serviceContextOwner: Context) => {\n serviceContext = serviceContextOwner;\n const namespace = createTaskNamespace({\n store,\n manager,\n maxTasks,\n sessionId: execution.sessionId,\n assertAvailable: () => {\n if (!active || disposed || pluginSignal?.aborted) throw new Error('Task session is unavailable.');\n },\n });\n serviceContextOwner.inject([PO_CODEMODE_SERVICE], (context) => {\n const codemode = readPoCodemode(context);\n if (!codemode) return undefined;\n const registration = codemode.register(SOURCE, namespace);\n // The tasks namespace covers every task action, so the model gets one surface, not two.\n const restriction = host.registerToolRestriction({ excludedTools: ['task'] });\n return () => {\n restriction.dispose();\n registration.dispose();\n };\n });\n serviceContextOwner.inject([PO_CONTEXT_CONTRIBUTIONS_SERVICE], (context) => {\n const registration = requirePoContextContributions(context).register(\n createTaskContextContribution(() => (active && !disposed ? store.snapshot.tasks : [])),\n );\n return () => registration.dispose();\n });\n serviceContextOwner.inject([PO_BACKGROUND_WORK_SERVICE], (context) => {\n const service = readPoBackgroundWorkService(context);\n if (!service) return undefined;\n backgroundService = service;\n registerBackground();\n return () => {\n if (backgroundService !== service) return;\n background?.dispose();\n background = undefined;\n backgroundService = undefined;\n };\n });\n serviceContextOwner.inject([PO_DELEGATION_SERVICE], (serviceContext) => {\n const service = readPoDelegationService(serviceContext);\n if (service) return manager.bind(serviceContext, service);\n return undefined;\n });\n },\n ],\n activities: [\n {\n name: SOURCE,\n async start(activityContext) {\n if (disposed) throw new Error('Task session is disposed.');\n active = true;\n const ownGeneration = ++generation;\n startupAbort.abort();\n const controller = new AbortController();\n startupAbort = controller;\n await Promise.allSettled([startup]);\n const coordinator = (serviceContext && readPoReadinessCoordinator(serviceContext)) ?? ownedReadiness;\n const handle = coordinator.start(SOURCE, `${execution.sessionId}:${ownGeneration}`, async (signal) => {\n const isCurrent = (): boolean =>\n !disposed &&\n !pluginSignal?.aborted &&\n active &&\n generation === ownGeneration &&\n !signal.aborted &&\n !controller.signal.aborted;\n const diagnostics: string[] = [];\n const degrade = async (stage: string, operation: () => Promise<unknown>): Promise<void> => {\n try {\n await operation();\n } catch (error) {\n diagnostics.push(`Task ${stage} failed: ${String(error)}`);\n report.warn(TASK_EVENT.sessionStartDegraded, error, { 'task.stage': stage });\n }\n };\n try {\n if (!isCurrent()) return { value: undefined };\n store.configureSession(resolveSessionKey(activityContext.sessionId, activityContext.environment));\n manager.setCwd(activityContext.cwd);\n const cleanup = await removeLegacyStoreDirectoryAsync(store.storePath, activityContext.cwd);\n if (!isCurrent()) return { value: undefined };\n const sweep = hasStorePathOverride(activityContext.environment)\n ? { errors: [] }\n : await sweepStoreFilesAsync(store.storePath, getStoreTtlMs(activityContext.environment));\n for (const error of [...cleanup.errors, ...sweep.errors]) {\n diagnostics.push(error);\n report.warn(TASK_EVENT.storeSweepFailed, new Error(error));\n }\n if (!isCurrent()) return { value: undefined };\n await degrade('store_read', async () => {\n // Fail-open reads retain telemetry and report only this operation's failure.\n const errors: unknown[] = [];\n await store.readAsync(isCurrent, (error) => errors.push(error));\n if (errors.length > 0) throw new Error(String(errors[0]), { cause: errors[0] });\n });\n if (!isCurrent()) return { value: undefined };\n unwatch?.();\n unwatch = store.onExternalChange(() => {\n refresh();\n if (isCurrent()) directEvents.publish(TASKS_CHANNEL_TYPE, execution.sessionId, store.snapshot);\n });\n await degrade('reconcile', () => manager.reconcile(isCurrent));\n if (!isCurrent()) return { value: undefined };\n registerBackground();\n refresh();\n directEvents.publish(TASKS_CHANNEL_TYPE, execution.sessionId, store.snapshot);\n return { value: undefined, diagnostics };\n } catch (error) {\n if (!isCurrent()) return { value: undefined };\n report.error(TASK_EVENT.sessionStartFailed, error);\n throw error;\n }\n });\n startup = handle.wait();\n // Initialization failure is observable, but must not fail the session closed.\n await Promise.allSettled([startup]);\n return () => {\n if (ownGeneration !== generation) return;\n active = false;\n generation += 1;\n controller.abort();\n unwatch?.();\n unwatch = undefined;\n background?.dispose();\n background = undefined;\n manager.reset();\n execution.client.setStatus(SOURCE, undefined);\n };\n },\n },\n ],\n async onDispose() {\n if (disposed) return;\n disposed = true;\n active = false;\n generation += 1;\n startupAbort.abort();\n await Promise.allSettled([startup]);\n await runCleanups(\n [\n () => unwatch?.(),\n () => background?.dispose(),\n () => manager.dispose(),\n () => store.dispose(),\n () => ownedReadiness.dispose(),\n () => reporter.shutdown(),\n ],\n 'Task cleanup failed.',\n );\n },\n };\n});\n\nexport type TaskServerScope = Awaited<ReturnType<typeof root>>['value'];\nexport default root;\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/root.server';\n\nexport default defineRoot(contribution);\n","import { createHash } from 'node:crypto';\n\nimport { HOME_ENTITY_LIMIT, type HomeProjection } from '@agimon-ai/po-core/hubChannel';\nimport type { PoHubChannelSource, PoHubSessionScope, PoHubChannel } from '@agimon-ai/po-core/hubChannel';\n\nimport type { TaskDocument } from '../../../../models/task';\nimport { isBlocked } from '../../../../models/taskGraph';\nimport { resolveSessionKey, resolveStorePath } from '../../../../services/paths';\nimport { TaskStore } from '../../../../services/taskStore';\nimport { TASKS_CHANNEL_TYPE, type WebTask, type WebTasksPayload } from '../../../../types/webTasks';\n\ninterface TaskStoreSource {\n readonly snapshot: TaskDocument;\n read(): TaskDocument;\n dispose(): void;\n}\n\nfunction isTaskDocument(value: unknown): value is TaskDocument {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as TaskDocument).rev === 'number' &&\n Array.isArray((value as TaskDocument).tasks)\n );\n}\n\nexport interface TasksChannelOptions {\n /** Injectable for tests. The default opens the session tree's durable task store. */\n storeFor?: (scope: PoHubSessionScope) => TaskStoreSource;\n}\n\nfunction present(document: TaskDocument): WebTasksPayload {\n const tasks: WebTask[] = document.tasks.flatMap((task) => {\n if (task.status === 'deleted') return [];\n const view: WebTask = {\n id: task.id,\n subject: task.subject,\n status: task.status,\n blockedBy: task.blockedBy ?? [],\n };\n if (task.description) view.description = task.description;\n if (task.activeForm) view.activeForm = task.activeForm;\n if (task.owner) view.owner = task.owner;\n if (task.updatedAt) view.updatedAt = task.updatedAt;\n if (task.delegation) {\n view.delegation = {\n ...(task.delegation.agent === undefined ? {} : { agent: task.delegation.agent }),\n ...(task.delegation.identity === undefined ? {} : { identity: task.delegation.identity }),\n ...(task.delegation.state === undefined ? {} : { state: task.delegation.state }),\n };\n }\n return [view];\n });\n return { tasks, rev: document.rev };\n}\n\n/** Publishes each managed session's durable task graph and follows direct session commits. */\nexport function createTasksChannel(options: TasksChannelOptions = {}): PoHubChannel {\n return {\n frameType: TASKS_CHANNEL_TYPE,\n start(host) {\n const stores = new Map<string, { store: TaskStoreSource; unsubscribe: () => void; latest?: TaskDocument }>();\n const open = (scope: PoHubSessionScope): void => {\n if (stores.has(scope.sessionId)) return;\n let store = options.storeFor?.(scope);\n if (store === undefined) {\n if (scope.environment === undefined)\n throw new Error(`Task channel requires an admitted environment for session '${scope.sessionId}'.`);\n store = new TaskStore({\n cwd: scope.cwd,\n env: scope.environment,\n storePath: resolveStorePath(\n scope.cwd,\n scope.environment,\n resolveSessionKey(scope.sessionId, scope.environment),\n ),\n });\n }\n store.read();\n const source = { store, unsubscribe: () => undefined as void };\n stores.set(scope.sessionId, source);\n source.unsubscribe = host.directEvents.subscribe(\n TASKS_CHANNEL_TYPE,\n scope.sessionId,\n (payload) => {\n if (!isTaskDocument(payload)) return;\n const current = stores.get(scope.sessionId);\n if (current === undefined) return;\n current.latest = payload;\n host.publish(scope.sessionId, present(payload));\n },\n { replayLatest: true },\n );\n };\n const close = (sessionId: string): void => {\n const source = stores.get(sessionId);\n if (!source) return;\n source.unsubscribe();\n source.store.dispose();\n stores.delete(sessionId);\n };\n for (const scope of host.sessions()) open(scope);\n\n const source: PoHubChannelSource = {\n homeFor(scope): HomeProjection {\n open(scope);\n const source = stores.get(scope.sessionId);\n const document = source?.latest ?? source?.store.snapshot;\n if (!document) return { coverage: 'unavailable', entities: [] };\n const root = resolveSessionKey(scope.sessionId, scope.environment ?? {});\n const graph = createHash('sha256')\n .update(resolveStorePath(scope.cwd, scope.environment ?? {}, root))\n .digest('hex');\n // Do not process a truncated graph: dependencies and owners may be omitted.\n if (document.tasks.length > HOME_ENTITY_LIMIT) return { coverage: 'partial', entities: [] };\n const sessions = host.sessions();\n if (sessions.length > HOME_ENTITY_LIMIT) return { coverage: 'partial', entities: [] };\n const refs = new Set([root]);\n for (const candidate of sessions) {\n const candidateRoot = resolveSessionKey(candidate.sessionId, candidate.environment ?? {});\n if (\n resolveStorePath(candidate.cwd, candidate.environment ?? {}, candidateRoot) ===\n resolveStorePath(scope.cwd, scope.environment ?? {}, root)\n )\n refs.add(candidate.sessionId);\n if (refs.size > 65) return { coverage: 'partial', entities: [] };\n }\n for (const task of document.tasks) {\n if (task.delegation?.sessionId) refs.add(task.delegation.sessionId);\n if (refs.size > 65) return { coverage: 'partial', entities: [] };\n if ((task.blockedBy?.length ?? 0) > HOME_ENTITY_LIMIT) return { coverage: 'partial', entities: [] };\n }\n const tasks = document.tasks.filter((task) => task.status !== 'deleted');\n return {\n coverage: tasks.length > HOME_ENTITY_LIMIT ? 'partial' : 'ready',\n entities: tasks.slice(0, HOME_ENTITY_LIMIT).map((task) => ({\n id: `${graph}:${task.id}:${task.createdAt ?? ''}`,\n kind:\n task.status === 'failed'\n ? 'failure'\n : task.status === 'completed'\n ? 'completed'\n : isBlocked(document.tasks, task)\n ? 'blocked'\n : task.status === 'in_progress'\n ? 'running'\n : 'queued',\n title: (task.subject.trim() || 'Task').slice(0, 160),\n ...(task.description?.trim() ? { detail: task.description.slice(0, 320) } : {}),\n updatedAt: task.updatedAt ?? task.createdAt ?? new Date(0).toISOString(),\n sessionId: root,\n relatedSessionIds: [...refs].filter((id) => id !== root),\n })),\n };\n },\n payloadFor(scope) {\n open(scope);\n const source = stores.get(scope.sessionId);\n const document = source?.latest ?? source?.store.snapshot;\n return document === undefined ? undefined : present(document);\n },\n sessionAdded: open,\n sessionRemoved: close,\n close() {\n for (const sessionId of stores.keys()) close(sessionId);\n },\n };\n return source;\n },\n };\n}\n\nexport default createTasksChannel;\n","import { defineChannel } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/task-graph';\n\nexport default defineChannel(contribution);\n","import type { WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoHeadlessExecutionContext } from '@agimon-ai/po-core/headless';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { COMMAND_NAME } from '../../../../../../constants/task';\nimport { reducerAction } from '../../../../../../services/taskTool';\nimport type { TaskServerScope } from '../../_lib/root.server';\n\nexport default (context: WithRoot<PoServerPluginContext, TaskServerScope>) => ({\n name: COMMAND_NAME,\n description: 'List or clear the persistent task graph.',\n async execute(args: string, commandContext: PoHeadlessExecutionContext) {\n const action = args.trim() === 'clear' ? 'clear' : 'list';\n const response = await reducerAction(context.root.store, action, { action }, context.root.maxTasks);\n const content = response.content[0];\n await commandContext.client.notify({\n body: content?.type === 'text' ? content.text : 'No tasks',\n level: 'info',\n });\n },\n});\n","import { defineServerCommand } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/tasks.server';\n\nexport default defineServerCommand(contribution);\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineResource({\n name: 'codemode-how-to-task',\n description:\n 'Track multi-step work as a persistent task graph and hand ready tasks to background subagents. Use for any plan, todo or delegation: the tasks namespace in code mode, with its status flow, batching rules and assignment briefs.',\n kind: 'skill' as const,\n pinned: true,\n path: packageResourcePath(import.meta.url, 'src/prompts/codemode-how-to-task/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/codemode-how-to-task/SKILL.md'),\n});\n","import type { WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { activeTaskSnapshots, formatTaskSnapshots } from '../../../../../../services/contextContribution';\nimport type { TaskServerScope } from '../../_lib/root.server';\n\nexport default (context: WithRoot<PoServerPluginContext, TaskServerScope>) => ({\n name: 'po/task-board',\n kind: 'context' as const,\n /**\n * The same bounded projection the Pi extension renders: open work only, one line each.\n * Dumping the whole TaskDocument put every completed task plus the store's own\n * version/rev/nextId bookkeeping in the prompt, and an idle board still cost a\n * paragraph. '' is dropped by the prompt composer.\n */\n read: () => {\n const rendered = formatTaskSnapshots(activeTaskSnapshots(context.root.store.snapshot.tasks));\n return rendered === '(no active tasks)' ? '' : rendered;\n },\n});\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/task-board.server';\n\nexport default defineResource(contribution);\n","import { defineServerTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { createHeadlessTaskTool } from '../../../../../../services/taskTool';\nimport type { TaskServerScope } from '../../_lib/root.server';\n\nexport default defineServerTool((context: WithRoot<PoServerPluginContext, TaskServerScope>) =>\n createHeadlessTaskTool(context.root.store, context.root.manager, context.root.maxTasks),\n);\n","import { defineServerTool } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/task.server';\n\nexport default defineServerTool(contribution);\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 channelTaskGraph from '../src/extensions/(backend)/channel/task-graph.server';\nimport commandTasks from '../src/extensions/workspaces/sessions/(backend)/command/tasks.server';\nimport resourceCodemodeHowToTask from '../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-task.server';\nimport resourceTaskBoard from '../src/extensions/workspaces/sessions/(backend)/resource/task-board.server';\nimport toolTask from '../src/extensions/workspaces/sessions/(backend)/tool/task.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-task',\n providerOverrides: composeServerProviderOverrides(rootSession),\n injects: composeRootInjects({ session: [rootSession] }),\n global: (context) => ({\n get channels(): PoServerSessionPlugin['channels'] { return [() => via({ frameType: 'task_graph' }, at(channelTaskGraph, context))]; },\n }),\n workspace: (context) => ({\n get channels(): PoServerSessionPlugin['channels'] { return defined([context.hosted('global') ? undefined : () => via({ frameType: 'task_graph' }, at(channelTaskGraph, context))]); },\n }),\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 channels(): PoServerSessionPlugin['channels'] { return defined([context.hosted('global') ? undefined : () => via({ frameType: 'task_graph' }, at(channelTaskGraph, context))]); },\n get commands(): PoServerSessionPlugin['commands'] { return [via({ name: 'tasks' }, at(commandTasks, contextSession))]; },\n get resources(): PoServerSessionPlugin['resources'] { return [at(resourceCodemodeHowToTask, contextSession), at(resourceTaskBoard, contextSession)]; },\n get tools(): PoServerSessionPlugin['tools'] { return [via({ name: 'task' }, at(toolTask, 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
|
+
{"version":3,"file":"server.cjs","names":["path","randomUUID","applyTaskMutation","isCommittingOp","buildToolResult","Check","TaskParamsSchema","formatAssignmentResults","buildAssignmentResult","buildTextResult","defineRoot","createTaskErrorReporter","toFailureReporter","createPoReadinessCoordinator","BACKGROUND_WORK_PROVIDER","getMaxTasks","TaskStore","resolveSessionKey","DelegationManager","getDelegationTimeoutMs","PO_CODEMODE_SERVICE","readPoCodemode","PO_CONTEXT_CONTRIBUTIONS_SERVICE","requirePoContextContributions","PO_BACKGROUND_WORK_SERVICE","readPoBackgroundWorkService","PO_DELEGATION_SERVICE","readPoDelegationService","readPoReadinessCoordinator","TASK_EVENT","removeLegacyStoreDirectoryAsync","hasStorePathOverride","sweepStoreFilesAsync","getStoreTtlMs","runCleanups","defineRoot","contribution","TaskStore","resolveStorePath","resolveSessionKey","createHash","HOME_ENTITY_LIMIT","isBlocked","defineChannel","contribution","COMMAND_NAME","defineServerCommand","contribution","defineResource","packageResourcePath","readPackageResource","defineResource","contribution","defineServerTool","defineServerTool","contribution","defineServerPlugin","composeServerProviderOverrides","rootSession","composeRootInjects","channelTaskGraph","composeRootHooks","commandTasks","resourceCodemodeHowToTask","resourceTaskBoard","toolTask"],"sources":["../../src/services/contextContribution/index.ts","../../src/services/delegationPlatform/index.ts","../../src/services/taskTool/index.ts","../../src/services/taskNamespace/index.ts","../../src/types/webTasks.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/(backend)/channel/_lib/task-graph.ts","../../src/extensions/(backend)/channel/task-graph.server.ts","../../src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.server.ts","../../src/extensions/workspaces/sessions/(backend)/command/tasks.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-task.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/_lib/task-board.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/task-board.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/_lib/task.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/task.server.ts","../../generated/server.ts"],"sourcesContent":["import type { PoContextContribution } from '@agimon-ai/po-core/contextContributions';\n\nimport type { Task } from '../../models/task';\n\nexport const TASK_CONTEXT_CONTRIBUTION_SOURCE = '@agimon-ai/po-task';\nexport const TASK_CONTEXT_CONTRIBUTION_ID = 'active-tasks';\nexport const TASK_CONTEXT_CONTRIBUTION_LABEL = 'Active tasks';\nexport const TASK_CONTEXT_CONTRIBUTION_ORDER = 100;\n\ninterface TaskContextSnapshot {\n readonly id: number;\n readonly status: Task['status'];\n readonly subject: string;\n readonly activeForm?: string;\n readonly owner?: string;\n readonly blockedBy?: readonly number[];\n readonly delegation?: {\n readonly agent: string;\n readonly state: NonNullable<Task['delegation']>['state'];\n readonly error?: string;\n };\n}\n\nexport function activeTaskSnapshots(tasks: readonly Task[]): TaskContextSnapshot[] {\n return tasks\n .filter((task) => task.status === 'pending' || task.status === 'in_progress' || task.status === 'failed')\n .map((task) => ({\n id: task.id,\n status: task.status,\n subject: task.subject,\n ...(task.activeForm ? { activeForm: task.activeForm } : {}),\n ...(task.owner ? { owner: task.owner } : {}),\n ...(task.blockedBy?.length ? { blockedBy: task.blockedBy } : {}),\n ...(task.delegation\n ? {\n delegation: {\n agent: task.delegation.agent,\n state: task.delegation.state,\n ...(task.delegation.result?.error ? { error: task.delegation.result.error } : {}),\n },\n }\n : {}),\n }));\n}\n\nexport function formatTaskSnapshots(tasks: readonly TaskContextSnapshot[]): string {\n if (tasks.length === 0) return '(no active tasks)';\n return tasks\n .map((task) => {\n const details = [\n task.activeForm ? `active: ${task.activeForm}` : undefined,\n task.owner ? `owner: ${task.owner}` : undefined,\n task.blockedBy?.length ? `blocked by: ${task.blockedBy.join(', ')}` : undefined,\n task.delegation ? `delegation: ${task.delegation.agent} (${task.delegation.state})` : undefined,\n task.delegation?.error ? `error: ${task.delegation.error}` : undefined,\n ].filter((value): value is string => Boolean(value));\n return `- #${task.id} [${task.status}] ${task.subject}${details.length > 0 ? ` | ${details.join(' | ')}` : ''}`;\n })\n .join('\\n');\n}\n\n/** Builds Task's bounded, synchronous contribution from its in-memory store snapshot. */\nexport function createTaskContextContribution(readTasks: () => readonly Task[]): PoContextContribution {\n return Object.freeze({\n source: TASK_CONTEXT_CONTRIBUTION_SOURCE,\n id: TASK_CONTEXT_CONTRIBUTION_ID,\n label: TASK_CONTEXT_CONTRIBUTION_LABEL,\n order: TASK_CONTEXT_CONTRIBUTION_ORDER,\n snapshot: () => formatTaskSnapshots(activeTaskSnapshots(readTasks())),\n });\n}\n","import { randomUUID } from 'node:crypto';\nimport path from 'node:path';\n\nimport type { DelegationPlatform } from '../delegation';\n\nfunction formatBriefPath(entry: string, cwd: string): string {\n if (!path.isAbsolute(entry)) return path.normalize(entry);\n const relative = path.relative(cwd, entry);\n // Outside the run directory the original beats a `../../` chain.\n return relative && !relative.startsWith('..') ? relative : entry;\n}\n\n/** Supply Node-owned process and path facilities to the host-neutral manager. */\nexport function createNodeDelegationPlatform(\n environment: Readonly<Record<string, string | undefined>> = process.env,\n): DelegationPlatform {\n return {\n environment,\n processId: process.pid,\n createRequestId: randomUUID,\n formatBriefPath,\n };\n}\n","import type { PoHeadlessTool, PoHeadlessToolResult } from '@agimon-ai/po-core/headless';\nimport { Check } from 'typebox/value';\n\nimport type { TaskMutationParams } from '../../models/task';\nimport { TaskParamsSchema, type TaskParams, type TaskAssignmentParams } from '../../schemas/task';\nimport type { DelegationManager } from '../delegation';\nimport { applyTaskMutation, isCommittingOp, type ReducerAction } from '../reducer';\nimport { buildAssignmentResult, buildTextResult, buildToolResult, formatAssignmentResults } from '../taskResult';\nimport type { TaskStore } from '../taskStore';\n\nfunction output(value: unknown): PoHeadlessToolResult {\n if (typeof value === 'object' && value !== null && 'content' in value) return value as PoHeadlessToolResult;\n const text = typeof value === 'string' ? value : JSON.stringify(value, null, 2);\n return { content: [{ type: 'text', text }], details: value };\n}\n\nfunction failure(error: unknown): PoHeadlessToolResult {\n return { content: [{ type: 'text', text: error instanceof Error ? error.message : String(error) }], isError: true };\n}\n\nexport async function reducerAction(\n store: TaskStore,\n action: ReducerAction,\n params: TaskMutationParams,\n maxTasks: number,\n): Promise<PoHeadlessToolResult> {\n const { document, value } = await store.mutate((current) => {\n const result = applyTaskMutation(current, action, params, undefined, maxTasks);\n return { ...(isCommittingOp(result.op) ? { document: result.document } : {}), value: result };\n });\n if (value.op.kind === 'error') throw new Error(value.op.message);\n return buildToolResult(action, params, document, value.op);\n}\n\ninterface AssignmentItemResult {\n index: number;\n id: number;\n agent: string;\n ok: boolean;\n message: string;\n}\n\nasync function assignmentBatch(\n manager: DelegationManager,\n assignments: readonly TaskAssignmentParams[],\n signal?: AbortSignal,\n): Promise<AssignmentItemResult[]> {\n const result: AssignmentItemResult[] = [];\n for (const [index, assignment] of assignments.entries()) {\n try {\n const outcome = await manager.assign(assignment.id, {\n agent: assignment.agent,\n inlineAgent: assignment.inlineAgent,\n instructions: assignment.instructions,\n relevantFiles: assignment.relevantFiles,\n priorFindings: assignment.priorFindings,\n model: assignment.model,\n ...(assignment.context === 'fork' || assignment.context === 'fresh' ? { context: assignment.context } : {}),\n signal,\n });\n result.push({ index, id: assignment.id, agent: assignment.agent, ...outcome });\n } catch (error) {\n result.push({ index, id: assignment.id, agent: assignment.agent, ok: false, message: String(error) });\n }\n }\n return result;\n}\n\n/** One task action against the session store, shared by the `task` tool and the `tasks` code-mode namespace. */\nexport async function runTaskAction(\n store: TaskStore,\n manager: DelegationManager | undefined,\n maxTasks: number,\n rawParams: unknown,\n signal?: AbortSignal,\n onUpdate?: (result: PoHeadlessToolResult) => void,\n): Promise<PoHeadlessToolResult> {\n if (!Check(TaskParamsSchema, rawParams)) return failure('Invalid task parameters.');\n const params = rawParams as TaskParams;\n try {\n if ((params.action === 'assign' || params.action === 'cancel') && !manager)\n throw new Error('Delegation is not available on this connection.');\n if (params.action === 'assign') {\n if (!params.assignments?.length) throw new Error('assign requires a non-empty assignments[] array');\n onUpdate?.(\n output(`Delegating ${params.assignments.length} task${params.assignments.length === 1 ? '' : 's'}...`),\n );\n const items = await assignmentBatch(manager!, params.assignments, signal);\n const assigned = items.filter((item) => item.ok).map((item) => item.id);\n const text = formatAssignmentResults(items);\n if (assigned.length === 0) throw new Error(text);\n return buildAssignmentResult(params as TaskMutationParams, store.snapshot, text, {\n assigned,\n failed: items.length - assigned.length,\n });\n }\n if (params.action === 'cancel') {\n const outcome = await manager!.cancel(params.id ?? Number.NaN);\n if (!outcome.ok) throw new Error(outcome.message);\n return buildTextResult('cancel', params as TaskMutationParams, store.snapshot, outcome.message);\n }\n return reducerAction(store, params.action as ReducerAction, params as TaskMutationParams, maxTasks);\n } catch (error) {\n return failure(error);\n }\n}\n\nexport function createHeadlessTaskTool(\n store: TaskStore,\n /** Absent on remote MCP connections, which track tasks but never delegate. */\n manager: DelegationManager | undefined,\n maxTasks: number,\n): PoHeadlessTool<typeof TaskParamsSchema> {\n return {\n name: 'task',\n label: 'Task',\n description: 'Maintain a persistent task graph and delegate ready tasks to background agents.',\n parameters: TaskParamsSchema,\n promptSnippet: 'Track complex work persistently and delegate ready tasks',\n executionMode: 'serial',\n execute: (_toolCallId, rawParams, signal, onUpdate) =>\n runTaskAction(store, manager, maxTasks, rawParams, signal, onUpdate),\n };\n}\n","import type { PoCodemodeNamespace } from '@agimon-ai/po-core/codemode';\n\nimport type { TaskDocument } from '../../models/task';\nimport { runTaskAction } from '../taskTool';\nimport type { TaskNamespaceOptions } from './type';\n\nconst DECLARATIONS = `type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';\n\ntype DelegationState = 'requested' | 'running' | 'completed' | 'failed' | 'cancelled';\n\ninterface DelegationResult {\n status: string;\n output?: string;\n outputPath?: string;\n sessionFile?: string;\n error?: string;\n durationMs?: number;\n toolCount?: number;\n}\n\ninterface TaskDelegation {\n requestId: string;\n agent: string;\n identity?: string;\n state: DelegationState;\n sessionId?: string;\n pid?: number;\n runId?: string;\n model?: string;\n startedAt?: string;\n endedAt?: string;\n result?: DelegationResult;\n}\n\ninterface Task {\n id: number;\n subject: string;\n description?: string;\n activeForm?: string;\n status: TaskStatus;\n blockedBy?: number[];\n owner?: string;\n metadata?: Record<string, unknown>;\n createdAt?: string;\n updatedAt?: string;\n delegation?: TaskDelegation;\n}\n\ninterface TaskDocument {\n version: number;\n rev: number;\n nextId: number;\n tasks: Task[];\n}\ninterface TaskItem {\n /** Existing task id to change. Omit to create; an unknown id fails only that entry. */\n id?: number;\n /** Temporary name so a LATER entry in the same call can list it in blockedBy. Never stored. */\n ref?: string;\n /** Short and imperative. Required when creating. */\n subject?: string;\n /** The durable brief handed to a subagent on assign. */\n description?: string;\n /** Present-continuous label shown while in_progress, such as 'writing tests'. */\n activeForm?: string;\n status?: TaskStatus;\n /** For a NEW entry: task ids or earlier refs. */\n blockedBy?: (number | string)[];\n /** For an entry with an id: dependencies to add or remove. */\n addBlockedBy?: (number | string)[];\n removeBlockedBy?: (number | string)[];\n owner?: string;\n /** Merged into the task; a null value deletes that key. */\n metadata?: Record<string, unknown>;\n}\n\ninterface TaskAssignment {\n /** A pending, unblocked task. */\n id: number;\n /** Exact name from subagent({ action: 'agents' }). */\n agent: string;\n instructions?: string;\n /** Only files you actually read or located. */\n relevantFiles?: string[];\n /** Only verified facts, not directives. */\n priorFindings?: string;\n model?: string;\n context?: 'fresh' | 'fork';\n}\n\n/** What a write returns: the text the task tool would print, and the graph after the write. */\ninterface TaskWrite {\n message: string;\n document: TaskDocument;\n /** upsert only: ids that landed and how many entries failed. Nothing landing throws; a partial failure does not. */\n applied?: number[];\n failed?: number;\n}\ndeclare const tasks: {\n /** The whole task graph, tombstones included. Filter it in the script. */\n snapshot(): Promise<TaskDocument>;\n /**\n * Create or change tasks, applied in array order. Never mark a task completed while tests fail or the\n * work is partial: use failed, or keep it in_progress and add a task for the blocker in the same call.\n * Status flow is pending, in_progress, completed. failed is recoverable and deleted is a tombstone.\n */\n upsert(tasks: TaskItem[]): Promise<TaskWrite>;\n /** Tombstone one task. Refused while it has a running delegation. */\n delete(id: number): Promise<TaskWrite>;\n /** Remove every task. Refused while a delegation is running. */\n clear(): Promise<TaskWrite>;\n /** Hand ready tasks to background subagents. Batch independent tasks in one call. */\n assign(assignments: TaskAssignment[]): Promise<TaskWrite>;\n /** Cancel a task's running delegation. */\n cancel(id: number): Promise<TaskWrite>;\n};`;\n\n/** The owning session's task graph: `snapshot` reads without locking, the rest write through the same store as the `task` tool. */\nexport function createTaskNamespace(options: TaskNamespaceOptions): PoCodemodeNamespace {\n return {\n name: 'tasks',\n summary:\n 'The session task graph: tasks.snapshot() reads it, tasks.upsert/delete/clear change it, tasks.assign/cancel hand tasks to background subagents. Use it to track multi-step work.',\n declarations: DECLARATIONS,\n bind(run) {\n if (run.sessionId !== options.sessionId) throw new Error('Tasks namespace belongs to another session.');\n let disposed = false;\n run.onDispose(() => {\n disposed = true;\n });\n const assertAvailable = (): void => {\n run.signal.throwIfAborted();\n if (disposed) throw new Error('Tasks namespace run is disposed.');\n options.assertAvailable();\n };\n const members: Record<string, unknown> = Object.create(null);\n members.snapshot = async (): Promise<TaskDocument> => {\n assertAvailable();\n const storePath = options.store.storePath;\n const errors: unknown[] = [];\n const document = await options.store.readAsync(\n () => false,\n (error) => errors.push(error),\n );\n assertAvailable();\n if (options.store.storePath !== storePath) throw new Error('Task store path changed during snapshot.');\n if (errors.length > 0) throw new Error('Task snapshot read failed.', { cause: errors[0] });\n return JSON.parse(JSON.stringify(document)) as TaskDocument;\n };\n const write = async (params: Record<string, unknown>) => {\n assertAvailable();\n const started = Date.now();\n const result = await runTaskAction(options.store, options.manager, options.maxTasks, params, run.signal);\n assertAvailable();\n const message = result.content.flatMap((part) => (part.type === 'text' ? [part.text] : [])).join('\\n');\n const upsert = (result.details as { upsert?: { applied: number[]; failed: number } } | undefined)?.upsert;\n const failure =\n result.isError || (upsert && upsert.applied.length === 0 && upsert.failed > 0) ? message : undefined;\n // The `task` tool's card draws the call, from the same args and result the tool would have had.\n run.record?.({\n name: `tasks.${String(params.action)}`,\n tool: 'task',\n args: params,\n ok: failure === undefined,\n ms: Date.now() - started,\n ...(failure === undefined ? {} : { error: failure }),\n result: { content: result.content, details: result.details },\n });\n if (failure !== undefined) throw new Error(failure);\n return {\n message,\n document: JSON.parse(JSON.stringify(options.store.snapshot)) as TaskDocument,\n ...(upsert ? { applied: upsert.applied, failed: upsert.failed } : {}),\n };\n };\n members.upsert = (tasks: unknown) => write({ action: 'upsert', tasks });\n members.delete = (id: unknown) => write({ action: 'delete', id });\n members.clear = () => write({ action: 'clear' });\n members.assign = (assignments: unknown) => write({ action: 'assign', assignments });\n members.cancel = (id: unknown) => write({ action: 'cancel', id });\n return members;\n },\n };\n}\n","/** Browser-safe task view published by the cockpit hub channel. */\nexport const TASKS_CHANNEL_TYPE = 'task_graph';\n\nexport type WebTaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';\n\nexport interface WebTask {\n id: number;\n subject: string;\n description?: string;\n activeForm?: string;\n status: WebTaskStatus;\n blockedBy: number[];\n owner?: string;\n updatedAt?: string;\n delegation?: {\n agent?: string;\n identity?: string;\n state?: string;\n };\n}\n\nexport interface WebTasksPayload {\n tasks: WebTask[];\n rev: number;\n}\n","import {\n PO_BACKGROUND_WORK_SERVICE,\n readPoBackgroundWorkService,\n type BackgroundWorkProviderHandle,\n type PoBackgroundWorkService,\n} from '@agimon-ai/po-core/backgroundWork';\nimport { PO_CODEMODE_SERVICE, readPoCodemode } from '@agimon-ai/po-core/codemode';\nimport {\n PO_CONTEXT_CONTRIBUTIONS_SERVICE,\n requirePoContextContributions,\n} from '@agimon-ai/po-core/contextContributions';\nimport { PO_DELEGATION_SERVICE, readPoDelegationService } from '@agimon-ai/po-core/delegation';\nimport { defineRoot, runCleanups } from '@agimon-ai/po-core/extensionFile';\nimport { createPoReadinessCoordinator, readPoReadinessCoordinator } from '@agimon-ai/po-core/readiness';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { getDelegationTimeoutMs, getMaxTasks, getStoreTtlMs } from '../../../../../services/config';\nimport { createTaskContextContribution } from '../../../../../services/contextContribution';\nimport { BACKGROUND_WORK_PROVIDER, DelegationManager } from '../../../../../services/delegation';\nimport { createNodeDelegationPlatform } from '../../../../../services/delegationPlatform';\nimport { createTaskErrorReporter, toFailureReporter, TASK_EVENT } from '../../../../../services/logSinkTelemetry';\nimport {\n hasStorePathOverride,\n removeLegacyStoreDirectoryAsync,\n resolveSessionKey,\n sweepStoreFilesAsync,\n} from '../../../../../services/paths';\nimport { createTaskNamespace } from '../../../../../services/taskNamespace';\nimport { TaskStore } from '../../../../../services/taskStore';\nimport { TASKS_CHANNEL_TYPE } from '../../../../../types/webTasks';\n\nconst SOURCE = '@agimon-ai/po-task';\n\n/** The notification body: one line, since `client.notify` collapses the rest anyway. */\nfunction headlineOf(content: string): string {\n return content.split('\\n').find((line) => line.trim().length > 0) ?? content;\n}\n\nconst root = defineRoot(({ host: serverHost, agent: host, signal: pluginSignal }: PoServerPluginContext) => {\n if (!host) throw new Error('Task session requires the headless host.');\n const execution = host.context;\n if (serverHost.context.directEvents === undefined)\n throw new Error('Task server plugin requires the session direct event bus.');\n const directEvents = serverHost.context.directEvents;\n const reporter = createTaskErrorReporter({ cwd: execution.cwd, env: execution.environment });\n const report = toFailureReporter(reporter);\n let active = true;\n let disposed = false;\n let generation = 0;\n let unwatch: (() => void) | undefined;\n let backgroundService: PoBackgroundWorkService | undefined;\n let background: BackgroundWorkProviderHandle | undefined;\n let serviceContext: Context | undefined;\n let startup: Promise<void> = Promise.resolve();\n let startupAbort = new AbortController();\n const ownedReadiness = createPoReadinessCoordinator({\n notify: (notification) =>\n execution.client.notify({\n body: notification.error?.message ?? notification.diagnostics.join('; '),\n level: 'warning',\n }),\n });\n const refresh = (): void => {\n if (!active || disposed) return;\n execution.client.setStatus(SOURCE, `tasks: ${store.snapshot.tasks.length}`);\n background?.update();\n };\n const registerBackground = (): void => {\n if (!active || disposed || !backgroundService || background) return;\n background = backgroundService.register({\n provider: BACKGROUND_WORK_PROVIDER,\n listActiveWork: () => (active && !disposed ? manager.listActiveWork() : []),\n });\n };\n const maxTasks = getMaxTasks(execution.environment);\n const store = new TaskStore({\n cwd: execution.cwd,\n env: execution.environment,\n report,\n });\n store.configureSession(resolveSessionKey(execution.sessionId, execution.environment));\n let notifications: Promise<void> = Promise.resolve();\n const manager = new DelegationManager({\n store,\n cwd: execution.cwd,\n platform: createNodeDelegationPlatform(execution.environment),\n getSessionId: () => execution.sessionId,\n report,\n notify: (message, options) => {\n const ownGeneration = generation;\n const isCurrent = (): boolean => active && !disposed && !pluginSignal?.aborted && generation === ownGeneration;\n // `DelegationNotifier` is Pi's `sendMessage` shape, and the Pi extension\n // forwards it verbatim (`root.cli.ts`). A headless session has no such\n // single call, so the three jobs are done by hand:\n //\n // toast `client.notify` - operator-facing only, flattened to one\n // line and capped at 4096 chars, and the model never sees a\n // custom entry. It gets the headline, not the whole result.\n // transcript `session.appendCustomEntry` under the same custom type,\n // carrying the full multi-line content.\n // wake `session.admitPrompt(content, 'steer')` - the only call\n // that puts the completion in front of the model.\n // `session.prompt(_, 'steer')` is enqueue-only and parks the\n // message on an idle lane, which is why a finished subagent\n // used to leave the agent sitting idle.\n //\n // Sequenced so two delegations settling in the same tick each observe\n // settled lane state rather than racing.\n notifications = notifications\n .then(async () => {\n if (!isCurrent()) return;\n await execution.client.notify({ body: headlineOf(message.content), level: 'info' });\n if (!isCurrent()) return;\n await execution.session.appendCustomEntry(message.customType, { content: message.content });\n // `triggerTurn: false` has no faithful headless mapping - there is no\n // way to reach model context without starting or joining a turn - so\n // it stays a toast, as it is today. `DelegationManager` always sends\n // `true`, so this is defensive rather than live.\n if (!isCurrent() || options?.triggerTurn === false) return;\n // Matching the voice server plugin, which also refuses rather than degrading:\n // `session.prompt(_, 'steer')` is NOT a fallback here, because it is\n // enqueue-only and would park the message on an idle lane - the\n // original bug.\n if (!execution.session.admitPrompt) throw new Error('The session cannot admit a task notification.');\n await execution.session.admitPrompt(message.content, 'steer');\n })\n .catch((error: unknown) => {\n // Mirrors `onNotifyError` below. The delegation is already committed,\n // so a failed notification costs the model its wake-up, not the\n // result, and must not stall later notifications.\n if (isCurrent()) void execution.client.notify({ body: String(error), level: 'warning' });\n });\n },\n onChange: refresh,\n runTimeoutMs: getDelegationTimeoutMs(execution.environment),\n onNotifyError: (error, taskId) => {\n void reporter.recordNotificationError(error, taskId);\n if (active && !disposed) void execution.client.notify({ body: String(error), level: 'warning' });\n },\n });\n return {\n value: { store, manager, maxTasks },\n services: [\n (serviceContextOwner: Context) => {\n serviceContext = serviceContextOwner;\n const namespace = createTaskNamespace({\n store,\n manager,\n maxTasks,\n sessionId: execution.sessionId,\n assertAvailable: () => {\n if (!active || disposed || pluginSignal?.aborted) throw new Error('Task session is unavailable.');\n },\n });\n serviceContextOwner.inject([PO_CODEMODE_SERVICE], (context) => {\n const codemode = readPoCodemode(context);\n if (!codemode) return undefined;\n const registration = codemode.register(SOURCE, namespace);\n // The tasks namespace covers every task action, so the model gets one surface, not two.\n const restriction = host.registerToolRestriction({ excludedTools: ['task'] });\n return () => {\n restriction.dispose();\n registration.dispose();\n };\n });\n serviceContextOwner.inject([PO_CONTEXT_CONTRIBUTIONS_SERVICE], (context) => {\n const registration = requirePoContextContributions(context).register(\n createTaskContextContribution(() => (active && !disposed ? store.snapshot.tasks : [])),\n );\n return () => registration.dispose();\n });\n serviceContextOwner.inject([PO_BACKGROUND_WORK_SERVICE], (context) => {\n const service = readPoBackgroundWorkService(context);\n if (!service) return undefined;\n backgroundService = service;\n registerBackground();\n return () => {\n if (backgroundService !== service) return;\n background?.dispose();\n background = undefined;\n backgroundService = undefined;\n };\n });\n serviceContextOwner.inject([PO_DELEGATION_SERVICE], (serviceContext) => {\n const service = readPoDelegationService(serviceContext);\n if (service) return manager.bind(serviceContext, service);\n return undefined;\n });\n },\n ],\n activities: [\n {\n name: SOURCE,\n async start(activityContext) {\n if (disposed) throw new Error('Task session is disposed.');\n active = true;\n const ownGeneration = ++generation;\n startupAbort.abort();\n const controller = new AbortController();\n startupAbort = controller;\n await Promise.allSettled([startup]);\n const coordinator = (serviceContext && readPoReadinessCoordinator(serviceContext)) ?? ownedReadiness;\n const handle = coordinator.start(SOURCE, `${execution.sessionId}:${ownGeneration}`, async (signal) => {\n const isCurrent = (): boolean =>\n !disposed &&\n !pluginSignal?.aborted &&\n active &&\n generation === ownGeneration &&\n !signal.aborted &&\n !controller.signal.aborted;\n const diagnostics: string[] = [];\n const degrade = async (stage: string, operation: () => Promise<unknown>): Promise<void> => {\n try {\n await operation();\n } catch (error) {\n diagnostics.push(`Task ${stage} failed: ${String(error)}`);\n report.warn(TASK_EVENT.sessionStartDegraded, error, { 'task.stage': stage });\n }\n };\n try {\n if (!isCurrent()) return { value: undefined };\n store.configureSession(resolveSessionKey(activityContext.sessionId, activityContext.environment));\n manager.setCwd(activityContext.cwd);\n const cleanup = await removeLegacyStoreDirectoryAsync(store.storePath, activityContext.cwd);\n if (!isCurrent()) return { value: undefined };\n const sweep = hasStorePathOverride(activityContext.environment)\n ? { errors: [] }\n : await sweepStoreFilesAsync(store.storePath, getStoreTtlMs(activityContext.environment));\n for (const error of [...cleanup.errors, ...sweep.errors]) {\n diagnostics.push(error);\n report.warn(TASK_EVENT.storeSweepFailed, new Error(error));\n }\n if (!isCurrent()) return { value: undefined };\n await degrade('store_read', async () => {\n // Fail-open reads retain telemetry and report only this operation's failure.\n const errors: unknown[] = [];\n await store.readAsync(isCurrent, (error) => errors.push(error));\n if (errors.length > 0) throw new Error(String(errors[0]), { cause: errors[0] });\n });\n if (!isCurrent()) return { value: undefined };\n unwatch?.();\n unwatch = store.onExternalChange(() => {\n refresh();\n if (isCurrent()) directEvents.publish(TASKS_CHANNEL_TYPE, execution.sessionId, store.snapshot);\n });\n await degrade('reconcile', () => manager.reconcile(isCurrent));\n if (!isCurrent()) return { value: undefined };\n registerBackground();\n refresh();\n directEvents.publish(TASKS_CHANNEL_TYPE, execution.sessionId, store.snapshot);\n return { value: undefined, diagnostics };\n } catch (error) {\n if (!isCurrent()) return { value: undefined };\n report.error(TASK_EVENT.sessionStartFailed, error);\n throw error;\n }\n });\n startup = handle.wait();\n // Initialization failure is observable, but must not fail the session closed.\n await Promise.allSettled([startup]);\n return () => {\n if (ownGeneration !== generation) return;\n active = false;\n generation += 1;\n controller.abort();\n unwatch?.();\n unwatch = undefined;\n background?.dispose();\n background = undefined;\n manager.reset();\n execution.client.setStatus(SOURCE, undefined);\n };\n },\n },\n ],\n async onDispose() {\n if (disposed) return;\n disposed = true;\n active = false;\n generation += 1;\n startupAbort.abort();\n await Promise.allSettled([startup]);\n await runCleanups(\n [\n () => unwatch?.(),\n () => background?.dispose(),\n () => manager.dispose(),\n () => store.dispose(),\n () => ownedReadiness.dispose(),\n () => reporter.shutdown(),\n ],\n 'Task cleanup failed.',\n );\n },\n };\n});\n\nexport type TaskServerScope = Awaited<ReturnType<typeof root>>['value'];\nexport default root;\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/root.server';\n\nexport default defineRoot(contribution);\n","import { createHash } from 'node:crypto';\n\nimport { HOME_ENTITY_LIMIT, type HomeProjection } from '@agimon-ai/po-core/hubChannel';\nimport type { PoHubChannelSource, PoHubSessionScope, PoHubChannel } from '@agimon-ai/po-core/hubChannel';\n\nimport type { TaskDocument } from '../../../../models/task';\nimport { isBlocked } from '../../../../models/taskGraph';\nimport { resolveSessionKey, resolveStorePath } from '../../../../services/paths';\nimport { TaskStore } from '../../../../services/taskStore';\nimport { TASKS_CHANNEL_TYPE, type WebTask, type WebTasksPayload } from '../../../../types/webTasks';\n\ninterface TaskStoreSource {\n readonly snapshot: TaskDocument;\n read(): TaskDocument;\n dispose(): void;\n}\n\nfunction isTaskDocument(value: unknown): value is TaskDocument {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as TaskDocument).rev === 'number' &&\n Array.isArray((value as TaskDocument).tasks)\n );\n}\n\nexport interface TasksChannelOptions {\n /** Injectable for tests. The default opens the session tree's durable task store. */\n storeFor?: (scope: PoHubSessionScope) => TaskStoreSource;\n}\n\nfunction present(document: TaskDocument): WebTasksPayload {\n const tasks: WebTask[] = document.tasks.flatMap((task) => {\n if (task.status === 'deleted') return [];\n const view: WebTask = {\n id: task.id,\n subject: task.subject,\n status: task.status,\n blockedBy: task.blockedBy ?? [],\n };\n if (task.description) view.description = task.description;\n if (task.activeForm) view.activeForm = task.activeForm;\n if (task.owner) view.owner = task.owner;\n if (task.updatedAt) view.updatedAt = task.updatedAt;\n if (task.delegation) {\n view.delegation = {\n ...(task.delegation.agent === undefined ? {} : { agent: task.delegation.agent }),\n ...(task.delegation.identity === undefined ? {} : { identity: task.delegation.identity }),\n ...(task.delegation.state === undefined ? {} : { state: task.delegation.state }),\n };\n }\n return [view];\n });\n return { tasks, rev: document.rev };\n}\n\n/** Publishes each managed session's durable task graph and follows direct session commits. */\nexport function createTasksChannel(options: TasksChannelOptions = {}): PoHubChannel {\n return {\n frameType: TASKS_CHANNEL_TYPE,\n start(host) {\n const stores = new Map<string, { store: TaskStoreSource; unsubscribe: () => void; latest?: TaskDocument }>();\n const open = (scope: PoHubSessionScope): void => {\n if (stores.has(scope.sessionId)) return;\n let store = options.storeFor?.(scope);\n if (store === undefined) {\n if (scope.environment === undefined)\n throw new Error(`Task channel requires an admitted environment for session '${scope.sessionId}'.`);\n store = new TaskStore({\n cwd: scope.cwd,\n env: scope.environment,\n storePath: resolveStorePath(\n scope.cwd,\n scope.environment,\n resolveSessionKey(scope.sessionId, scope.environment),\n ),\n });\n }\n store.read();\n const source = { store, unsubscribe: () => undefined as void };\n stores.set(scope.sessionId, source);\n source.unsubscribe = host.directEvents.subscribe(\n TASKS_CHANNEL_TYPE,\n scope.sessionId,\n (payload) => {\n if (!isTaskDocument(payload)) return;\n const current = stores.get(scope.sessionId);\n if (current === undefined) return;\n current.latest = payload;\n host.publish(scope.sessionId, present(payload));\n },\n { replayLatest: true },\n );\n };\n const close = (sessionId: string): void => {\n const source = stores.get(sessionId);\n if (!source) return;\n source.unsubscribe();\n source.store.dispose();\n stores.delete(sessionId);\n };\n for (const scope of host.sessions()) open(scope);\n\n const source: PoHubChannelSource = {\n homeFor(scope): HomeProjection {\n open(scope);\n const source = stores.get(scope.sessionId);\n const document = source?.latest ?? source?.store.snapshot;\n if (!document) return { coverage: 'unavailable', entities: [] };\n const root = resolveSessionKey(scope.sessionId, scope.environment ?? {});\n const graph = createHash('sha256')\n .update(resolveStorePath(scope.cwd, scope.environment ?? {}, root))\n .digest('hex');\n // Do not process a truncated graph: dependencies and owners may be omitted.\n if (document.tasks.length > HOME_ENTITY_LIMIT) return { coverage: 'partial', entities: [] };\n const sessions = host.sessions();\n if (sessions.length > HOME_ENTITY_LIMIT) return { coverage: 'partial', entities: [] };\n const refs = new Set([root]);\n for (const candidate of sessions) {\n const candidateRoot = resolveSessionKey(candidate.sessionId, candidate.environment ?? {});\n if (\n resolveStorePath(candidate.cwd, candidate.environment ?? {}, candidateRoot) ===\n resolveStorePath(scope.cwd, scope.environment ?? {}, root)\n )\n refs.add(candidate.sessionId);\n if (refs.size > 65) return { coverage: 'partial', entities: [] };\n }\n for (const task of document.tasks) {\n if (task.delegation?.sessionId) refs.add(task.delegation.sessionId);\n if (refs.size > 65) return { coverage: 'partial', entities: [] };\n if ((task.blockedBy?.length ?? 0) > HOME_ENTITY_LIMIT) return { coverage: 'partial', entities: [] };\n }\n const tasks = document.tasks.filter((task) => task.status !== 'deleted');\n return {\n coverage: tasks.length > HOME_ENTITY_LIMIT ? 'partial' : 'ready',\n entities: tasks.slice(0, HOME_ENTITY_LIMIT).map((task) => ({\n id: `${graph}:${task.id}:${task.createdAt ?? ''}`,\n kind:\n task.status === 'failed'\n ? 'failure'\n : task.status === 'completed'\n ? 'completed'\n : isBlocked(document.tasks, task)\n ? 'blocked'\n : task.status === 'in_progress'\n ? 'running'\n : 'queued',\n title: (task.subject.trim() || 'Task').slice(0, 160),\n ...(task.description?.trim() ? { detail: task.description.slice(0, 320) } : {}),\n updatedAt: task.updatedAt ?? task.createdAt ?? new Date(0).toISOString(),\n sessionId: root,\n relatedSessionIds: [...refs].filter((id) => id !== root),\n })),\n };\n },\n payloadFor(scope) {\n open(scope);\n const source = stores.get(scope.sessionId);\n const document = source?.latest ?? source?.store.snapshot;\n return document === undefined ? undefined : present(document);\n },\n sessionAdded: open,\n sessionRemoved: close,\n close() {\n for (const sessionId of stores.keys()) close(sessionId);\n },\n };\n return source;\n },\n };\n}\n\nexport default createTasksChannel;\n","import { defineChannel } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/task-graph';\n\nexport default defineChannel(contribution);\n","import type { WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoHeadlessExecutionContext } from '@agimon-ai/po-core/headless';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { COMMAND_NAME } from '../../../../../../constants/task';\nimport { reducerAction } from '../../../../../../services/taskTool';\nimport type { TaskServerScope } from '../../_lib/root.server';\n\nexport default (context: WithRoot<PoServerPluginContext, TaskServerScope>) => ({\n name: COMMAND_NAME,\n description: 'List or clear the persistent task graph.',\n async execute(args: string, commandContext: PoHeadlessExecutionContext) {\n const action = args.trim() === 'clear' ? 'clear' : 'list';\n const response = await reducerAction(context.root.store, action, { action }, context.root.maxTasks);\n const content = response.content[0];\n await commandContext.client.notify({\n body: content?.type === 'text' ? content.text : 'No tasks',\n level: 'info',\n });\n },\n});\n","import { defineServerCommand } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/tasks.server';\n\nexport default defineServerCommand(contribution);\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineResource({\n name: 'codemode-how-to-task',\n description:\n 'Keep a plan that survives compaction and delegate parts of it to background subagents. Use for any multi-step plan, todo list, or delegation.',\n kind: 'skill' as const,\n pinned: true,\n path: packageResourcePath(import.meta.url, 'src/prompts/codemode-how-to-task/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/codemode-how-to-task/SKILL.md'),\n});\n","import type { WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { activeTaskSnapshots, formatTaskSnapshots } from '../../../../../../services/contextContribution';\nimport type { TaskServerScope } from '../../_lib/root.server';\n\nexport default (context: WithRoot<PoServerPluginContext, TaskServerScope>) => ({\n name: 'po/task-board',\n kind: 'context' as const,\n /**\n * The same bounded projection the Pi extension renders: open work only, one line each.\n * Dumping the whole TaskDocument put every completed task plus the store's own\n * version/rev/nextId bookkeeping in the prompt, and an idle board still cost a\n * paragraph. '' is dropped by the prompt composer.\n */\n read: () => {\n const rendered = formatTaskSnapshots(activeTaskSnapshots(context.root.store.snapshot.tasks));\n return rendered === '(no active tasks)' ? '' : rendered;\n },\n});\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/task-board.server';\n\nexport default defineResource(contribution);\n","import { defineServerTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { createHeadlessTaskTool } from '../../../../../../services/taskTool';\nimport type { TaskServerScope } from '../../_lib/root.server';\n\nexport default defineServerTool((context: WithRoot<PoServerPluginContext, TaskServerScope>) =>\n createHeadlessTaskTool(context.root.store, context.root.manager, context.root.maxTasks),\n);\n","import { defineServerTool } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/task.server';\n\nexport default defineServerTool(contribution);\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 channelTaskGraph from '../src/extensions/(backend)/channel/task-graph.server';\nimport commandTasks from '../src/extensions/workspaces/sessions/(backend)/command/tasks.server';\nimport resourceCodemodeHowToTask from '../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-task.server';\nimport resourceTaskBoard from '../src/extensions/workspaces/sessions/(backend)/resource/task-board.server';\nimport toolTask from '../src/extensions/workspaces/sessions/(backend)/tool/task.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-task',\n providerOverrides: composeServerProviderOverrides(rootSession),\n injects: composeRootInjects({ session: [rootSession] }),\n global: (context) => ({\n get channels(): PoServerSessionPlugin['channels'] { return [() => via({ frameType: 'task_graph' }, at(channelTaskGraph, context))]; },\n }),\n workspace: (context) => ({\n get channels(): PoServerSessionPlugin['channels'] { return defined([context.hosted('global') ? undefined : () => via({ frameType: 'task_graph' }, at(channelTaskGraph, context))]); },\n }),\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 channels(): PoServerSessionPlugin['channels'] { return defined([context.hosted('global') ? undefined : () => via({ frameType: 'task_graph' }, at(channelTaskGraph, context))]); },\n get commands(): PoServerSessionPlugin['commands'] { return [via({ name: 'tasks' }, at(commandTasks, contextSession))]; },\n get resources(): PoServerSessionPlugin['resources'] { return [at(resourceCodemodeHowToTask, contextSession), at(resourceTaskBoard, contextSession)]; },\n get tools(): PoServerSessionPlugin['tools'] { return [via({ name: 'task' }, at(toolTask, contextSession))]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default serverPlugin;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,MAAa,mCAAmC;AAChD,MAAa,+BAA+B;AAC5C,MAAa,kCAAkC;AAiB/C,SAAgB,oBAAoB,OAA+C;CACjF,OAAO,MACJ,QAAQ,SAAS,KAAK,WAAW,aAAa,KAAK,WAAW,iBAAiB,KAAK,WAAW,QAAQ,CAAC,CACxG,KAAK,UAAU;EACd,IAAI,KAAK;EACT,QAAQ,KAAK;EACb,SAAS,KAAK;EACd,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,WAAW,IAAI,CAAC;EACzD,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;EAC1C,GAAI,KAAK,WAAW,SAAS,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;EAC9D,GAAI,KAAK,aACL,EACE,YAAY;GACV,OAAO,KAAK,WAAW;GACvB,OAAO,KAAK,WAAW;GACvB,GAAI,KAAK,WAAW,QAAQ,QAAQ,EAAE,OAAO,KAAK,WAAW,OAAO,MAAM,IAAI,CAAC;EACjF,EACF,IACA,CAAC;CACP,EAAE;AACN;AAEA,SAAgB,oBAAoB,OAA+C;CACjF,IAAI,MAAM,WAAW,GAAG,OAAO;CAC/B,OAAO,MACJ,KAAK,SAAS;EACb,MAAM,UAAU;GACd,KAAK,aAAa,WAAW,KAAK,eAAe,KAAA;GACjD,KAAK,QAAQ,UAAU,KAAK,UAAU,KAAA;GACtC,KAAK,WAAW,SAAS,eAAe,KAAK,UAAU,KAAK,IAAI,MAAM,KAAA;GACtE,KAAK,aAAa,eAAe,KAAK,WAAW,MAAM,IAAI,KAAK,WAAW,MAAM,KAAK,KAAA;GACtF,KAAK,YAAY,QAAQ,UAAU,KAAK,WAAW,UAAU,KAAA;EAC/D,CAAC,CAAC,QAAQ,UAA2B,QAAQ,KAAK,CAAC;EACnD,OAAO,MAAM,KAAK,GAAG,IAAI,KAAK,OAAO,IAAI,KAAK,UAAU,QAAQ,SAAS,IAAI,MAAM,QAAQ,KAAK,KAAK,MAAM;CAC7G,CAAC,CAAC,CACD,KAAK,IAAI;AACd;;AAGA,SAAgB,8BAA8B,WAAyD;CACrG,OAAO,OAAO,OAAO;EACnB,QAAQ;EACR,IAAI;EACJ,OAAO;EACP,OAAA;EACA,gBAAgB,oBAAoB,oBAAoB,UAAU,CAAC,CAAC;CACtE,CAAC;AACH;;;ACjEA,SAAS,gBAAgB,OAAe,KAAqB;CAC3D,IAAI,CAACA,UAAAA,QAAK,WAAW,KAAK,GAAG,OAAOA,UAAAA,QAAK,UAAU,KAAK;CACxD,MAAM,WAAWA,UAAAA,QAAK,SAAS,KAAK,KAAK;CAEzC,OAAO,YAAY,CAAC,SAAS,WAAW,IAAI,IAAI,WAAW;AAC7D;;AAGA,SAAgB,6BACd,cAA4D,QAAQ,KAChD;CACpB,OAAO;EACL;EACA,WAAW,QAAQ;EACnB,iBAAiBC,YAAAA;EACjB;CACF;AACF;;;ACZA,SAAS,OAAO,OAAsC;CACpD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,aAAa,OAAO,OAAO;CAE9E,OAAO;EAAE,SAAS,CAAC;GAAE,MAAM;GAAQ,MADtB,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,OAAO,MAAM,CAAC;EACtC,CAAC;EAAG,SAAS;CAAM;AAC7D;AAEA,SAAS,QAAQ,OAAsC;CACrD,OAAO;EAAE,SAAS,CAAC;GAAE,MAAM;GAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EAAE,CAAC;EAAG,SAAS;CAAK;AACpH;AAEA,eAAsB,cACpB,OACA,QACA,QACA,UAC+B;CAC/B,MAAM,EAAE,UAAU,UAAU,MAAM,MAAM,QAAQ,YAAY;EAC1D,MAAM,SAASC,gBAAAA,kBAAkB,SAAS,QAAQ,QAAQ,KAAA,GAAW,QAAQ;EAC7E,OAAO;GAAE,GAAIC,gBAAAA,eAAe,OAAO,EAAE,IAAI,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;GAAI,OAAO;EAAO;CAC9F,CAAC;CACD,IAAI,MAAM,GAAG,SAAS,SAAS,MAAM,IAAI,MAAM,MAAM,GAAG,OAAO;CAC/D,OAAOC,mBAAAA,gBAAgB,QAAQ,QAAQ,UAAU,MAAM,EAAE;AAC3D;AAUA,eAAe,gBACb,SACA,aACA,QACiC;CACjC,MAAM,SAAiC,CAAC;CACxC,KAAK,MAAM,CAAC,OAAO,eAAe,YAAY,QAAQ,GACpD,IAAI;EACF,MAAM,UAAU,MAAM,QAAQ,OAAO,WAAW,IAAI;GAClD,OAAO,WAAW;GAClB,aAAa,WAAW;GACxB,cAAc,WAAW;GACzB,eAAe,WAAW;GAC1B,eAAe,WAAW;GAC1B,OAAO,WAAW;GAClB,GAAI,WAAW,YAAY,UAAU,WAAW,YAAY,UAAU,EAAE,SAAS,WAAW,QAAQ,IAAI,CAAC;GACzG;EACF,CAAC;EACD,OAAO,KAAK;GAAE;GAAO,IAAI,WAAW;GAAI,OAAO,WAAW;GAAO,GAAG;EAAQ,CAAC;CAC/E,SAAS,OAAO;EACd,OAAO,KAAK;GAAE;GAAO,IAAI,WAAW;GAAI,OAAO,WAAW;GAAO,IAAI;GAAO,SAAS,OAAO,KAAK;EAAE,CAAC;CACtG;CAEF,OAAO;AACT;;AAGA,eAAsB,cACpB,OACA,SACA,UACA,WACA,QACA,UAC+B;CAC/B,IAAI,EAAA,GAACC,cAAAA,MAAAA,CAAMC,aAAAA,kBAAkB,SAAS,GAAG,OAAO,QAAQ,0BAA0B;CAClF,MAAM,SAAS;CACf,IAAI;EACF,KAAK,OAAO,WAAW,YAAY,OAAO,WAAW,aAAa,CAAC,SACjE,MAAM,IAAI,MAAM,iDAAiD;EACnE,IAAI,OAAO,WAAW,UAAU;GAC9B,IAAI,CAAC,OAAO,aAAa,QAAQ,MAAM,IAAI,MAAM,iDAAiD;GAClG,WACE,OAAO,cAAc,OAAO,YAAY,OAAO,OAAO,OAAO,YAAY,WAAW,IAAI,KAAK,IAAI,IAAI,CACvG;GACA,MAAM,QAAQ,MAAM,gBAAgB,SAAU,OAAO,aAAa,MAAM;GACxE,MAAM,WAAW,MAAM,QAAQ,SAAS,KAAK,EAAE,CAAC,CAAC,KAAK,SAAS,KAAK,EAAE;GACtE,MAAM,OAAOC,mBAAAA,wBAAwB,KAAK;GAC1C,IAAI,SAAS,WAAW,GAAG,MAAM,IAAI,MAAM,IAAI;GAC/C,OAAOC,mBAAAA,sBAAsB,QAA8B,MAAM,UAAU,MAAM;IAC/E;IACA,QAAQ,MAAM,SAAS,SAAS;GAClC,CAAC;EACH;EACA,IAAI,OAAO,WAAW,UAAU;GAC9B,MAAM,UAAU,MAAM,QAAS,OAAO,OAAO,MAAM,GAAU;GAC7D,IAAI,CAAC,QAAQ,IAAI,MAAM,IAAI,MAAM,QAAQ,OAAO;GAChD,OAAOC,mBAAAA,gBAAgB,UAAU,QAA8B,MAAM,UAAU,QAAQ,OAAO;EAChG;EACA,OAAO,cAAc,OAAO,OAAO,QAAyB,QAA8B,QAAQ;CACpG,SAAS,OAAO;EACd,OAAO,QAAQ,KAAK;CACtB;AACF;AAEA,SAAgB,uBACd,OAEA,SACA,UACyC;CACzC,OAAO;EACL,MAAM;EACN,OAAO;EACP,aAAa;EACb,YAAYH,aAAAA;EACZ,eAAe;EACf,eAAe;EACf,UAAU,aAAa,WAAW,QAAQ,aACxC,cAAc,OAAO,SAAS,UAAU,WAAW,QAAQ,QAAQ;CACvE;AACF;;;ACrHA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgHrB,SAAgB,oBAAoB,SAAoD;CACtF,OAAO;EACL,MAAM;EACN,SACE;EACF,cAAc;EACd,KAAK,KAAK;GACR,IAAI,IAAI,cAAc,QAAQ,WAAW,MAAM,IAAI,MAAM,6CAA6C;GACtG,IAAI,WAAW;GACf,IAAI,gBAAgB;IAClB,WAAW;GACb,CAAC;GACD,MAAM,wBAA8B;IAClC,IAAI,OAAO,eAAe;IAC1B,IAAI,UAAU,MAAM,IAAI,MAAM,kCAAkC;IAChE,QAAQ,gBAAgB;GAC1B;GACA,MAAM,UAAmC,OAAO,OAAO,IAAI;GAC3D,QAAQ,WAAW,YAAmC;IACpD,gBAAgB;IAChB,MAAM,YAAY,QAAQ,MAAM;IAChC,MAAM,SAAoB,CAAC;IAC3B,MAAM,WAAW,MAAM,QAAQ,MAAM,gBAC7B,QACL,UAAU,OAAO,KAAK,KAAK,CAC9B;IACA,gBAAgB;IAChB,IAAI,QAAQ,MAAM,cAAc,WAAW,MAAM,IAAI,MAAM,0CAA0C;IACrG,IAAI,OAAO,SAAS,GAAG,MAAM,IAAI,MAAM,8BAA8B,EAAE,OAAO,OAAO,GAAG,CAAC;IACzF,OAAO,KAAK,MAAM,KAAK,UAAU,QAAQ,CAAC;GAC5C;GACA,MAAM,QAAQ,OAAO,WAAoC;IACvD,gBAAgB;IAChB,MAAM,UAAU,KAAK,IAAI;IACzB,MAAM,SAAS,MAAM,cAAc,QAAQ,OAAO,QAAQ,SAAS,QAAQ,UAAU,QAAQ,IAAI,MAAM;IACvG,gBAAgB;IAChB,MAAM,UAAU,OAAO,QAAQ,SAAS,SAAU,KAAK,SAAS,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAE,CAAC,CAAC,KAAK,IAAI;IACrG,MAAM,SAAU,OAAO,SAA4E;IACnG,MAAM,UACJ,OAAO,WAAY,UAAU,OAAO,QAAQ,WAAW,KAAK,OAAO,SAAS,IAAK,UAAU,KAAA;IAE7F,IAAI,SAAS;KACX,MAAM,SAAS,OAAO,OAAO,MAAM;KACnC,MAAM;KACN,MAAM;KACN,IAAI,YAAY,KAAA;KAChB,IAAI,KAAK,IAAI,IAAI;KACjB,GAAI,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,QAAQ;KAClD,QAAQ;MAAE,SAAS,OAAO;MAAS,SAAS,OAAO;KAAQ;IAC7D,CAAC;IACD,IAAI,YAAY,KAAA,GAAW,MAAM,IAAI,MAAM,OAAO;IAClD,OAAO;KACL;KACA,UAAU,KAAK,MAAM,KAAK,UAAU,QAAQ,MAAM,QAAQ,CAAC;KAC3D,GAAI,SAAS;MAAE,SAAS,OAAO;MAAS,QAAQ,OAAO;KAAO,IAAI,CAAC;IACrE;GACF;GACA,QAAQ,UAAU,UAAmB,MAAM;IAAE,QAAQ;IAAU;GAAM,CAAC;GACtE,QAAQ,UAAU,OAAgB,MAAM;IAAE,QAAQ;IAAU;GAAG,CAAC;GAChE,QAAQ,cAAc,MAAM,EAAE,QAAQ,QAAQ,CAAC;GAC/C,QAAQ,UAAU,gBAAyB,MAAM;IAAE,QAAQ;IAAU;GAAY,CAAC;GAClF,QAAQ,UAAU,OAAgB,MAAM;IAAE,QAAQ;IAAU;GAAG,CAAC;GAChE,OAAO;EACT;CACF;AACF;;;;ACtLA,MAAa,qBAAqB;;;AC+BlC,MAAM,SAAS;;AAGf,SAAS,WAAW,SAAyB;CAC3C,OAAO,QAAQ,MAAM,IAAI,CAAC,CAAC,MAAM,SAAS,KAAK,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK;AACvE;AAEA,MAAM,QAAA,GAAOI,iCAAAA,WAAAA,EAAY,EAAE,MAAM,YAAY,OAAO,MAAM,QAAQ,mBAA0C;CAC1G,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,0CAA0C;CACrE,MAAM,YAAY,KAAK;CACvB,IAAI,WAAW,QAAQ,iBAAiB,KAAA,GACtC,MAAM,IAAI,MAAM,2DAA2D;CAC7E,MAAM,eAAe,WAAW,QAAQ;CACxC,MAAM,WAAWC,yBAAAA,wBAAwB;EAAE,KAAK,UAAU;EAAK,KAAK,UAAU;CAAY,CAAC;CAC3F,MAAM,SAASC,yBAAAA,kBAAkB,QAAQ;CACzC,IAAI,SAAS;CACb,IAAI,WAAW;CACf,IAAI,aAAa;CACjB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI,UAAyB,QAAQ,QAAQ;CAC7C,IAAI,eAAe,IAAI,gBAAgB;CACvC,MAAM,kBAAA,GAAiBC,6BAAAA,6BAAAA,CAA6B,EAClD,SAAS,iBACP,UAAU,OAAO,OAAO;EACtB,MAAM,aAAa,OAAO,WAAW,aAAa,YAAY,KAAK,IAAI;EACvE,OAAO;CACT,CAAC,EACL,CAAC;CACD,MAAM,gBAAsB;EAC1B,IAAI,CAAC,UAAU,UAAU;EACzB,UAAU,OAAO,UAAU,QAAQ,UAAU,MAAM,SAAS,MAAM,QAAQ;EAC1E,YAAY,OAAO;CACrB;CACA,MAAM,2BAAiC;EACrC,IAAI,CAAC,UAAU,YAAY,CAAC,qBAAqB,YAAY;EAC7D,aAAa,kBAAkB,SAAS;GACtC,UAAUC,mBAAAA;GACV,sBAAuB,UAAU,CAAC,WAAW,QAAQ,eAAe,IAAI,CAAC;EAC3E,CAAC;CACH;CACA,MAAM,WAAWC,eAAAA,YAAY,UAAU,WAAW;CAClD,MAAM,QAAQ,IAAIC,kBAAAA,UAAU;EAC1B,KAAK,UAAU;EACf,KAAK,UAAU;EACf;CACF,CAAC;CACD,MAAM,iBAAiBC,cAAAA,kBAAkB,UAAU,WAAW,UAAU,WAAW,CAAC;CACpF,IAAI,gBAA+B,QAAQ,QAAQ;CACnD,MAAM,UAAU,IAAIC,mBAAAA,kBAAkB;EACpC;EACA,KAAK,UAAU;EACf,UAAU,6BAA6B,UAAU,WAAW;EAC5D,oBAAoB,UAAU;EAC9B;EACA,SAAS,SAAS,YAAY;GAC5B,MAAM,gBAAgB;GACtB,MAAM,kBAA2B,UAAU,CAAC,YAAY,CAAC,cAAc,WAAW,eAAe;GAkBjG,gBAAgB,cACb,KAAK,YAAY;IAChB,IAAI,CAAC,UAAU,GAAG;IAClB,MAAM,UAAU,OAAO,OAAO;KAAE,MAAM,WAAW,QAAQ,OAAO;KAAG,OAAO;IAAO,CAAC;IAClF,IAAI,CAAC,UAAU,GAAG;IAClB,MAAM,UAAU,QAAQ,kBAAkB,QAAQ,YAAY,EAAE,SAAS,QAAQ,QAAQ,CAAC;IAK1F,IAAI,CAAC,UAAU,KAAK,SAAS,gBAAgB,OAAO;IAKpD,IAAI,CAAC,UAAU,QAAQ,aAAa,MAAM,IAAI,MAAM,+CAA+C;IACnG,MAAM,UAAU,QAAQ,YAAY,QAAQ,SAAS,OAAO;GAC9D,CAAC,CAAC,CACD,OAAO,UAAmB;IAIzB,IAAI,UAAU,GAAG,UAAe,OAAO,OAAO;KAAE,MAAM,OAAO,KAAK;KAAG,OAAO;IAAU,CAAC;GACzF,CAAC;EACL;EACA,UAAU;EACV,cAAcC,eAAAA,uBAAuB,UAAU,WAAW;EAC1D,gBAAgB,OAAO,WAAW;GAChC,SAAc,wBAAwB,OAAO,MAAM;GACnD,IAAI,UAAU,CAAC,UAAU,UAAe,OAAO,OAAO;IAAE,MAAM,OAAO,KAAK;IAAG,OAAO;GAAU,CAAC;EACjG;CACF,CAAC;CACD,OAAO;EACL,OAAO;GAAE;GAAO;GAAS;EAAS;EAClC,UAAU,EACP,wBAAiC;GAChC,iBAAiB;GACjB,MAAM,YAAY,oBAAoB;IACpC;IACA;IACA;IACA,WAAW,UAAU;IACrB,uBAAuB;KACrB,IAAI,CAAC,UAAU,YAAY,cAAc,SAAS,MAAM,IAAI,MAAM,8BAA8B;IAClG;GACF,CAAC;GACD,oBAAoB,OAAO,CAACC,4BAAAA,mBAAmB,IAAI,YAAY;IAC7D,MAAM,YAAA,GAAWC,4BAAAA,eAAAA,CAAe,OAAO;IACvC,IAAI,CAAC,UAAU,OAAO,KAAA;IACtB,MAAM,eAAe,SAAS,SAAS,QAAQ,SAAS;IAExD,MAAM,cAAc,KAAK,wBAAwB,EAAE,eAAe,CAAC,MAAM,EAAE,CAAC;IAC5E,aAAa;KACX,YAAY,QAAQ;KACpB,aAAa,QAAQ;IACvB;GACF,CAAC;GACD,oBAAoB,OAAO,CAACC,wCAAAA,gCAAgC,IAAI,YAAY;IAC1E,MAAM,gBAAA,GAAeC,wCAAAA,8BAAAA,CAA8B,OAAO,CAAC,CAAC,SAC1D,oCAAqC,UAAU,CAAC,WAAW,MAAM,SAAS,QAAQ,CAAC,CAAE,CACvF;IACA,aAAa,aAAa,QAAQ;GACpC,CAAC;GACD,oBAAoB,OAAO,CAACC,kCAAAA,0BAA0B,IAAI,YAAY;IACpE,MAAM,WAAA,GAAUC,kCAAAA,4BAAAA,CAA4B,OAAO;IACnD,IAAI,CAAC,SAAS,OAAO,KAAA;IACrB,oBAAoB;IACpB,mBAAmB;IACnB,aAAa;KACX,IAAI,sBAAsB,SAAS;KACnC,YAAY,QAAQ;KACpB,aAAa,KAAA;KACb,oBAAoB,KAAA;IACtB;GACF,CAAC;GACD,oBAAoB,OAAO,CAACC,8BAAAA,qBAAqB,IAAI,mBAAmB;IACtE,MAAM,WAAA,GAAUC,8BAAAA,wBAAAA,CAAwB,cAAc;IACtD,IAAI,SAAS,OAAO,QAAQ,KAAK,gBAAgB,OAAO;GAE1D,CAAC;EACH,CACF;EACA,YAAY,CACV;GACE,MAAM;GACN,MAAM,MAAM,iBAAiB;IAC3B,IAAI,UAAU,MAAM,IAAI,MAAM,2BAA2B;IACzD,SAAS;IACT,MAAM,gBAAgB,EAAE;IACxB,aAAa,MAAM;IACnB,MAAM,aAAa,IAAI,gBAAgB;IACvC,eAAe;IACf,MAAM,QAAQ,WAAW,CAAC,OAAO,CAAC;IAyDlC,YAxDqB,mBAAA,GAAkBC,6BAAAA,2BAAAA,CAA2B,cAAc,MAAM,eAAA,CAC3D,MAAM,QAAQ,GAAG,UAAU,UAAU,GAAG,iBAAiB,OAAO,WAAW;KACpG,MAAM,kBACJ,CAAC,YACD,CAAC,cAAc,WACf,UACA,eAAe,iBACf,CAAC,OAAO,WACR,CAAC,WAAW,OAAO;KACrB,MAAM,cAAwB,CAAC;KAC/B,MAAM,UAAU,OAAO,OAAe,cAAqD;MACzF,IAAI;OACF,MAAM,UAAU;MAClB,SAAS,OAAO;OACd,YAAY,KAAK,QAAQ,MAAM,WAAW,OAAO,KAAK,GAAG;OACzD,OAAO,KAAKC,kBAAAA,WAAW,sBAAsB,OAAO,EAAE,cAAc,MAAM,CAAC;MAC7E;KACF;KACA,IAAI;MACF,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,OAAO,KAAA,EAAU;MAC5C,MAAM,iBAAiBZ,cAAAA,kBAAkB,gBAAgB,WAAW,gBAAgB,WAAW,CAAC;MAChG,QAAQ,OAAO,gBAAgB,GAAG;MAClC,MAAM,UAAU,MAAMa,cAAAA,gCAAgC,MAAM,WAAW,gBAAgB,GAAG;MAC1F,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,OAAO,KAAA,EAAU;MAC5C,MAAM,QAAQC,cAAAA,qBAAqB,gBAAgB,WAAW,IAC1D,EAAE,QAAQ,CAAC,EAAE,IACb,MAAMC,cAAAA,qBAAqB,MAAM,WAAWC,eAAAA,cAAc,gBAAgB,WAAW,CAAC;MAC1F,KAAK,MAAM,SAAS,CAAC,GAAG,QAAQ,QAAQ,GAAG,MAAM,MAAM,GAAG;OACxD,YAAY,KAAK,KAAK;OACtB,OAAO,KAAKJ,kBAAAA,WAAW,kBAAkB,IAAI,MAAM,KAAK,CAAC;MAC3D;MACA,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,OAAO,KAAA,EAAU;MAC5C,MAAM,QAAQ,cAAc,YAAY;OAEtC,MAAM,SAAoB,CAAC;OAC3B,MAAM,MAAM,UAAU,YAAY,UAAU,OAAO,KAAK,KAAK,CAAC;OAC9D,IAAI,OAAO,SAAS,GAAG,MAAM,IAAI,MAAM,OAAO,OAAO,EAAE,GAAG,EAAE,OAAO,OAAO,GAAG,CAAC;MAChF,CAAC;MACD,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,OAAO,KAAA,EAAU;MAC5C,UAAU;MACV,UAAU,MAAM,uBAAuB;OACrC,QAAQ;OACR,IAAI,UAAU,GAAG,aAAa,QAAQ,oBAAoB,UAAU,WAAW,MAAM,QAAQ;MAC/F,CAAC;MACD,MAAM,QAAQ,mBAAmB,QAAQ,UAAU,SAAS,CAAC;MAC7D,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,OAAO,KAAA,EAAU;MAC5C,mBAAmB;MACnB,QAAQ;MACR,aAAa,QAAQ,oBAAoB,UAAU,WAAW,MAAM,QAAQ;MAC5E,OAAO;OAAE,OAAO,KAAA;OAAW;MAAY;KACzC,SAAS,OAAO;MACd,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,OAAO,KAAA,EAAU;MAC5C,OAAO,MAAMA,kBAAAA,WAAW,oBAAoB,KAAK;MACjD,MAAM;KACR;IACF,CACe,CAAC,CAAC,KAAK;IAEtB,MAAM,QAAQ,WAAW,CAAC,OAAO,CAAC;IAClC,aAAa;KACX,IAAI,kBAAkB,YAAY;KAClC,SAAS;KACT,cAAc;KACd,WAAW,MAAM;KACjB,UAAU;KACV,UAAU,KAAA;KACV,YAAY,QAAQ;KACpB,aAAa,KAAA;KACb,QAAQ,MAAM;KACd,UAAU,OAAO,UAAU,QAAQ,KAAA,CAAS;IAC9C;GACF;EACF,CACF;EACA,MAAM,YAAY;GAChB,IAAI,UAAU;GACd,WAAW;GACX,SAAS;GACT,cAAc;GACd,aAAa,MAAM;GACnB,MAAM,QAAQ,WAAW,CAAC,OAAO,CAAC;GAClC,OAAA,GAAMK,iCAAAA,YAAAA,CACJ;UACQ,UAAU;UACV,YAAY,QAAQ;UACpB,QAAQ,QAAQ;UAChB,MAAM,QAAQ;UACd,eAAe,QAAQ;UACvB,SAAS,SAAS;GAC1B,GACA,sBACF;EACF;CACF;AACF,CAAC;;;ACpSD,IAAA,uBAAA,GAAeC,iCAAAA,WAAAA,CAAWC,IAAY;;;ACatC,SAAS,eAAe,OAAuC;CAC7D,OACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAAuB,QAAQ,YACvC,MAAM,QAAS,MAAuB,KAAK;AAE/C;AAOA,SAAS,QAAQ,UAAyC;CAsBxD,OAAO;EAAE,OArBgB,SAAS,MAAM,SAAS,SAAS;GACxD,IAAI,KAAK,WAAW,WAAW,OAAO,CAAC;GACvC,MAAM,OAAgB;IACpB,IAAI,KAAK;IACT,SAAS,KAAK;IACd,QAAQ,KAAK;IACb,WAAW,KAAK,aAAa,CAAC;GAChC;GACA,IAAI,KAAK,aAAa,KAAK,cAAc,KAAK;GAC9C,IAAI,KAAK,YAAY,KAAK,aAAa,KAAK;GAC5C,IAAI,KAAK,OAAO,KAAK,QAAQ,KAAK;GAClC,IAAI,KAAK,WAAW,KAAK,YAAY,KAAK;GAC1C,IAAI,KAAK,YACP,KAAK,aAAa;IAChB,GAAI,KAAK,WAAW,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,KAAK,WAAW,MAAM;IAC9E,GAAI,KAAK,WAAW,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,KAAK,WAAW,SAAS;IACvF,GAAI,KAAK,WAAW,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,KAAK,WAAW,MAAM;GAChF;GAEF,OAAO,CAAC,IAAI;EACd,CACa;EAAG,KAAK,SAAS;CAAI;AACpC;;AAGA,SAAgB,mBAAmB,UAA+B,CAAC,GAAiB;CAClF,OAAO;EACL,WAAW;EACX,MAAM,MAAM;GACV,MAAM,yBAAS,IAAI,IAAwF;GAC3G,MAAM,QAAQ,UAAmC;IAC/C,IAAI,OAAO,IAAI,MAAM,SAAS,GAAG;IACjC,IAAI,QAAQ,QAAQ,WAAW,KAAK;IACpC,IAAI,UAAU,KAAA,GAAW;KACvB,IAAI,MAAM,gBAAgB,KAAA,GACxB,MAAM,IAAI,MAAM,8DAA8D,MAAM,UAAU,GAAG;KACnG,QAAQ,IAAIC,kBAAAA,UAAU;MACpB,KAAK,MAAM;MACX,KAAK,MAAM;MACX,WAAWC,cAAAA,iBACT,MAAM,KACN,MAAM,aACNC,cAAAA,kBAAkB,MAAM,WAAW,MAAM,WAAW,CACtD;KACF,CAAC;IACH;IACA,MAAM,KAAK;IACX,MAAM,SAAS;KAAE;KAAO,mBAAmB,KAAA;IAAkB;IAC7D,OAAO,IAAI,MAAM,WAAW,MAAM;IAClC,OAAO,cAAc,KAAK,aAAa,UACrC,oBACA,MAAM,YACL,YAAY;KACX,IAAI,CAAC,eAAe,OAAO,GAAG;KAC9B,MAAM,UAAU,OAAO,IAAI,MAAM,SAAS;KAC1C,IAAI,YAAY,KAAA,GAAW;KAC3B,QAAQ,SAAS;KACjB,KAAK,QAAQ,MAAM,WAAW,QAAQ,OAAO,CAAC;IAChD,GACA,EAAE,cAAc,KAAK,CACvB;GACF;GACA,MAAM,SAAS,cAA4B;IACzC,MAAM,SAAS,OAAO,IAAI,SAAS;IACnC,IAAI,CAAC,QAAQ;IACb,OAAO,YAAY;IACnB,OAAO,MAAM,QAAQ;IACrB,OAAO,OAAO,SAAS;GACzB;GACA,KAAK,MAAM,SAAS,KAAK,SAAS,GAAG,KAAK,KAAK;GAkE/C,OAAO;IA/DL,QAAQ,OAAuB;KAC7B,KAAK,KAAK;KACV,MAAM,SAAS,OAAO,IAAI,MAAM,SAAS;KACzC,MAAM,WAAW,QAAQ,UAAU,QAAQ,MAAM;KACjD,IAAI,CAAC,UAAU,OAAO;MAAE,UAAU;MAAe,UAAU,CAAC;KAAE;KAC9D,MAAM,OAAOA,cAAAA,kBAAkB,MAAM,WAAW,MAAM,eAAe,CAAC,CAAC;KACvE,MAAM,SAAA,GAAQC,YAAAA,WAAAA,CAAW,QAAQ,CAAC,CAC/B,OAAOF,cAAAA,iBAAiB,MAAM,KAAK,MAAM,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC,CAClE,OAAO,KAAK;KAEf,IAAI,SAAS,MAAM,SAASG,8BAAAA,mBAAmB,OAAO;MAAE,UAAU;MAAW,UAAU,CAAC;KAAE;KAC1F,MAAM,WAAW,KAAK,SAAS;KAC/B,IAAI,SAAS,SAASA,8BAAAA,mBAAmB,OAAO;MAAE,UAAU;MAAW,UAAU,CAAC;KAAE;KACpF,MAAM,uBAAO,IAAI,IAAI,CAAC,IAAI,CAAC;KAC3B,KAAK,MAAM,aAAa,UAAU;MAChC,MAAM,gBAAgBF,cAAAA,kBAAkB,UAAU,WAAW,UAAU,eAAe,CAAC,CAAC;MACxF,IACED,cAAAA,iBAAiB,UAAU,KAAK,UAAU,eAAe,CAAC,GAAG,aAAa,MAC1EA,cAAAA,iBAAiB,MAAM,KAAK,MAAM,eAAe,CAAC,GAAG,IAAI,GAEzD,KAAK,IAAI,UAAU,SAAS;MAC9B,IAAI,KAAK,OAAO,IAAI,OAAO;OAAE,UAAU;OAAW,UAAU,CAAC;MAAE;KACjE;KACA,KAAK,MAAM,QAAQ,SAAS,OAAO;MACjC,IAAI,KAAK,YAAY,WAAW,KAAK,IAAI,KAAK,WAAW,SAAS;MAClE,IAAI,KAAK,OAAO,IAAI,OAAO;OAAE,UAAU;OAAW,UAAU,CAAC;MAAE;MAC/D,KAAK,KAAK,WAAW,UAAU,KAAKG,8BAAAA,mBAAmB,OAAO;OAAE,UAAU;OAAW,UAAU,CAAC;MAAE;KACpG;KACA,MAAM,QAAQ,SAAS,MAAM,QAAQ,SAAS,KAAK,WAAW,SAAS;KACvE,OAAO;MACL,UAAU,MAAM,SAASA,8BAAAA,oBAAoB,YAAY;MACzD,UAAU,MAAM,MAAM,GAAGA,8BAAAA,iBAAiB,CAAC,CAAC,KAAK,UAAU;OACzD,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,GAAG,KAAK,aAAa;OAC7C,MACE,KAAK,WAAW,WACZ,YACA,KAAK,WAAW,cACd,cACAC,kBAAAA,UAAU,SAAS,OAAO,IAAI,IAC5B,YACA,KAAK,WAAW,gBACd,YACA;OACZ,QAAQ,KAAK,QAAQ,KAAK,KAAK,OAAA,CAAQ,MAAM,GAAG,GAAG;OACnD,GAAI,KAAK,aAAa,KAAK,IAAI,EAAE,QAAQ,KAAK,YAAY,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC;OAC7E,WAAW,KAAK,aAAa,KAAK,8BAAa,IAAI,KAAK,CAAC,EAAA,CAAE,YAAY;OACvE,WAAW;OACX,mBAAmB,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ,OAAO,OAAO,IAAI;MACzD,EAAE;KACJ;IACF;IACA,WAAW,OAAO;KAChB,KAAK,KAAK;KACV,MAAM,SAAS,OAAO,IAAI,MAAM,SAAS;KACzC,MAAM,WAAW,QAAQ,UAAU,QAAQ,MAAM;KACjD,OAAO,aAAa,KAAA,IAAY,KAAA,IAAY,QAAQ,QAAQ;IAC9D;IACA,cAAc;IACd,gBAAgB;IAChB,QAAQ;KACN,KAAK,MAAM,aAAa,OAAO,KAAK,GAAG,MAAM,SAAS;IACxD;GAEU;EACd;CACF;AACF;;;ACtKA,IAAA,6BAAA,GAAeC,iCAAAA,cAAAA,CAAcC,kBAAY;;;ACIzC,IAAA,0BAAgB,aAA+D;CAC7E,MAAMC,aAAAA;CACN,aAAa;CACb,MAAM,QAAQ,MAAc,gBAA4C;EACtE,MAAM,SAAS,KAAK,KAAK,MAAM,UAAU,UAAU;EAEnD,MAAM,WAAU,MADO,cAAc,QAAQ,KAAK,OAAO,QAAQ,EAAE,OAAO,GAAG,QAAQ,KAAK,QAAQ,EAAA,CACzE,QAAQ;EACjC,MAAM,eAAe,OAAO,OAAO;GACjC,MAAM,SAAS,SAAS,SAAS,QAAQ,OAAO;GAChD,OAAO;EACT,CAAC;CACH;AACF;;;AChBA,IAAA,wBAAA,GAAeC,iCAAAA,oBAAAA,CAAoBC,sBAAY;;;ACD/C,IAAA,uCAAA,GAAeC,iCAAAA,eAAAA,CAAe;CAC5B,MAAM;CACN,aACE;CACF,MAAM;CACN,QAAQ;CACR,OAAA,GAAMC,gCAAAA,oBAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,MAAqC,2CAA2C;CACtF,aAAA,GAAYC,gCAAAA,oBAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,MAAqC,2CAA2C;AAC9F,CAAC;;;ACLD,IAAA,+BAAgB,aAA+D;CAC7E,MAAM;CACN,MAAM;;;;;;;CAON,YAAY;EACV,MAAM,WAAW,oBAAoB,oBAAoB,QAAQ,KAAK,MAAM,SAAS,KAAK,CAAC;EAC3F,OAAO,aAAa,sBAAsB,KAAK;CACjD;AACF;;;ACfA,IAAA,6BAAA,GAAeC,iCAAAA,eAAAA,CAAeC,2BAAY;;;ACE1C,IAAA,yBAAA,GAAeC,iCAAAA,iBAAAA,EAAkB,YAC/B,uBAAuB,QAAQ,KAAK,OAAO,QAAQ,KAAK,SAAS,QAAQ,KAAK,QAAQ,CACxF;;;ACJA,IAAA,uBAAA,GAAeC,iCAAAA,iBAAAA,CAAiBC,qBAAY;;;ACS5C,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;;AAEpE,MAAM,WAAc,WAClB,OAAO,QAAQ,UAAsB,UAAU,KAAA,CAAS;AAC1D,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAa,gBAAA,GAAeC,gCAAAA,mBAAAA,CAAmB;CAC7C,MAAM;CACN,oBAAA,GAAmBC,gCAAAA,+BAAAA,CAA+BC,mBAAW;CAC7D,UAAA,GAASC,iCAAAA,mBAAAA,CAAmB,EAAE,SAAS,CAACD,mBAAW,EAAE,CAAC;CACtD,SAAS,aAAa,EACpB,IAAI,WAA8C;EAAE,OAAO,OAAO,IAAI,EAAE,WAAW,aAAa,GAAG,GAAGE,2BAAkB,OAAO,CAAC,CAAC;CAAG,EACtI;CACA,YAAY,aAAa,EACvB,IAAI,WAA8C;EAAE,OAAO,QAAQ,CAAC,QAAQ,OAAO,QAAQ,IAAI,KAAA,UAAkB,IAAI,EAAE,WAAW,aAAa,GAAG,GAAGA,2BAAkB,OAAO,CAAC,CAAC,CAAC;CAAG,EACtL;CACA,SAAS,OAAO,YAAY;EAC1B,MAAM,eAAe,MAAM,QAAQ,UAAU,WAAWF,qBAAa,OAAO;EAC5E,MAAM,iBAAiB;GAAE,GAAG;GAAS,MAAM,aAAa;EAAM;EAC9D,OAAO;GACL,IAAA,GAAGG,iCAAAA,iBAAAA,CAAiB,YAAY;GAChC,IAAI,WAA8C;IAAE,OAAO,QAAQ,CAAC,QAAQ,OAAO,QAAQ,IAAI,KAAA,UAAkB,IAAI,EAAE,WAAW,aAAa,GAAG,GAAGD,2BAAkB,OAAO,CAAC,CAAC,CAAC;GAAG;GACpL,IAAI,WAA8C;IAAE,OAAO,CAAC,IAAI,EAAE,MAAM,QAAQ,GAAG,GAAGE,sBAAc,cAAc,CAAC,CAAC;GAAG;GACvH,IAAI,YAAgD;IAAE,OAAO,CAAC,GAAGC,qCAA2B,cAAc,GAAG,GAAGC,2BAAmB,cAAc,CAAC;GAAG;GACrJ,IAAI,QAAwC;IAAE,OAAO,CAAC,IAAI,EAAE,MAAM,OAAO,GAAG,GAAGC,qBAAU,cAAc,CAAC,CAAC;GAAG;GAC5G,UAAU,CAAC,GAAI,aAAa,YAAY,CAAC,CAAE;GAC3C,IAAI,aAAkD;IAAE,OAAO,CAAC,GAAI,aAAa,cAAc,CAAC,CAAE;GAAG;EACvG;CACF;AACF,CAAC"}
|
|
@@ -764,7 +764,7 @@ var tasks_server_default = defineServerCommand(tasks_server_default$1);
|
|
|
764
764
|
//#region src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-task.server.ts
|
|
765
765
|
var codemode_how_to_task_server_default = defineResource({
|
|
766
766
|
name: "codemode-how-to-task",
|
|
767
|
-
description: "
|
|
767
|
+
description: "Keep a plan that survives compaction and delegate parts of it to background subagents. Use for any multi-step plan, todo list, or delegation.",
|
|
768
768
|
kind: "skill",
|
|
769
769
|
pinned: true,
|
|
770
770
|
path: packageResourcePath(import.meta.url, "src/prompts/codemode-how-to-task/SKILL.md"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.mjs","names":["contribution","contribution","contribution","contribution","contribution","rootSession","channelTaskGraph","commandTasks","resourceCodemodeHowToTask","resourceTaskBoard","toolTask"],"sources":["../../src/services/contextContribution/index.ts","../../src/services/delegationPlatform/index.ts","../../src/services/taskTool/index.ts","../../src/services/taskNamespace/index.ts","../../src/types/webTasks.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/(backend)/channel/_lib/task-graph.ts","../../src/extensions/(backend)/channel/task-graph.server.ts","../../src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.server.ts","../../src/extensions/workspaces/sessions/(backend)/command/tasks.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-task.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/_lib/task-board.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/task-board.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/_lib/task.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/task.server.ts","../../generated/server.ts"],"sourcesContent":["import type { PoContextContribution } from '@agimon-ai/po-core/contextContributions';\n\nimport type { Task } from '../../models/task';\n\nexport const TASK_CONTEXT_CONTRIBUTION_SOURCE = '@agimon-ai/po-task';\nexport const TASK_CONTEXT_CONTRIBUTION_ID = 'active-tasks';\nexport const TASK_CONTEXT_CONTRIBUTION_LABEL = 'Active tasks';\nexport const TASK_CONTEXT_CONTRIBUTION_ORDER = 100;\n\ninterface TaskContextSnapshot {\n readonly id: number;\n readonly status: Task['status'];\n readonly subject: string;\n readonly activeForm?: string;\n readonly owner?: string;\n readonly blockedBy?: readonly number[];\n readonly delegation?: {\n readonly agent: string;\n readonly state: NonNullable<Task['delegation']>['state'];\n readonly error?: string;\n };\n}\n\nexport function activeTaskSnapshots(tasks: readonly Task[]): TaskContextSnapshot[] {\n return tasks\n .filter((task) => task.status === 'pending' || task.status === 'in_progress' || task.status === 'failed')\n .map((task) => ({\n id: task.id,\n status: task.status,\n subject: task.subject,\n ...(task.activeForm ? { activeForm: task.activeForm } : {}),\n ...(task.owner ? { owner: task.owner } : {}),\n ...(task.blockedBy?.length ? { blockedBy: task.blockedBy } : {}),\n ...(task.delegation\n ? {\n delegation: {\n agent: task.delegation.agent,\n state: task.delegation.state,\n ...(task.delegation.result?.error ? { error: task.delegation.result.error } : {}),\n },\n }\n : {}),\n }));\n}\n\nexport function formatTaskSnapshots(tasks: readonly TaskContextSnapshot[]): string {\n if (tasks.length === 0) return '(no active tasks)';\n return tasks\n .map((task) => {\n const details = [\n task.activeForm ? `active: ${task.activeForm}` : undefined,\n task.owner ? `owner: ${task.owner}` : undefined,\n task.blockedBy?.length ? `blocked by: ${task.blockedBy.join(', ')}` : undefined,\n task.delegation ? `delegation: ${task.delegation.agent} (${task.delegation.state})` : undefined,\n task.delegation?.error ? `error: ${task.delegation.error}` : undefined,\n ].filter((value): value is string => Boolean(value));\n return `- #${task.id} [${task.status}] ${task.subject}${details.length > 0 ? ` | ${details.join(' | ')}` : ''}`;\n })\n .join('\\n');\n}\n\n/** Builds Task's bounded, synchronous contribution from its in-memory store snapshot. */\nexport function createTaskContextContribution(readTasks: () => readonly Task[]): PoContextContribution {\n return Object.freeze({\n source: TASK_CONTEXT_CONTRIBUTION_SOURCE,\n id: TASK_CONTEXT_CONTRIBUTION_ID,\n label: TASK_CONTEXT_CONTRIBUTION_LABEL,\n order: TASK_CONTEXT_CONTRIBUTION_ORDER,\n snapshot: () => formatTaskSnapshots(activeTaskSnapshots(readTasks())),\n });\n}\n","import { randomUUID } from 'node:crypto';\nimport path from 'node:path';\n\nimport type { DelegationPlatform } from '../delegation';\n\nfunction formatBriefPath(entry: string, cwd: string): string {\n if (!path.isAbsolute(entry)) return path.normalize(entry);\n const relative = path.relative(cwd, entry);\n // Outside the run directory the original beats a `../../` chain.\n return relative && !relative.startsWith('..') ? relative : entry;\n}\n\n/** Supply Node-owned process and path facilities to the host-neutral manager. */\nexport function createNodeDelegationPlatform(\n environment: Readonly<Record<string, string | undefined>> = process.env,\n): DelegationPlatform {\n return {\n environment,\n processId: process.pid,\n createRequestId: randomUUID,\n formatBriefPath,\n };\n}\n","import type { PoHeadlessTool, PoHeadlessToolResult } from '@agimon-ai/po-core/headless';\nimport { Check } from 'typebox/value';\n\nimport type { TaskMutationParams } from '../../models/task';\nimport { TaskParamsSchema, type TaskParams, type TaskAssignmentParams } from '../../schemas/task';\nimport type { DelegationManager } from '../delegation';\nimport { applyTaskMutation, isCommittingOp, type ReducerAction } from '../reducer';\nimport { buildAssignmentResult, buildTextResult, buildToolResult, formatAssignmentResults } from '../taskResult';\nimport type { TaskStore } from '../taskStore';\n\nfunction output(value: unknown): PoHeadlessToolResult {\n if (typeof value === 'object' && value !== null && 'content' in value) return value as PoHeadlessToolResult;\n const text = typeof value === 'string' ? value : JSON.stringify(value, null, 2);\n return { content: [{ type: 'text', text }], details: value };\n}\n\nfunction failure(error: unknown): PoHeadlessToolResult {\n return { content: [{ type: 'text', text: error instanceof Error ? error.message : String(error) }], isError: true };\n}\n\nexport async function reducerAction(\n store: TaskStore,\n action: ReducerAction,\n params: TaskMutationParams,\n maxTasks: number,\n): Promise<PoHeadlessToolResult> {\n const { document, value } = await store.mutate((current) => {\n const result = applyTaskMutation(current, action, params, undefined, maxTasks);\n return { ...(isCommittingOp(result.op) ? { document: result.document } : {}), value: result };\n });\n if (value.op.kind === 'error') throw new Error(value.op.message);\n return buildToolResult(action, params, document, value.op);\n}\n\ninterface AssignmentItemResult {\n index: number;\n id: number;\n agent: string;\n ok: boolean;\n message: string;\n}\n\nasync function assignmentBatch(\n manager: DelegationManager,\n assignments: readonly TaskAssignmentParams[],\n signal?: AbortSignal,\n): Promise<AssignmentItemResult[]> {\n const result: AssignmentItemResult[] = [];\n for (const [index, assignment] of assignments.entries()) {\n try {\n const outcome = await manager.assign(assignment.id, {\n agent: assignment.agent,\n inlineAgent: assignment.inlineAgent,\n instructions: assignment.instructions,\n relevantFiles: assignment.relevantFiles,\n priorFindings: assignment.priorFindings,\n model: assignment.model,\n ...(assignment.context === 'fork' || assignment.context === 'fresh' ? { context: assignment.context } : {}),\n signal,\n });\n result.push({ index, id: assignment.id, agent: assignment.agent, ...outcome });\n } catch (error) {\n result.push({ index, id: assignment.id, agent: assignment.agent, ok: false, message: String(error) });\n }\n }\n return result;\n}\n\n/** One task action against the session store, shared by the `task` tool and the `tasks` code-mode namespace. */\nexport async function runTaskAction(\n store: TaskStore,\n manager: DelegationManager | undefined,\n maxTasks: number,\n rawParams: unknown,\n signal?: AbortSignal,\n onUpdate?: (result: PoHeadlessToolResult) => void,\n): Promise<PoHeadlessToolResult> {\n if (!Check(TaskParamsSchema, rawParams)) return failure('Invalid task parameters.');\n const params = rawParams as TaskParams;\n try {\n if ((params.action === 'assign' || params.action === 'cancel') && !manager)\n throw new Error('Delegation is not available on this connection.');\n if (params.action === 'assign') {\n if (!params.assignments?.length) throw new Error('assign requires a non-empty assignments[] array');\n onUpdate?.(\n output(`Delegating ${params.assignments.length} task${params.assignments.length === 1 ? '' : 's'}...`),\n );\n const items = await assignmentBatch(manager!, params.assignments, signal);\n const assigned = items.filter((item) => item.ok).map((item) => item.id);\n const text = formatAssignmentResults(items);\n if (assigned.length === 0) throw new Error(text);\n return buildAssignmentResult(params as TaskMutationParams, store.snapshot, text, {\n assigned,\n failed: items.length - assigned.length,\n });\n }\n if (params.action === 'cancel') {\n const outcome = await manager!.cancel(params.id ?? Number.NaN);\n if (!outcome.ok) throw new Error(outcome.message);\n return buildTextResult('cancel', params as TaskMutationParams, store.snapshot, outcome.message);\n }\n return reducerAction(store, params.action as ReducerAction, params as TaskMutationParams, maxTasks);\n } catch (error) {\n return failure(error);\n }\n}\n\nexport function createHeadlessTaskTool(\n store: TaskStore,\n /** Absent on remote MCP connections, which track tasks but never delegate. */\n manager: DelegationManager | undefined,\n maxTasks: number,\n): PoHeadlessTool<typeof TaskParamsSchema> {\n return {\n name: 'task',\n label: 'Task',\n description: 'Maintain a persistent task graph and delegate ready tasks to background agents.',\n parameters: TaskParamsSchema,\n promptSnippet: 'Track complex work persistently and delegate ready tasks',\n executionMode: 'serial',\n execute: (_toolCallId, rawParams, signal, onUpdate) =>\n runTaskAction(store, manager, maxTasks, rawParams, signal, onUpdate),\n };\n}\n","import type { PoCodemodeNamespace } from '@agimon-ai/po-core/codemode';\n\nimport type { TaskDocument } from '../../models/task';\nimport { runTaskAction } from '../taskTool';\nimport type { TaskNamespaceOptions } from './type';\n\nconst DECLARATIONS = `type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';\n\ntype DelegationState = 'requested' | 'running' | 'completed' | 'failed' | 'cancelled';\n\ninterface DelegationResult {\n status: string;\n output?: string;\n outputPath?: string;\n sessionFile?: string;\n error?: string;\n durationMs?: number;\n toolCount?: number;\n}\n\ninterface TaskDelegation {\n requestId: string;\n agent: string;\n identity?: string;\n state: DelegationState;\n sessionId?: string;\n pid?: number;\n runId?: string;\n model?: string;\n startedAt?: string;\n endedAt?: string;\n result?: DelegationResult;\n}\n\ninterface Task {\n id: number;\n subject: string;\n description?: string;\n activeForm?: string;\n status: TaskStatus;\n blockedBy?: number[];\n owner?: string;\n metadata?: Record<string, unknown>;\n createdAt?: string;\n updatedAt?: string;\n delegation?: TaskDelegation;\n}\n\ninterface TaskDocument {\n version: number;\n rev: number;\n nextId: number;\n tasks: Task[];\n}\ninterface TaskItem {\n /** Existing task id to change. Omit to create; an unknown id fails only that entry. */\n id?: number;\n /** Temporary name so a LATER entry in the same call can list it in blockedBy. Never stored. */\n ref?: string;\n /** Short and imperative. Required when creating. */\n subject?: string;\n /** The durable brief handed to a subagent on assign. */\n description?: string;\n /** Present-continuous label shown while in_progress, such as 'writing tests'. */\n activeForm?: string;\n status?: TaskStatus;\n /** For a NEW entry: task ids or earlier refs. */\n blockedBy?: (number | string)[];\n /** For an entry with an id: dependencies to add or remove. */\n addBlockedBy?: (number | string)[];\n removeBlockedBy?: (number | string)[];\n owner?: string;\n /** Merged into the task; a null value deletes that key. */\n metadata?: Record<string, unknown>;\n}\n\ninterface TaskAssignment {\n /** A pending, unblocked task. */\n id: number;\n /** Exact name from subagent({ action: 'agents' }). */\n agent: string;\n instructions?: string;\n /** Only files you actually read or located. */\n relevantFiles?: string[];\n /** Only verified facts, not directives. */\n priorFindings?: string;\n model?: string;\n context?: 'fresh' | 'fork';\n}\n\n/** What a write returns: the text the task tool would print, and the graph after the write. */\ninterface TaskWrite {\n message: string;\n document: TaskDocument;\n /** upsert only: ids that landed and how many entries failed. Nothing landing throws; a partial failure does not. */\n applied?: number[];\n failed?: number;\n}\ndeclare const tasks: {\n /** The whole task graph, tombstones included. Filter it in the script. */\n snapshot(): Promise<TaskDocument>;\n /**\n * Create or change tasks, applied in array order. Never mark a task completed while tests fail or the\n * work is partial: use failed, or keep it in_progress and add a task for the blocker in the same call.\n * Status flow is pending, in_progress, completed. failed is recoverable and deleted is a tombstone.\n */\n upsert(tasks: TaskItem[]): Promise<TaskWrite>;\n /** Tombstone one task. Refused while it has a running delegation. */\n delete(id: number): Promise<TaskWrite>;\n /** Remove every task. Refused while a delegation is running. */\n clear(): Promise<TaskWrite>;\n /** Hand ready tasks to background subagents. Batch independent tasks in one call. */\n assign(assignments: TaskAssignment[]): Promise<TaskWrite>;\n /** Cancel a task's running delegation. */\n cancel(id: number): Promise<TaskWrite>;\n};`;\n\n/** The owning session's task graph: `snapshot` reads without locking, the rest write through the same store as the `task` tool. */\nexport function createTaskNamespace(options: TaskNamespaceOptions): PoCodemodeNamespace {\n return {\n name: 'tasks',\n summary:\n 'The session task graph: tasks.snapshot() reads it, tasks.upsert/delete/clear change it, tasks.assign/cancel hand tasks to background subagents. Use it to track multi-step work.',\n declarations: DECLARATIONS,\n bind(run) {\n if (run.sessionId !== options.sessionId) throw new Error('Tasks namespace belongs to another session.');\n let disposed = false;\n run.onDispose(() => {\n disposed = true;\n });\n const assertAvailable = (): void => {\n run.signal.throwIfAborted();\n if (disposed) throw new Error('Tasks namespace run is disposed.');\n options.assertAvailable();\n };\n const members: Record<string, unknown> = Object.create(null);\n members.snapshot = async (): Promise<TaskDocument> => {\n assertAvailable();\n const storePath = options.store.storePath;\n const errors: unknown[] = [];\n const document = await options.store.readAsync(\n () => false,\n (error) => errors.push(error),\n );\n assertAvailable();\n if (options.store.storePath !== storePath) throw new Error('Task store path changed during snapshot.');\n if (errors.length > 0) throw new Error('Task snapshot read failed.', { cause: errors[0] });\n return JSON.parse(JSON.stringify(document)) as TaskDocument;\n };\n const write = async (params: Record<string, unknown>) => {\n assertAvailable();\n const started = Date.now();\n const result = await runTaskAction(options.store, options.manager, options.maxTasks, params, run.signal);\n assertAvailable();\n const message = result.content.flatMap((part) => (part.type === 'text' ? [part.text] : [])).join('\\n');\n const upsert = (result.details as { upsert?: { applied: number[]; failed: number } } | undefined)?.upsert;\n const failure =\n result.isError || (upsert && upsert.applied.length === 0 && upsert.failed > 0) ? message : undefined;\n // The `task` tool's card draws the call, from the same args and result the tool would have had.\n run.record?.({\n name: `tasks.${String(params.action)}`,\n tool: 'task',\n args: params,\n ok: failure === undefined,\n ms: Date.now() - started,\n ...(failure === undefined ? {} : { error: failure }),\n result: { content: result.content, details: result.details },\n });\n if (failure !== undefined) throw new Error(failure);\n return {\n message,\n document: JSON.parse(JSON.stringify(options.store.snapshot)) as TaskDocument,\n ...(upsert ? { applied: upsert.applied, failed: upsert.failed } : {}),\n };\n };\n members.upsert = (tasks: unknown) => write({ action: 'upsert', tasks });\n members.delete = (id: unknown) => write({ action: 'delete', id });\n members.clear = () => write({ action: 'clear' });\n members.assign = (assignments: unknown) => write({ action: 'assign', assignments });\n members.cancel = (id: unknown) => write({ action: 'cancel', id });\n return members;\n },\n };\n}\n","/** Browser-safe task view published by the cockpit hub channel. */\nexport const TASKS_CHANNEL_TYPE = 'task_graph';\n\nexport type WebTaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';\n\nexport interface WebTask {\n id: number;\n subject: string;\n description?: string;\n activeForm?: string;\n status: WebTaskStatus;\n blockedBy: number[];\n owner?: string;\n updatedAt?: string;\n delegation?: {\n agent?: string;\n identity?: string;\n state?: string;\n };\n}\n\nexport interface WebTasksPayload {\n tasks: WebTask[];\n rev: number;\n}\n","import {\n PO_BACKGROUND_WORK_SERVICE,\n readPoBackgroundWorkService,\n type BackgroundWorkProviderHandle,\n type PoBackgroundWorkService,\n} from '@agimon-ai/po-core/backgroundWork';\nimport { PO_CODEMODE_SERVICE, readPoCodemode } from '@agimon-ai/po-core/codemode';\nimport {\n PO_CONTEXT_CONTRIBUTIONS_SERVICE,\n requirePoContextContributions,\n} from '@agimon-ai/po-core/contextContributions';\nimport { PO_DELEGATION_SERVICE, readPoDelegationService } from '@agimon-ai/po-core/delegation';\nimport { defineRoot, runCleanups } from '@agimon-ai/po-core/extensionFile';\nimport { createPoReadinessCoordinator, readPoReadinessCoordinator } from '@agimon-ai/po-core/readiness';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { getDelegationTimeoutMs, getMaxTasks, getStoreTtlMs } from '../../../../../services/config';\nimport { createTaskContextContribution } from '../../../../../services/contextContribution';\nimport { BACKGROUND_WORK_PROVIDER, DelegationManager } from '../../../../../services/delegation';\nimport { createNodeDelegationPlatform } from '../../../../../services/delegationPlatform';\nimport { createTaskErrorReporter, toFailureReporter, TASK_EVENT } from '../../../../../services/logSinkTelemetry';\nimport {\n hasStorePathOverride,\n removeLegacyStoreDirectoryAsync,\n resolveSessionKey,\n sweepStoreFilesAsync,\n} from '../../../../../services/paths';\nimport { createTaskNamespace } from '../../../../../services/taskNamespace';\nimport { TaskStore } from '../../../../../services/taskStore';\nimport { TASKS_CHANNEL_TYPE } from '../../../../../types/webTasks';\n\nconst SOURCE = '@agimon-ai/po-task';\n\n/** The notification body: one line, since `client.notify` collapses the rest anyway. */\nfunction headlineOf(content: string): string {\n return content.split('\\n').find((line) => line.trim().length > 0) ?? content;\n}\n\nconst root = defineRoot(({ host: serverHost, agent: host, signal: pluginSignal }: PoServerPluginContext) => {\n if (!host) throw new Error('Task session requires the headless host.');\n const execution = host.context;\n if (serverHost.context.directEvents === undefined)\n throw new Error('Task server plugin requires the session direct event bus.');\n const directEvents = serverHost.context.directEvents;\n const reporter = createTaskErrorReporter({ cwd: execution.cwd, env: execution.environment });\n const report = toFailureReporter(reporter);\n let active = true;\n let disposed = false;\n let generation = 0;\n let unwatch: (() => void) | undefined;\n let backgroundService: PoBackgroundWorkService | undefined;\n let background: BackgroundWorkProviderHandle | undefined;\n let serviceContext: Context | undefined;\n let startup: Promise<void> = Promise.resolve();\n let startupAbort = new AbortController();\n const ownedReadiness = createPoReadinessCoordinator({\n notify: (notification) =>\n execution.client.notify({\n body: notification.error?.message ?? notification.diagnostics.join('; '),\n level: 'warning',\n }),\n });\n const refresh = (): void => {\n if (!active || disposed) return;\n execution.client.setStatus(SOURCE, `tasks: ${store.snapshot.tasks.length}`);\n background?.update();\n };\n const registerBackground = (): void => {\n if (!active || disposed || !backgroundService || background) return;\n background = backgroundService.register({\n provider: BACKGROUND_WORK_PROVIDER,\n listActiveWork: () => (active && !disposed ? manager.listActiveWork() : []),\n });\n };\n const maxTasks = getMaxTasks(execution.environment);\n const store = new TaskStore({\n cwd: execution.cwd,\n env: execution.environment,\n report,\n });\n store.configureSession(resolveSessionKey(execution.sessionId, execution.environment));\n let notifications: Promise<void> = Promise.resolve();\n const manager = new DelegationManager({\n store,\n cwd: execution.cwd,\n platform: createNodeDelegationPlatform(execution.environment),\n getSessionId: () => execution.sessionId,\n report,\n notify: (message, options) => {\n const ownGeneration = generation;\n const isCurrent = (): boolean => active && !disposed && !pluginSignal?.aborted && generation === ownGeneration;\n // `DelegationNotifier` is Pi's `sendMessage` shape, and the Pi extension\n // forwards it verbatim (`root.cli.ts`). A headless session has no such\n // single call, so the three jobs are done by hand:\n //\n // toast `client.notify` - operator-facing only, flattened to one\n // line and capped at 4096 chars, and the model never sees a\n // custom entry. It gets the headline, not the whole result.\n // transcript `session.appendCustomEntry` under the same custom type,\n // carrying the full multi-line content.\n // wake `session.admitPrompt(content, 'steer')` - the only call\n // that puts the completion in front of the model.\n // `session.prompt(_, 'steer')` is enqueue-only and parks the\n // message on an idle lane, which is why a finished subagent\n // used to leave the agent sitting idle.\n //\n // Sequenced so two delegations settling in the same tick each observe\n // settled lane state rather than racing.\n notifications = notifications\n .then(async () => {\n if (!isCurrent()) return;\n await execution.client.notify({ body: headlineOf(message.content), level: 'info' });\n if (!isCurrent()) return;\n await execution.session.appendCustomEntry(message.customType, { content: message.content });\n // `triggerTurn: false` has no faithful headless mapping - there is no\n // way to reach model context without starting or joining a turn - so\n // it stays a toast, as it is today. `DelegationManager` always sends\n // `true`, so this is defensive rather than live.\n if (!isCurrent() || options?.triggerTurn === false) return;\n // Matching the voice server plugin, which also refuses rather than degrading:\n // `session.prompt(_, 'steer')` is NOT a fallback here, because it is\n // enqueue-only and would park the message on an idle lane - the\n // original bug.\n if (!execution.session.admitPrompt) throw new Error('The session cannot admit a task notification.');\n await execution.session.admitPrompt(message.content, 'steer');\n })\n .catch((error: unknown) => {\n // Mirrors `onNotifyError` below. The delegation is already committed,\n // so a failed notification costs the model its wake-up, not the\n // result, and must not stall later notifications.\n if (isCurrent()) void execution.client.notify({ body: String(error), level: 'warning' });\n });\n },\n onChange: refresh,\n runTimeoutMs: getDelegationTimeoutMs(execution.environment),\n onNotifyError: (error, taskId) => {\n void reporter.recordNotificationError(error, taskId);\n if (active && !disposed) void execution.client.notify({ body: String(error), level: 'warning' });\n },\n });\n return {\n value: { store, manager, maxTasks },\n services: [\n (serviceContextOwner: Context) => {\n serviceContext = serviceContextOwner;\n const namespace = createTaskNamespace({\n store,\n manager,\n maxTasks,\n sessionId: execution.sessionId,\n assertAvailable: () => {\n if (!active || disposed || pluginSignal?.aborted) throw new Error('Task session is unavailable.');\n },\n });\n serviceContextOwner.inject([PO_CODEMODE_SERVICE], (context) => {\n const codemode = readPoCodemode(context);\n if (!codemode) return undefined;\n const registration = codemode.register(SOURCE, namespace);\n // The tasks namespace covers every task action, so the model gets one surface, not two.\n const restriction = host.registerToolRestriction({ excludedTools: ['task'] });\n return () => {\n restriction.dispose();\n registration.dispose();\n };\n });\n serviceContextOwner.inject([PO_CONTEXT_CONTRIBUTIONS_SERVICE], (context) => {\n const registration = requirePoContextContributions(context).register(\n createTaskContextContribution(() => (active && !disposed ? store.snapshot.tasks : [])),\n );\n return () => registration.dispose();\n });\n serviceContextOwner.inject([PO_BACKGROUND_WORK_SERVICE], (context) => {\n const service = readPoBackgroundWorkService(context);\n if (!service) return undefined;\n backgroundService = service;\n registerBackground();\n return () => {\n if (backgroundService !== service) return;\n background?.dispose();\n background = undefined;\n backgroundService = undefined;\n };\n });\n serviceContextOwner.inject([PO_DELEGATION_SERVICE], (serviceContext) => {\n const service = readPoDelegationService(serviceContext);\n if (service) return manager.bind(serviceContext, service);\n return undefined;\n });\n },\n ],\n activities: [\n {\n name: SOURCE,\n async start(activityContext) {\n if (disposed) throw new Error('Task session is disposed.');\n active = true;\n const ownGeneration = ++generation;\n startupAbort.abort();\n const controller = new AbortController();\n startupAbort = controller;\n await Promise.allSettled([startup]);\n const coordinator = (serviceContext && readPoReadinessCoordinator(serviceContext)) ?? ownedReadiness;\n const handle = coordinator.start(SOURCE, `${execution.sessionId}:${ownGeneration}`, async (signal) => {\n const isCurrent = (): boolean =>\n !disposed &&\n !pluginSignal?.aborted &&\n active &&\n generation === ownGeneration &&\n !signal.aborted &&\n !controller.signal.aborted;\n const diagnostics: string[] = [];\n const degrade = async (stage: string, operation: () => Promise<unknown>): Promise<void> => {\n try {\n await operation();\n } catch (error) {\n diagnostics.push(`Task ${stage} failed: ${String(error)}`);\n report.warn(TASK_EVENT.sessionStartDegraded, error, { 'task.stage': stage });\n }\n };\n try {\n if (!isCurrent()) return { value: undefined };\n store.configureSession(resolveSessionKey(activityContext.sessionId, activityContext.environment));\n manager.setCwd(activityContext.cwd);\n const cleanup = await removeLegacyStoreDirectoryAsync(store.storePath, activityContext.cwd);\n if (!isCurrent()) return { value: undefined };\n const sweep = hasStorePathOverride(activityContext.environment)\n ? { errors: [] }\n : await sweepStoreFilesAsync(store.storePath, getStoreTtlMs(activityContext.environment));\n for (const error of [...cleanup.errors, ...sweep.errors]) {\n diagnostics.push(error);\n report.warn(TASK_EVENT.storeSweepFailed, new Error(error));\n }\n if (!isCurrent()) return { value: undefined };\n await degrade('store_read', async () => {\n // Fail-open reads retain telemetry and report only this operation's failure.\n const errors: unknown[] = [];\n await store.readAsync(isCurrent, (error) => errors.push(error));\n if (errors.length > 0) throw new Error(String(errors[0]), { cause: errors[0] });\n });\n if (!isCurrent()) return { value: undefined };\n unwatch?.();\n unwatch = store.onExternalChange(() => {\n refresh();\n if (isCurrent()) directEvents.publish(TASKS_CHANNEL_TYPE, execution.sessionId, store.snapshot);\n });\n await degrade('reconcile', () => manager.reconcile(isCurrent));\n if (!isCurrent()) return { value: undefined };\n registerBackground();\n refresh();\n directEvents.publish(TASKS_CHANNEL_TYPE, execution.sessionId, store.snapshot);\n return { value: undefined, diagnostics };\n } catch (error) {\n if (!isCurrent()) return { value: undefined };\n report.error(TASK_EVENT.sessionStartFailed, error);\n throw error;\n }\n });\n startup = handle.wait();\n // Initialization failure is observable, but must not fail the session closed.\n await Promise.allSettled([startup]);\n return () => {\n if (ownGeneration !== generation) return;\n active = false;\n generation += 1;\n controller.abort();\n unwatch?.();\n unwatch = undefined;\n background?.dispose();\n background = undefined;\n manager.reset();\n execution.client.setStatus(SOURCE, undefined);\n };\n },\n },\n ],\n async onDispose() {\n if (disposed) return;\n disposed = true;\n active = false;\n generation += 1;\n startupAbort.abort();\n await Promise.allSettled([startup]);\n await runCleanups(\n [\n () => unwatch?.(),\n () => background?.dispose(),\n () => manager.dispose(),\n () => store.dispose(),\n () => ownedReadiness.dispose(),\n () => reporter.shutdown(),\n ],\n 'Task cleanup failed.',\n );\n },\n };\n});\n\nexport type TaskServerScope = Awaited<ReturnType<typeof root>>['value'];\nexport default root;\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/root.server';\n\nexport default defineRoot(contribution);\n","import { createHash } from 'node:crypto';\n\nimport { HOME_ENTITY_LIMIT, type HomeProjection } from '@agimon-ai/po-core/hubChannel';\nimport type { PoHubChannelSource, PoHubSessionScope, PoHubChannel } from '@agimon-ai/po-core/hubChannel';\n\nimport type { TaskDocument } from '../../../../models/task';\nimport { isBlocked } from '../../../../models/taskGraph';\nimport { resolveSessionKey, resolveStorePath } from '../../../../services/paths';\nimport { TaskStore } from '../../../../services/taskStore';\nimport { TASKS_CHANNEL_TYPE, type WebTask, type WebTasksPayload } from '../../../../types/webTasks';\n\ninterface TaskStoreSource {\n readonly snapshot: TaskDocument;\n read(): TaskDocument;\n dispose(): void;\n}\n\nfunction isTaskDocument(value: unknown): value is TaskDocument {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as TaskDocument).rev === 'number' &&\n Array.isArray((value as TaskDocument).tasks)\n );\n}\n\nexport interface TasksChannelOptions {\n /** Injectable for tests. The default opens the session tree's durable task store. */\n storeFor?: (scope: PoHubSessionScope) => TaskStoreSource;\n}\n\nfunction present(document: TaskDocument): WebTasksPayload {\n const tasks: WebTask[] = document.tasks.flatMap((task) => {\n if (task.status === 'deleted') return [];\n const view: WebTask = {\n id: task.id,\n subject: task.subject,\n status: task.status,\n blockedBy: task.blockedBy ?? [],\n };\n if (task.description) view.description = task.description;\n if (task.activeForm) view.activeForm = task.activeForm;\n if (task.owner) view.owner = task.owner;\n if (task.updatedAt) view.updatedAt = task.updatedAt;\n if (task.delegation) {\n view.delegation = {\n ...(task.delegation.agent === undefined ? {} : { agent: task.delegation.agent }),\n ...(task.delegation.identity === undefined ? {} : { identity: task.delegation.identity }),\n ...(task.delegation.state === undefined ? {} : { state: task.delegation.state }),\n };\n }\n return [view];\n });\n return { tasks, rev: document.rev };\n}\n\n/** Publishes each managed session's durable task graph and follows direct session commits. */\nexport function createTasksChannel(options: TasksChannelOptions = {}): PoHubChannel {\n return {\n frameType: TASKS_CHANNEL_TYPE,\n start(host) {\n const stores = new Map<string, { store: TaskStoreSource; unsubscribe: () => void; latest?: TaskDocument }>();\n const open = (scope: PoHubSessionScope): void => {\n if (stores.has(scope.sessionId)) return;\n let store = options.storeFor?.(scope);\n if (store === undefined) {\n if (scope.environment === undefined)\n throw new Error(`Task channel requires an admitted environment for session '${scope.sessionId}'.`);\n store = new TaskStore({\n cwd: scope.cwd,\n env: scope.environment,\n storePath: resolveStorePath(\n scope.cwd,\n scope.environment,\n resolveSessionKey(scope.sessionId, scope.environment),\n ),\n });\n }\n store.read();\n const source = { store, unsubscribe: () => undefined as void };\n stores.set(scope.sessionId, source);\n source.unsubscribe = host.directEvents.subscribe(\n TASKS_CHANNEL_TYPE,\n scope.sessionId,\n (payload) => {\n if (!isTaskDocument(payload)) return;\n const current = stores.get(scope.sessionId);\n if (current === undefined) return;\n current.latest = payload;\n host.publish(scope.sessionId, present(payload));\n },\n { replayLatest: true },\n );\n };\n const close = (sessionId: string): void => {\n const source = stores.get(sessionId);\n if (!source) return;\n source.unsubscribe();\n source.store.dispose();\n stores.delete(sessionId);\n };\n for (const scope of host.sessions()) open(scope);\n\n const source: PoHubChannelSource = {\n homeFor(scope): HomeProjection {\n open(scope);\n const source = stores.get(scope.sessionId);\n const document = source?.latest ?? source?.store.snapshot;\n if (!document) return { coverage: 'unavailable', entities: [] };\n const root = resolveSessionKey(scope.sessionId, scope.environment ?? {});\n const graph = createHash('sha256')\n .update(resolveStorePath(scope.cwd, scope.environment ?? {}, root))\n .digest('hex');\n // Do not process a truncated graph: dependencies and owners may be omitted.\n if (document.tasks.length > HOME_ENTITY_LIMIT) return { coverage: 'partial', entities: [] };\n const sessions = host.sessions();\n if (sessions.length > HOME_ENTITY_LIMIT) return { coverage: 'partial', entities: [] };\n const refs = new Set([root]);\n for (const candidate of sessions) {\n const candidateRoot = resolveSessionKey(candidate.sessionId, candidate.environment ?? {});\n if (\n resolveStorePath(candidate.cwd, candidate.environment ?? {}, candidateRoot) ===\n resolveStorePath(scope.cwd, scope.environment ?? {}, root)\n )\n refs.add(candidate.sessionId);\n if (refs.size > 65) return { coverage: 'partial', entities: [] };\n }\n for (const task of document.tasks) {\n if (task.delegation?.sessionId) refs.add(task.delegation.sessionId);\n if (refs.size > 65) return { coverage: 'partial', entities: [] };\n if ((task.blockedBy?.length ?? 0) > HOME_ENTITY_LIMIT) return { coverage: 'partial', entities: [] };\n }\n const tasks = document.tasks.filter((task) => task.status !== 'deleted');\n return {\n coverage: tasks.length > HOME_ENTITY_LIMIT ? 'partial' : 'ready',\n entities: tasks.slice(0, HOME_ENTITY_LIMIT).map((task) => ({\n id: `${graph}:${task.id}:${task.createdAt ?? ''}`,\n kind:\n task.status === 'failed'\n ? 'failure'\n : task.status === 'completed'\n ? 'completed'\n : isBlocked(document.tasks, task)\n ? 'blocked'\n : task.status === 'in_progress'\n ? 'running'\n : 'queued',\n title: (task.subject.trim() || 'Task').slice(0, 160),\n ...(task.description?.trim() ? { detail: task.description.slice(0, 320) } : {}),\n updatedAt: task.updatedAt ?? task.createdAt ?? new Date(0).toISOString(),\n sessionId: root,\n relatedSessionIds: [...refs].filter((id) => id !== root),\n })),\n };\n },\n payloadFor(scope) {\n open(scope);\n const source = stores.get(scope.sessionId);\n const document = source?.latest ?? source?.store.snapshot;\n return document === undefined ? undefined : present(document);\n },\n sessionAdded: open,\n sessionRemoved: close,\n close() {\n for (const sessionId of stores.keys()) close(sessionId);\n },\n };\n return source;\n },\n };\n}\n\nexport default createTasksChannel;\n","import { defineChannel } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/task-graph';\n\nexport default defineChannel(contribution);\n","import type { WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoHeadlessExecutionContext } from '@agimon-ai/po-core/headless';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { COMMAND_NAME } from '../../../../../../constants/task';\nimport { reducerAction } from '../../../../../../services/taskTool';\nimport type { TaskServerScope } from '../../_lib/root.server';\n\nexport default (context: WithRoot<PoServerPluginContext, TaskServerScope>) => ({\n name: COMMAND_NAME,\n description: 'List or clear the persistent task graph.',\n async execute(args: string, commandContext: PoHeadlessExecutionContext) {\n const action = args.trim() === 'clear' ? 'clear' : 'list';\n const response = await reducerAction(context.root.store, action, { action }, context.root.maxTasks);\n const content = response.content[0];\n await commandContext.client.notify({\n body: content?.type === 'text' ? content.text : 'No tasks',\n level: 'info',\n });\n },\n});\n","import { defineServerCommand } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/tasks.server';\n\nexport default defineServerCommand(contribution);\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineResource({\n name: 'codemode-how-to-task',\n description:\n 'Track multi-step work as a persistent task graph and hand ready tasks to background subagents. Use for any plan, todo or delegation: the tasks namespace in code mode, with its status flow, batching rules and assignment briefs.',\n kind: 'skill' as const,\n pinned: true,\n path: packageResourcePath(import.meta.url, 'src/prompts/codemode-how-to-task/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/codemode-how-to-task/SKILL.md'),\n});\n","import type { WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { activeTaskSnapshots, formatTaskSnapshots } from '../../../../../../services/contextContribution';\nimport type { TaskServerScope } from '../../_lib/root.server';\n\nexport default (context: WithRoot<PoServerPluginContext, TaskServerScope>) => ({\n name: 'po/task-board',\n kind: 'context' as const,\n /**\n * The same bounded projection the Pi extension renders: open work only, one line each.\n * Dumping the whole TaskDocument put every completed task plus the store's own\n * version/rev/nextId bookkeeping in the prompt, and an idle board still cost a\n * paragraph. '' is dropped by the prompt composer.\n */\n read: () => {\n const rendered = formatTaskSnapshots(activeTaskSnapshots(context.root.store.snapshot.tasks));\n return rendered === '(no active tasks)' ? '' : rendered;\n },\n});\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/task-board.server';\n\nexport default defineResource(contribution);\n","import { defineServerTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { createHeadlessTaskTool } from '../../../../../../services/taskTool';\nimport type { TaskServerScope } from '../../_lib/root.server';\n\nexport default defineServerTool((context: WithRoot<PoServerPluginContext, TaskServerScope>) =>\n createHeadlessTaskTool(context.root.store, context.root.manager, context.root.maxTasks),\n);\n","import { defineServerTool } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/task.server';\n\nexport default defineServerTool(contribution);\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 channelTaskGraph from '../src/extensions/(backend)/channel/task-graph.server';\nimport commandTasks from '../src/extensions/workspaces/sessions/(backend)/command/tasks.server';\nimport resourceCodemodeHowToTask from '../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-task.server';\nimport resourceTaskBoard from '../src/extensions/workspaces/sessions/(backend)/resource/task-board.server';\nimport toolTask from '../src/extensions/workspaces/sessions/(backend)/tool/task.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-task',\n providerOverrides: composeServerProviderOverrides(rootSession),\n injects: composeRootInjects({ session: [rootSession] }),\n global: (context) => ({\n get channels(): PoServerSessionPlugin['channels'] { return [() => via({ frameType: 'task_graph' }, at(channelTaskGraph, context))]; },\n }),\n workspace: (context) => ({\n get channels(): PoServerSessionPlugin['channels'] { return defined([context.hosted('global') ? undefined : () => via({ frameType: 'task_graph' }, at(channelTaskGraph, context))]); },\n }),\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 channels(): PoServerSessionPlugin['channels'] { return defined([context.hosted('global') ? undefined : () => via({ frameType: 'task_graph' }, at(channelTaskGraph, context))]); },\n get commands(): PoServerSessionPlugin['commands'] { return [via({ name: 'tasks' }, at(commandTasks, contextSession))]; },\n get resources(): PoServerSessionPlugin['resources'] { return [at(resourceCodemodeHowToTask, contextSession), at(resourceTaskBoard, contextSession)]; },\n get tools(): PoServerSessionPlugin['tools'] { return [via({ name: 'task' }, at(toolTask, 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
|
+
{"version":3,"file":"server.mjs","names":["contribution","contribution","contribution","contribution","contribution","rootSession","channelTaskGraph","commandTasks","resourceCodemodeHowToTask","resourceTaskBoard","toolTask"],"sources":["../../src/services/contextContribution/index.ts","../../src/services/delegationPlatform/index.ts","../../src/services/taskTool/index.ts","../../src/services/taskNamespace/index.ts","../../src/types/webTasks.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/(backend)/channel/_lib/task-graph.ts","../../src/extensions/(backend)/channel/task-graph.server.ts","../../src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.server.ts","../../src/extensions/workspaces/sessions/(backend)/command/tasks.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-task.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/_lib/task-board.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/task-board.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/_lib/task.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/task.server.ts","../../generated/server.ts"],"sourcesContent":["import type { PoContextContribution } from '@agimon-ai/po-core/contextContributions';\n\nimport type { Task } from '../../models/task';\n\nexport const TASK_CONTEXT_CONTRIBUTION_SOURCE = '@agimon-ai/po-task';\nexport const TASK_CONTEXT_CONTRIBUTION_ID = 'active-tasks';\nexport const TASK_CONTEXT_CONTRIBUTION_LABEL = 'Active tasks';\nexport const TASK_CONTEXT_CONTRIBUTION_ORDER = 100;\n\ninterface TaskContextSnapshot {\n readonly id: number;\n readonly status: Task['status'];\n readonly subject: string;\n readonly activeForm?: string;\n readonly owner?: string;\n readonly blockedBy?: readonly number[];\n readonly delegation?: {\n readonly agent: string;\n readonly state: NonNullable<Task['delegation']>['state'];\n readonly error?: string;\n };\n}\n\nexport function activeTaskSnapshots(tasks: readonly Task[]): TaskContextSnapshot[] {\n return tasks\n .filter((task) => task.status === 'pending' || task.status === 'in_progress' || task.status === 'failed')\n .map((task) => ({\n id: task.id,\n status: task.status,\n subject: task.subject,\n ...(task.activeForm ? { activeForm: task.activeForm } : {}),\n ...(task.owner ? { owner: task.owner } : {}),\n ...(task.blockedBy?.length ? { blockedBy: task.blockedBy } : {}),\n ...(task.delegation\n ? {\n delegation: {\n agent: task.delegation.agent,\n state: task.delegation.state,\n ...(task.delegation.result?.error ? { error: task.delegation.result.error } : {}),\n },\n }\n : {}),\n }));\n}\n\nexport function formatTaskSnapshots(tasks: readonly TaskContextSnapshot[]): string {\n if (tasks.length === 0) return '(no active tasks)';\n return tasks\n .map((task) => {\n const details = [\n task.activeForm ? `active: ${task.activeForm}` : undefined,\n task.owner ? `owner: ${task.owner}` : undefined,\n task.blockedBy?.length ? `blocked by: ${task.blockedBy.join(', ')}` : undefined,\n task.delegation ? `delegation: ${task.delegation.agent} (${task.delegation.state})` : undefined,\n task.delegation?.error ? `error: ${task.delegation.error}` : undefined,\n ].filter((value): value is string => Boolean(value));\n return `- #${task.id} [${task.status}] ${task.subject}${details.length > 0 ? ` | ${details.join(' | ')}` : ''}`;\n })\n .join('\\n');\n}\n\n/** Builds Task's bounded, synchronous contribution from its in-memory store snapshot. */\nexport function createTaskContextContribution(readTasks: () => readonly Task[]): PoContextContribution {\n return Object.freeze({\n source: TASK_CONTEXT_CONTRIBUTION_SOURCE,\n id: TASK_CONTEXT_CONTRIBUTION_ID,\n label: TASK_CONTEXT_CONTRIBUTION_LABEL,\n order: TASK_CONTEXT_CONTRIBUTION_ORDER,\n snapshot: () => formatTaskSnapshots(activeTaskSnapshots(readTasks())),\n });\n}\n","import { randomUUID } from 'node:crypto';\nimport path from 'node:path';\n\nimport type { DelegationPlatform } from '../delegation';\n\nfunction formatBriefPath(entry: string, cwd: string): string {\n if (!path.isAbsolute(entry)) return path.normalize(entry);\n const relative = path.relative(cwd, entry);\n // Outside the run directory the original beats a `../../` chain.\n return relative && !relative.startsWith('..') ? relative : entry;\n}\n\n/** Supply Node-owned process and path facilities to the host-neutral manager. */\nexport function createNodeDelegationPlatform(\n environment: Readonly<Record<string, string | undefined>> = process.env,\n): DelegationPlatform {\n return {\n environment,\n processId: process.pid,\n createRequestId: randomUUID,\n formatBriefPath,\n };\n}\n","import type { PoHeadlessTool, PoHeadlessToolResult } from '@agimon-ai/po-core/headless';\nimport { Check } from 'typebox/value';\n\nimport type { TaskMutationParams } from '../../models/task';\nimport { TaskParamsSchema, type TaskParams, type TaskAssignmentParams } from '../../schemas/task';\nimport type { DelegationManager } from '../delegation';\nimport { applyTaskMutation, isCommittingOp, type ReducerAction } from '../reducer';\nimport { buildAssignmentResult, buildTextResult, buildToolResult, formatAssignmentResults } from '../taskResult';\nimport type { TaskStore } from '../taskStore';\n\nfunction output(value: unknown): PoHeadlessToolResult {\n if (typeof value === 'object' && value !== null && 'content' in value) return value as PoHeadlessToolResult;\n const text = typeof value === 'string' ? value : JSON.stringify(value, null, 2);\n return { content: [{ type: 'text', text }], details: value };\n}\n\nfunction failure(error: unknown): PoHeadlessToolResult {\n return { content: [{ type: 'text', text: error instanceof Error ? error.message : String(error) }], isError: true };\n}\n\nexport async function reducerAction(\n store: TaskStore,\n action: ReducerAction,\n params: TaskMutationParams,\n maxTasks: number,\n): Promise<PoHeadlessToolResult> {\n const { document, value } = await store.mutate((current) => {\n const result = applyTaskMutation(current, action, params, undefined, maxTasks);\n return { ...(isCommittingOp(result.op) ? { document: result.document } : {}), value: result };\n });\n if (value.op.kind === 'error') throw new Error(value.op.message);\n return buildToolResult(action, params, document, value.op);\n}\n\ninterface AssignmentItemResult {\n index: number;\n id: number;\n agent: string;\n ok: boolean;\n message: string;\n}\n\nasync function assignmentBatch(\n manager: DelegationManager,\n assignments: readonly TaskAssignmentParams[],\n signal?: AbortSignal,\n): Promise<AssignmentItemResult[]> {\n const result: AssignmentItemResult[] = [];\n for (const [index, assignment] of assignments.entries()) {\n try {\n const outcome = await manager.assign(assignment.id, {\n agent: assignment.agent,\n inlineAgent: assignment.inlineAgent,\n instructions: assignment.instructions,\n relevantFiles: assignment.relevantFiles,\n priorFindings: assignment.priorFindings,\n model: assignment.model,\n ...(assignment.context === 'fork' || assignment.context === 'fresh' ? { context: assignment.context } : {}),\n signal,\n });\n result.push({ index, id: assignment.id, agent: assignment.agent, ...outcome });\n } catch (error) {\n result.push({ index, id: assignment.id, agent: assignment.agent, ok: false, message: String(error) });\n }\n }\n return result;\n}\n\n/** One task action against the session store, shared by the `task` tool and the `tasks` code-mode namespace. */\nexport async function runTaskAction(\n store: TaskStore,\n manager: DelegationManager | undefined,\n maxTasks: number,\n rawParams: unknown,\n signal?: AbortSignal,\n onUpdate?: (result: PoHeadlessToolResult) => void,\n): Promise<PoHeadlessToolResult> {\n if (!Check(TaskParamsSchema, rawParams)) return failure('Invalid task parameters.');\n const params = rawParams as TaskParams;\n try {\n if ((params.action === 'assign' || params.action === 'cancel') && !manager)\n throw new Error('Delegation is not available on this connection.');\n if (params.action === 'assign') {\n if (!params.assignments?.length) throw new Error('assign requires a non-empty assignments[] array');\n onUpdate?.(\n output(`Delegating ${params.assignments.length} task${params.assignments.length === 1 ? '' : 's'}...`),\n );\n const items = await assignmentBatch(manager!, params.assignments, signal);\n const assigned = items.filter((item) => item.ok).map((item) => item.id);\n const text = formatAssignmentResults(items);\n if (assigned.length === 0) throw new Error(text);\n return buildAssignmentResult(params as TaskMutationParams, store.snapshot, text, {\n assigned,\n failed: items.length - assigned.length,\n });\n }\n if (params.action === 'cancel') {\n const outcome = await manager!.cancel(params.id ?? Number.NaN);\n if (!outcome.ok) throw new Error(outcome.message);\n return buildTextResult('cancel', params as TaskMutationParams, store.snapshot, outcome.message);\n }\n return reducerAction(store, params.action as ReducerAction, params as TaskMutationParams, maxTasks);\n } catch (error) {\n return failure(error);\n }\n}\n\nexport function createHeadlessTaskTool(\n store: TaskStore,\n /** Absent on remote MCP connections, which track tasks but never delegate. */\n manager: DelegationManager | undefined,\n maxTasks: number,\n): PoHeadlessTool<typeof TaskParamsSchema> {\n return {\n name: 'task',\n label: 'Task',\n description: 'Maintain a persistent task graph and delegate ready tasks to background agents.',\n parameters: TaskParamsSchema,\n promptSnippet: 'Track complex work persistently and delegate ready tasks',\n executionMode: 'serial',\n execute: (_toolCallId, rawParams, signal, onUpdate) =>\n runTaskAction(store, manager, maxTasks, rawParams, signal, onUpdate),\n };\n}\n","import type { PoCodemodeNamespace } from '@agimon-ai/po-core/codemode';\n\nimport type { TaskDocument } from '../../models/task';\nimport { runTaskAction } from '../taskTool';\nimport type { TaskNamespaceOptions } from './type';\n\nconst DECLARATIONS = `type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';\n\ntype DelegationState = 'requested' | 'running' | 'completed' | 'failed' | 'cancelled';\n\ninterface DelegationResult {\n status: string;\n output?: string;\n outputPath?: string;\n sessionFile?: string;\n error?: string;\n durationMs?: number;\n toolCount?: number;\n}\n\ninterface TaskDelegation {\n requestId: string;\n agent: string;\n identity?: string;\n state: DelegationState;\n sessionId?: string;\n pid?: number;\n runId?: string;\n model?: string;\n startedAt?: string;\n endedAt?: string;\n result?: DelegationResult;\n}\n\ninterface Task {\n id: number;\n subject: string;\n description?: string;\n activeForm?: string;\n status: TaskStatus;\n blockedBy?: number[];\n owner?: string;\n metadata?: Record<string, unknown>;\n createdAt?: string;\n updatedAt?: string;\n delegation?: TaskDelegation;\n}\n\ninterface TaskDocument {\n version: number;\n rev: number;\n nextId: number;\n tasks: Task[];\n}\ninterface TaskItem {\n /** Existing task id to change. Omit to create; an unknown id fails only that entry. */\n id?: number;\n /** Temporary name so a LATER entry in the same call can list it in blockedBy. Never stored. */\n ref?: string;\n /** Short and imperative. Required when creating. */\n subject?: string;\n /** The durable brief handed to a subagent on assign. */\n description?: string;\n /** Present-continuous label shown while in_progress, such as 'writing tests'. */\n activeForm?: string;\n status?: TaskStatus;\n /** For a NEW entry: task ids or earlier refs. */\n blockedBy?: (number | string)[];\n /** For an entry with an id: dependencies to add or remove. */\n addBlockedBy?: (number | string)[];\n removeBlockedBy?: (number | string)[];\n owner?: string;\n /** Merged into the task; a null value deletes that key. */\n metadata?: Record<string, unknown>;\n}\n\ninterface TaskAssignment {\n /** A pending, unblocked task. */\n id: number;\n /** Exact name from subagent({ action: 'agents' }). */\n agent: string;\n instructions?: string;\n /** Only files you actually read or located. */\n relevantFiles?: string[];\n /** Only verified facts, not directives. */\n priorFindings?: string;\n model?: string;\n context?: 'fresh' | 'fork';\n}\n\n/** What a write returns: the text the task tool would print, and the graph after the write. */\ninterface TaskWrite {\n message: string;\n document: TaskDocument;\n /** upsert only: ids that landed and how many entries failed. Nothing landing throws; a partial failure does not. */\n applied?: number[];\n failed?: number;\n}\ndeclare const tasks: {\n /** The whole task graph, tombstones included. Filter it in the script. */\n snapshot(): Promise<TaskDocument>;\n /**\n * Create or change tasks, applied in array order. Never mark a task completed while tests fail or the\n * work is partial: use failed, or keep it in_progress and add a task for the blocker in the same call.\n * Status flow is pending, in_progress, completed. failed is recoverable and deleted is a tombstone.\n */\n upsert(tasks: TaskItem[]): Promise<TaskWrite>;\n /** Tombstone one task. Refused while it has a running delegation. */\n delete(id: number): Promise<TaskWrite>;\n /** Remove every task. Refused while a delegation is running. */\n clear(): Promise<TaskWrite>;\n /** Hand ready tasks to background subagents. Batch independent tasks in one call. */\n assign(assignments: TaskAssignment[]): Promise<TaskWrite>;\n /** Cancel a task's running delegation. */\n cancel(id: number): Promise<TaskWrite>;\n};`;\n\n/** The owning session's task graph: `snapshot` reads without locking, the rest write through the same store as the `task` tool. */\nexport function createTaskNamespace(options: TaskNamespaceOptions): PoCodemodeNamespace {\n return {\n name: 'tasks',\n summary:\n 'The session task graph: tasks.snapshot() reads it, tasks.upsert/delete/clear change it, tasks.assign/cancel hand tasks to background subagents. Use it to track multi-step work.',\n declarations: DECLARATIONS,\n bind(run) {\n if (run.sessionId !== options.sessionId) throw new Error('Tasks namespace belongs to another session.');\n let disposed = false;\n run.onDispose(() => {\n disposed = true;\n });\n const assertAvailable = (): void => {\n run.signal.throwIfAborted();\n if (disposed) throw new Error('Tasks namespace run is disposed.');\n options.assertAvailable();\n };\n const members: Record<string, unknown> = Object.create(null);\n members.snapshot = async (): Promise<TaskDocument> => {\n assertAvailable();\n const storePath = options.store.storePath;\n const errors: unknown[] = [];\n const document = await options.store.readAsync(\n () => false,\n (error) => errors.push(error),\n );\n assertAvailable();\n if (options.store.storePath !== storePath) throw new Error('Task store path changed during snapshot.');\n if (errors.length > 0) throw new Error('Task snapshot read failed.', { cause: errors[0] });\n return JSON.parse(JSON.stringify(document)) as TaskDocument;\n };\n const write = async (params: Record<string, unknown>) => {\n assertAvailable();\n const started = Date.now();\n const result = await runTaskAction(options.store, options.manager, options.maxTasks, params, run.signal);\n assertAvailable();\n const message = result.content.flatMap((part) => (part.type === 'text' ? [part.text] : [])).join('\\n');\n const upsert = (result.details as { upsert?: { applied: number[]; failed: number } } | undefined)?.upsert;\n const failure =\n result.isError || (upsert && upsert.applied.length === 0 && upsert.failed > 0) ? message : undefined;\n // The `task` tool's card draws the call, from the same args and result the tool would have had.\n run.record?.({\n name: `tasks.${String(params.action)}`,\n tool: 'task',\n args: params,\n ok: failure === undefined,\n ms: Date.now() - started,\n ...(failure === undefined ? {} : { error: failure }),\n result: { content: result.content, details: result.details },\n });\n if (failure !== undefined) throw new Error(failure);\n return {\n message,\n document: JSON.parse(JSON.stringify(options.store.snapshot)) as TaskDocument,\n ...(upsert ? { applied: upsert.applied, failed: upsert.failed } : {}),\n };\n };\n members.upsert = (tasks: unknown) => write({ action: 'upsert', tasks });\n members.delete = (id: unknown) => write({ action: 'delete', id });\n members.clear = () => write({ action: 'clear' });\n members.assign = (assignments: unknown) => write({ action: 'assign', assignments });\n members.cancel = (id: unknown) => write({ action: 'cancel', id });\n return members;\n },\n };\n}\n","/** Browser-safe task view published by the cockpit hub channel. */\nexport const TASKS_CHANNEL_TYPE = 'task_graph';\n\nexport type WebTaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';\n\nexport interface WebTask {\n id: number;\n subject: string;\n description?: string;\n activeForm?: string;\n status: WebTaskStatus;\n blockedBy: number[];\n owner?: string;\n updatedAt?: string;\n delegation?: {\n agent?: string;\n identity?: string;\n state?: string;\n };\n}\n\nexport interface WebTasksPayload {\n tasks: WebTask[];\n rev: number;\n}\n","import {\n PO_BACKGROUND_WORK_SERVICE,\n readPoBackgroundWorkService,\n type BackgroundWorkProviderHandle,\n type PoBackgroundWorkService,\n} from '@agimon-ai/po-core/backgroundWork';\nimport { PO_CODEMODE_SERVICE, readPoCodemode } from '@agimon-ai/po-core/codemode';\nimport {\n PO_CONTEXT_CONTRIBUTIONS_SERVICE,\n requirePoContextContributions,\n} from '@agimon-ai/po-core/contextContributions';\nimport { PO_DELEGATION_SERVICE, readPoDelegationService } from '@agimon-ai/po-core/delegation';\nimport { defineRoot, runCleanups } from '@agimon-ai/po-core/extensionFile';\nimport { createPoReadinessCoordinator, readPoReadinessCoordinator } from '@agimon-ai/po-core/readiness';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { getDelegationTimeoutMs, getMaxTasks, getStoreTtlMs } from '../../../../../services/config';\nimport { createTaskContextContribution } from '../../../../../services/contextContribution';\nimport { BACKGROUND_WORK_PROVIDER, DelegationManager } from '../../../../../services/delegation';\nimport { createNodeDelegationPlatform } from '../../../../../services/delegationPlatform';\nimport { createTaskErrorReporter, toFailureReporter, TASK_EVENT } from '../../../../../services/logSinkTelemetry';\nimport {\n hasStorePathOverride,\n removeLegacyStoreDirectoryAsync,\n resolveSessionKey,\n sweepStoreFilesAsync,\n} from '../../../../../services/paths';\nimport { createTaskNamespace } from '../../../../../services/taskNamespace';\nimport { TaskStore } from '../../../../../services/taskStore';\nimport { TASKS_CHANNEL_TYPE } from '../../../../../types/webTasks';\n\nconst SOURCE = '@agimon-ai/po-task';\n\n/** The notification body: one line, since `client.notify` collapses the rest anyway. */\nfunction headlineOf(content: string): string {\n return content.split('\\n').find((line) => line.trim().length > 0) ?? content;\n}\n\nconst root = defineRoot(({ host: serverHost, agent: host, signal: pluginSignal }: PoServerPluginContext) => {\n if (!host) throw new Error('Task session requires the headless host.');\n const execution = host.context;\n if (serverHost.context.directEvents === undefined)\n throw new Error('Task server plugin requires the session direct event bus.');\n const directEvents = serverHost.context.directEvents;\n const reporter = createTaskErrorReporter({ cwd: execution.cwd, env: execution.environment });\n const report = toFailureReporter(reporter);\n let active = true;\n let disposed = false;\n let generation = 0;\n let unwatch: (() => void) | undefined;\n let backgroundService: PoBackgroundWorkService | undefined;\n let background: BackgroundWorkProviderHandle | undefined;\n let serviceContext: Context | undefined;\n let startup: Promise<void> = Promise.resolve();\n let startupAbort = new AbortController();\n const ownedReadiness = createPoReadinessCoordinator({\n notify: (notification) =>\n execution.client.notify({\n body: notification.error?.message ?? notification.diagnostics.join('; '),\n level: 'warning',\n }),\n });\n const refresh = (): void => {\n if (!active || disposed) return;\n execution.client.setStatus(SOURCE, `tasks: ${store.snapshot.tasks.length}`);\n background?.update();\n };\n const registerBackground = (): void => {\n if (!active || disposed || !backgroundService || background) return;\n background = backgroundService.register({\n provider: BACKGROUND_WORK_PROVIDER,\n listActiveWork: () => (active && !disposed ? manager.listActiveWork() : []),\n });\n };\n const maxTasks = getMaxTasks(execution.environment);\n const store = new TaskStore({\n cwd: execution.cwd,\n env: execution.environment,\n report,\n });\n store.configureSession(resolveSessionKey(execution.sessionId, execution.environment));\n let notifications: Promise<void> = Promise.resolve();\n const manager = new DelegationManager({\n store,\n cwd: execution.cwd,\n platform: createNodeDelegationPlatform(execution.environment),\n getSessionId: () => execution.sessionId,\n report,\n notify: (message, options) => {\n const ownGeneration = generation;\n const isCurrent = (): boolean => active && !disposed && !pluginSignal?.aborted && generation === ownGeneration;\n // `DelegationNotifier` is Pi's `sendMessage` shape, and the Pi extension\n // forwards it verbatim (`root.cli.ts`). A headless session has no such\n // single call, so the three jobs are done by hand:\n //\n // toast `client.notify` - operator-facing only, flattened to one\n // line and capped at 4096 chars, and the model never sees a\n // custom entry. It gets the headline, not the whole result.\n // transcript `session.appendCustomEntry` under the same custom type,\n // carrying the full multi-line content.\n // wake `session.admitPrompt(content, 'steer')` - the only call\n // that puts the completion in front of the model.\n // `session.prompt(_, 'steer')` is enqueue-only and parks the\n // message on an idle lane, which is why a finished subagent\n // used to leave the agent sitting idle.\n //\n // Sequenced so two delegations settling in the same tick each observe\n // settled lane state rather than racing.\n notifications = notifications\n .then(async () => {\n if (!isCurrent()) return;\n await execution.client.notify({ body: headlineOf(message.content), level: 'info' });\n if (!isCurrent()) return;\n await execution.session.appendCustomEntry(message.customType, { content: message.content });\n // `triggerTurn: false` has no faithful headless mapping - there is no\n // way to reach model context without starting or joining a turn - so\n // it stays a toast, as it is today. `DelegationManager` always sends\n // `true`, so this is defensive rather than live.\n if (!isCurrent() || options?.triggerTurn === false) return;\n // Matching the voice server plugin, which also refuses rather than degrading:\n // `session.prompt(_, 'steer')` is NOT a fallback here, because it is\n // enqueue-only and would park the message on an idle lane - the\n // original bug.\n if (!execution.session.admitPrompt) throw new Error('The session cannot admit a task notification.');\n await execution.session.admitPrompt(message.content, 'steer');\n })\n .catch((error: unknown) => {\n // Mirrors `onNotifyError` below. The delegation is already committed,\n // so a failed notification costs the model its wake-up, not the\n // result, and must not stall later notifications.\n if (isCurrent()) void execution.client.notify({ body: String(error), level: 'warning' });\n });\n },\n onChange: refresh,\n runTimeoutMs: getDelegationTimeoutMs(execution.environment),\n onNotifyError: (error, taskId) => {\n void reporter.recordNotificationError(error, taskId);\n if (active && !disposed) void execution.client.notify({ body: String(error), level: 'warning' });\n },\n });\n return {\n value: { store, manager, maxTasks },\n services: [\n (serviceContextOwner: Context) => {\n serviceContext = serviceContextOwner;\n const namespace = createTaskNamespace({\n store,\n manager,\n maxTasks,\n sessionId: execution.sessionId,\n assertAvailable: () => {\n if (!active || disposed || pluginSignal?.aborted) throw new Error('Task session is unavailable.');\n },\n });\n serviceContextOwner.inject([PO_CODEMODE_SERVICE], (context) => {\n const codemode = readPoCodemode(context);\n if (!codemode) return undefined;\n const registration = codemode.register(SOURCE, namespace);\n // The tasks namespace covers every task action, so the model gets one surface, not two.\n const restriction = host.registerToolRestriction({ excludedTools: ['task'] });\n return () => {\n restriction.dispose();\n registration.dispose();\n };\n });\n serviceContextOwner.inject([PO_CONTEXT_CONTRIBUTIONS_SERVICE], (context) => {\n const registration = requirePoContextContributions(context).register(\n createTaskContextContribution(() => (active && !disposed ? store.snapshot.tasks : [])),\n );\n return () => registration.dispose();\n });\n serviceContextOwner.inject([PO_BACKGROUND_WORK_SERVICE], (context) => {\n const service = readPoBackgroundWorkService(context);\n if (!service) return undefined;\n backgroundService = service;\n registerBackground();\n return () => {\n if (backgroundService !== service) return;\n background?.dispose();\n background = undefined;\n backgroundService = undefined;\n };\n });\n serviceContextOwner.inject([PO_DELEGATION_SERVICE], (serviceContext) => {\n const service = readPoDelegationService(serviceContext);\n if (service) return manager.bind(serviceContext, service);\n return undefined;\n });\n },\n ],\n activities: [\n {\n name: SOURCE,\n async start(activityContext) {\n if (disposed) throw new Error('Task session is disposed.');\n active = true;\n const ownGeneration = ++generation;\n startupAbort.abort();\n const controller = new AbortController();\n startupAbort = controller;\n await Promise.allSettled([startup]);\n const coordinator = (serviceContext && readPoReadinessCoordinator(serviceContext)) ?? ownedReadiness;\n const handle = coordinator.start(SOURCE, `${execution.sessionId}:${ownGeneration}`, async (signal) => {\n const isCurrent = (): boolean =>\n !disposed &&\n !pluginSignal?.aborted &&\n active &&\n generation === ownGeneration &&\n !signal.aborted &&\n !controller.signal.aborted;\n const diagnostics: string[] = [];\n const degrade = async (stage: string, operation: () => Promise<unknown>): Promise<void> => {\n try {\n await operation();\n } catch (error) {\n diagnostics.push(`Task ${stage} failed: ${String(error)}`);\n report.warn(TASK_EVENT.sessionStartDegraded, error, { 'task.stage': stage });\n }\n };\n try {\n if (!isCurrent()) return { value: undefined };\n store.configureSession(resolveSessionKey(activityContext.sessionId, activityContext.environment));\n manager.setCwd(activityContext.cwd);\n const cleanup = await removeLegacyStoreDirectoryAsync(store.storePath, activityContext.cwd);\n if (!isCurrent()) return { value: undefined };\n const sweep = hasStorePathOverride(activityContext.environment)\n ? { errors: [] }\n : await sweepStoreFilesAsync(store.storePath, getStoreTtlMs(activityContext.environment));\n for (const error of [...cleanup.errors, ...sweep.errors]) {\n diagnostics.push(error);\n report.warn(TASK_EVENT.storeSweepFailed, new Error(error));\n }\n if (!isCurrent()) return { value: undefined };\n await degrade('store_read', async () => {\n // Fail-open reads retain telemetry and report only this operation's failure.\n const errors: unknown[] = [];\n await store.readAsync(isCurrent, (error) => errors.push(error));\n if (errors.length > 0) throw new Error(String(errors[0]), { cause: errors[0] });\n });\n if (!isCurrent()) return { value: undefined };\n unwatch?.();\n unwatch = store.onExternalChange(() => {\n refresh();\n if (isCurrent()) directEvents.publish(TASKS_CHANNEL_TYPE, execution.sessionId, store.snapshot);\n });\n await degrade('reconcile', () => manager.reconcile(isCurrent));\n if (!isCurrent()) return { value: undefined };\n registerBackground();\n refresh();\n directEvents.publish(TASKS_CHANNEL_TYPE, execution.sessionId, store.snapshot);\n return { value: undefined, diagnostics };\n } catch (error) {\n if (!isCurrent()) return { value: undefined };\n report.error(TASK_EVENT.sessionStartFailed, error);\n throw error;\n }\n });\n startup = handle.wait();\n // Initialization failure is observable, but must not fail the session closed.\n await Promise.allSettled([startup]);\n return () => {\n if (ownGeneration !== generation) return;\n active = false;\n generation += 1;\n controller.abort();\n unwatch?.();\n unwatch = undefined;\n background?.dispose();\n background = undefined;\n manager.reset();\n execution.client.setStatus(SOURCE, undefined);\n };\n },\n },\n ],\n async onDispose() {\n if (disposed) return;\n disposed = true;\n active = false;\n generation += 1;\n startupAbort.abort();\n await Promise.allSettled([startup]);\n await runCleanups(\n [\n () => unwatch?.(),\n () => background?.dispose(),\n () => manager.dispose(),\n () => store.dispose(),\n () => ownedReadiness.dispose(),\n () => reporter.shutdown(),\n ],\n 'Task cleanup failed.',\n );\n },\n };\n});\n\nexport type TaskServerScope = Awaited<ReturnType<typeof root>>['value'];\nexport default root;\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/root.server';\n\nexport default defineRoot(contribution);\n","import { createHash } from 'node:crypto';\n\nimport { HOME_ENTITY_LIMIT, type HomeProjection } from '@agimon-ai/po-core/hubChannel';\nimport type { PoHubChannelSource, PoHubSessionScope, PoHubChannel } from '@agimon-ai/po-core/hubChannel';\n\nimport type { TaskDocument } from '../../../../models/task';\nimport { isBlocked } from '../../../../models/taskGraph';\nimport { resolveSessionKey, resolveStorePath } from '../../../../services/paths';\nimport { TaskStore } from '../../../../services/taskStore';\nimport { TASKS_CHANNEL_TYPE, type WebTask, type WebTasksPayload } from '../../../../types/webTasks';\n\ninterface TaskStoreSource {\n readonly snapshot: TaskDocument;\n read(): TaskDocument;\n dispose(): void;\n}\n\nfunction isTaskDocument(value: unknown): value is TaskDocument {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as TaskDocument).rev === 'number' &&\n Array.isArray((value as TaskDocument).tasks)\n );\n}\n\nexport interface TasksChannelOptions {\n /** Injectable for tests. The default opens the session tree's durable task store. */\n storeFor?: (scope: PoHubSessionScope) => TaskStoreSource;\n}\n\nfunction present(document: TaskDocument): WebTasksPayload {\n const tasks: WebTask[] = document.tasks.flatMap((task) => {\n if (task.status === 'deleted') return [];\n const view: WebTask = {\n id: task.id,\n subject: task.subject,\n status: task.status,\n blockedBy: task.blockedBy ?? [],\n };\n if (task.description) view.description = task.description;\n if (task.activeForm) view.activeForm = task.activeForm;\n if (task.owner) view.owner = task.owner;\n if (task.updatedAt) view.updatedAt = task.updatedAt;\n if (task.delegation) {\n view.delegation = {\n ...(task.delegation.agent === undefined ? {} : { agent: task.delegation.agent }),\n ...(task.delegation.identity === undefined ? {} : { identity: task.delegation.identity }),\n ...(task.delegation.state === undefined ? {} : { state: task.delegation.state }),\n };\n }\n return [view];\n });\n return { tasks, rev: document.rev };\n}\n\n/** Publishes each managed session's durable task graph and follows direct session commits. */\nexport function createTasksChannel(options: TasksChannelOptions = {}): PoHubChannel {\n return {\n frameType: TASKS_CHANNEL_TYPE,\n start(host) {\n const stores = new Map<string, { store: TaskStoreSource; unsubscribe: () => void; latest?: TaskDocument }>();\n const open = (scope: PoHubSessionScope): void => {\n if (stores.has(scope.sessionId)) return;\n let store = options.storeFor?.(scope);\n if (store === undefined) {\n if (scope.environment === undefined)\n throw new Error(`Task channel requires an admitted environment for session '${scope.sessionId}'.`);\n store = new TaskStore({\n cwd: scope.cwd,\n env: scope.environment,\n storePath: resolveStorePath(\n scope.cwd,\n scope.environment,\n resolveSessionKey(scope.sessionId, scope.environment),\n ),\n });\n }\n store.read();\n const source = { store, unsubscribe: () => undefined as void };\n stores.set(scope.sessionId, source);\n source.unsubscribe = host.directEvents.subscribe(\n TASKS_CHANNEL_TYPE,\n scope.sessionId,\n (payload) => {\n if (!isTaskDocument(payload)) return;\n const current = stores.get(scope.sessionId);\n if (current === undefined) return;\n current.latest = payload;\n host.publish(scope.sessionId, present(payload));\n },\n { replayLatest: true },\n );\n };\n const close = (sessionId: string): void => {\n const source = stores.get(sessionId);\n if (!source) return;\n source.unsubscribe();\n source.store.dispose();\n stores.delete(sessionId);\n };\n for (const scope of host.sessions()) open(scope);\n\n const source: PoHubChannelSource = {\n homeFor(scope): HomeProjection {\n open(scope);\n const source = stores.get(scope.sessionId);\n const document = source?.latest ?? source?.store.snapshot;\n if (!document) return { coverage: 'unavailable', entities: [] };\n const root = resolveSessionKey(scope.sessionId, scope.environment ?? {});\n const graph = createHash('sha256')\n .update(resolveStorePath(scope.cwd, scope.environment ?? {}, root))\n .digest('hex');\n // Do not process a truncated graph: dependencies and owners may be omitted.\n if (document.tasks.length > HOME_ENTITY_LIMIT) return { coverage: 'partial', entities: [] };\n const sessions = host.sessions();\n if (sessions.length > HOME_ENTITY_LIMIT) return { coverage: 'partial', entities: [] };\n const refs = new Set([root]);\n for (const candidate of sessions) {\n const candidateRoot = resolveSessionKey(candidate.sessionId, candidate.environment ?? {});\n if (\n resolveStorePath(candidate.cwd, candidate.environment ?? {}, candidateRoot) ===\n resolveStorePath(scope.cwd, scope.environment ?? {}, root)\n )\n refs.add(candidate.sessionId);\n if (refs.size > 65) return { coverage: 'partial', entities: [] };\n }\n for (const task of document.tasks) {\n if (task.delegation?.sessionId) refs.add(task.delegation.sessionId);\n if (refs.size > 65) return { coverage: 'partial', entities: [] };\n if ((task.blockedBy?.length ?? 0) > HOME_ENTITY_LIMIT) return { coverage: 'partial', entities: [] };\n }\n const tasks = document.tasks.filter((task) => task.status !== 'deleted');\n return {\n coverage: tasks.length > HOME_ENTITY_LIMIT ? 'partial' : 'ready',\n entities: tasks.slice(0, HOME_ENTITY_LIMIT).map((task) => ({\n id: `${graph}:${task.id}:${task.createdAt ?? ''}`,\n kind:\n task.status === 'failed'\n ? 'failure'\n : task.status === 'completed'\n ? 'completed'\n : isBlocked(document.tasks, task)\n ? 'blocked'\n : task.status === 'in_progress'\n ? 'running'\n : 'queued',\n title: (task.subject.trim() || 'Task').slice(0, 160),\n ...(task.description?.trim() ? { detail: task.description.slice(0, 320) } : {}),\n updatedAt: task.updatedAt ?? task.createdAt ?? new Date(0).toISOString(),\n sessionId: root,\n relatedSessionIds: [...refs].filter((id) => id !== root),\n })),\n };\n },\n payloadFor(scope) {\n open(scope);\n const source = stores.get(scope.sessionId);\n const document = source?.latest ?? source?.store.snapshot;\n return document === undefined ? undefined : present(document);\n },\n sessionAdded: open,\n sessionRemoved: close,\n close() {\n for (const sessionId of stores.keys()) close(sessionId);\n },\n };\n return source;\n },\n };\n}\n\nexport default createTasksChannel;\n","import { defineChannel } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/task-graph';\n\nexport default defineChannel(contribution);\n","import type { WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoHeadlessExecutionContext } from '@agimon-ai/po-core/headless';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { COMMAND_NAME } from '../../../../../../constants/task';\nimport { reducerAction } from '../../../../../../services/taskTool';\nimport type { TaskServerScope } from '../../_lib/root.server';\n\nexport default (context: WithRoot<PoServerPluginContext, TaskServerScope>) => ({\n name: COMMAND_NAME,\n description: 'List or clear the persistent task graph.',\n async execute(args: string, commandContext: PoHeadlessExecutionContext) {\n const action = args.trim() === 'clear' ? 'clear' : 'list';\n const response = await reducerAction(context.root.store, action, { action }, context.root.maxTasks);\n const content = response.content[0];\n await commandContext.client.notify({\n body: content?.type === 'text' ? content.text : 'No tasks',\n level: 'info',\n });\n },\n});\n","import { defineServerCommand } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/tasks.server';\n\nexport default defineServerCommand(contribution);\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineResource({\n name: 'codemode-how-to-task',\n description:\n 'Keep a plan that survives compaction and delegate parts of it to background subagents. Use for any multi-step plan, todo list, or delegation.',\n kind: 'skill' as const,\n pinned: true,\n path: packageResourcePath(import.meta.url, 'src/prompts/codemode-how-to-task/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/codemode-how-to-task/SKILL.md'),\n});\n","import type { WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { activeTaskSnapshots, formatTaskSnapshots } from '../../../../../../services/contextContribution';\nimport type { TaskServerScope } from '../../_lib/root.server';\n\nexport default (context: WithRoot<PoServerPluginContext, TaskServerScope>) => ({\n name: 'po/task-board',\n kind: 'context' as const,\n /**\n * The same bounded projection the Pi extension renders: open work only, one line each.\n * Dumping the whole TaskDocument put every completed task plus the store's own\n * version/rev/nextId bookkeeping in the prompt, and an idle board still cost a\n * paragraph. '' is dropped by the prompt composer.\n */\n read: () => {\n const rendered = formatTaskSnapshots(activeTaskSnapshots(context.root.store.snapshot.tasks));\n return rendered === '(no active tasks)' ? '' : rendered;\n },\n});\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/task-board.server';\n\nexport default defineResource(contribution);\n","import { defineServerTool, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { createHeadlessTaskTool } from '../../../../../../services/taskTool';\nimport type { TaskServerScope } from '../../_lib/root.server';\n\nexport default defineServerTool((context: WithRoot<PoServerPluginContext, TaskServerScope>) =>\n createHeadlessTaskTool(context.root.store, context.root.manager, context.root.maxTasks),\n);\n","import { defineServerTool } from '@agimon-ai/po-core/extensionFile';\n\nimport contribution from './_lib/task.server';\n\nexport default defineServerTool(contribution);\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 channelTaskGraph from '../src/extensions/(backend)/channel/task-graph.server';\nimport commandTasks from '../src/extensions/workspaces/sessions/(backend)/command/tasks.server';\nimport resourceCodemodeHowToTask from '../src/extensions/workspaces/sessions/(backend)/resource/codemode-how-to-task.server';\nimport resourceTaskBoard from '../src/extensions/workspaces/sessions/(backend)/resource/task-board.server';\nimport toolTask from '../src/extensions/workspaces/sessions/(backend)/tool/task.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-task',\n providerOverrides: composeServerProviderOverrides(rootSession),\n injects: composeRootInjects({ session: [rootSession] }),\n global: (context) => ({\n get channels(): PoServerSessionPlugin['channels'] { return [() => via({ frameType: 'task_graph' }, at(channelTaskGraph, context))]; },\n }),\n workspace: (context) => ({\n get channels(): PoServerSessionPlugin['channels'] { return defined([context.hosted('global') ? undefined : () => via({ frameType: 'task_graph' }, at(channelTaskGraph, context))]); },\n }),\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 channels(): PoServerSessionPlugin['channels'] { return defined([context.hosted('global') ? undefined : () => via({ frameType: 'task_graph' }, at(channelTaskGraph, context))]); },\n get commands(): PoServerSessionPlugin['commands'] { return [via({ name: 'tasks' }, at(commandTasks, contextSession))]; },\n get resources(): PoServerSessionPlugin['resources'] { return [at(resourceCodemodeHowToTask, contextSession), at(resourceTaskBoard, contextSession)]; },\n get tools(): PoServerSessionPlugin['tools'] { return [via({ name: 'task' }, at(toolTask, 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-task",
|
|
3
|
-
"version": "0.0.0-alpha.
|
|
3
|
+
"version": "0.0.0-alpha.37",
|
|
4
4
|
"description": "Persistent, dependency-aware task graphs and subagent delegation for Pi coding sessions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -131,15 +131,15 @@
|
|
|
131
131
|
"registry": "https://registry.npmjs.org/"
|
|
132
132
|
},
|
|
133
133
|
"dependencies": {
|
|
134
|
-
"@agimon-ai/po-core": "0.0.0-alpha.
|
|
135
|
-
"@agimon-ai/po-ui": "0.0.0-alpha.
|
|
136
|
-
"@agimon-ai/po-web-components": "0.0.0-alpha.
|
|
134
|
+
"@agimon-ai/po-core": "0.0.0-alpha.37",
|
|
135
|
+
"@agimon-ai/po-ui": "0.0.0-alpha.37",
|
|
136
|
+
"@agimon-ai/po-web-components": "0.0.0-alpha.37",
|
|
137
137
|
"@deepseek-ai/cordis": "4.0.5",
|
|
138
138
|
"typebox": "1.3.37"
|
|
139
139
|
},
|
|
140
140
|
"devDependencies": {
|
|
141
|
-
"@agimon-ai/po-build": "0.0.0-alpha.
|
|
142
|
-
"@agimon-ai/po-native-components": "0.0.0-alpha.
|
|
141
|
+
"@agimon-ai/po-build": "0.0.0-alpha.37",
|
|
142
|
+
"@agimon-ai/po-native-components": "0.0.0-alpha.37",
|
|
143
143
|
"@babel/core": "7.29.7",
|
|
144
144
|
"@earendil-works/pi-coding-agent": "1.3.0",
|
|
145
145
|
"@tanstack/react-store": "0.11.2",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: codemode-how-to-task
|
|
3
|
-
description: '
|
|
3
|
+
description: 'Keep a plan that survives compaction and delegate parts of it to background subagents. Use for any multi-step plan, todo list, or delegation.'
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Use Task
|