@agimon-ai/po-task 0.0.0-alpha.2 → 0.0.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -8
- package/dist/apiContracts.cjs +1 -1
- package/dist/apiContracts.cjs.map +1 -1
- package/dist/apiContracts.d.mts +18 -18
- package/dist/apiContracts.mjs +1 -1
- package/dist/apiContracts.mjs.map +1 -1
- package/dist/{config-CdX-Bv8q.cjs → config-BC-bztyx.cjs} +8 -8
- package/dist/config-BC-bztyx.cjs.map +1 -0
- package/dist/{config-CFSs3iku.mjs → config-BTadoGeF.mjs} +8 -8
- package/dist/config-BTadoGeF.mjs.map +1 -0
- package/dist/config.cjs +1 -1
- package/dist/config.d.mts +1 -1
- package/dist/config.mjs +1 -2
- package/dist/{delegation-CdMqOZB4.mjs → delegation-Dsqf7fUM.mjs} +11 -11
- package/dist/delegation-Dsqf7fUM.mjs.map +1 -0
- package/dist/{delegation-DsnKjMbJ.cjs → delegation-frvEXhIz.cjs} +10 -10
- package/dist/delegation-frvEXhIz.cjs.map +1 -0
- package/dist/delegationManager.cjs +1 -1
- package/dist/delegationManager.d.mts +1 -1
- package/dist/delegationManager.mjs +1 -1
- package/dist/extensions/mcp-ui.mjs.map +1 -1
- package/dist/extensions/mcp.cjs +23 -23
- package/dist/extensions/mcp.cjs.map +1 -1
- package/dist/extensions/mcp.d.mts +1 -1
- package/dist/extensions/mcp.mjs +23 -23
- package/dist/extensions/mcp.mjs.map +1 -1
- package/dist/extensions/native.mjs +14 -0
- package/dist/extensions/native.mjs.map +1 -1
- package/dist/extensions/server.cjs +70 -15
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.d.mts +1 -1
- package/dist/extensions/server.mjs +75 -20
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/extensions/web.mjs +28 -28
- package/dist/extensions/web.mjs.map +1 -1
- package/dist/{index-teIf67qQ.d.mts → index-B9QNwUBr.d.mts} +8 -8
- package/dist/{index-teIf67qQ.d.mts.map → index-B9QNwUBr.d.mts.map} +1 -1
- package/dist/{index-B-3sCF2S.d.mts → index-BsZ8DxpJ.d.mts} +7 -7
- package/dist/{index-B-3sCF2S.d.mts.map → index-BsZ8DxpJ.d.mts.map} +1 -1
- package/dist/{index-XY9VPmfm.d.mts → index-CA4Opp4r.d.mts} +2 -2
- package/dist/{index-XY9VPmfm.d.mts.map → index-CA4Opp4r.d.mts.map} +1 -1
- package/dist/{index-Dvb8X_qB.d.mts → index-qQGWsPum.d.mts} +2 -2
- package/dist/index-qQGWsPum.d.mts.map +1 -0
- package/dist/index.cjs +4 -4
- package/dist/index.d.mts +5 -5
- package/dist/index.mjs +4 -4
- package/dist/{logSinkTelemetry-B23qGiP-.cjs → logSinkTelemetry-BGb8WQBz.cjs} +4 -4
- package/dist/logSinkTelemetry-BGb8WQBz.cjs.map +1 -0
- package/dist/{logSinkTelemetry-BMBsC54p.mjs → logSinkTelemetry-BhbKdn-x.mjs} +5 -5
- package/dist/logSinkTelemetry-BhbKdn-x.mjs.map +1 -0
- package/dist/logSinkTelemetry.cjs +2 -2
- package/dist/logSinkTelemetry.d.mts +3 -3
- package/dist/logSinkTelemetry.mjs +2 -2
- package/dist/{paths-Cah1vFGv.mjs → paths-DajceJig.mjs} +4 -4
- package/dist/paths-DajceJig.mjs.map +1 -0
- package/dist/{paths-CSya2l9_.cjs → paths-P-XvOUuH.cjs} +4 -4
- package/dist/paths-P-XvOUuH.cjs.map +1 -0
- package/dist/storeInvariants.mjs +1 -2
- package/dist/storePaths.cjs +1 -1
- package/dist/storePaths.d.mts +1 -1
- package/dist/storePaths.mjs +1 -2
- package/dist/storeProcessLiveness.mjs +1 -2
- package/dist/storeReconcile.mjs +1 -2
- package/dist/storeReducer.mjs +1 -2
- package/dist/storeTaskGraph.mjs +1 -2
- package/dist/storeTaskStore.cjs +1 -1
- package/dist/storeTaskStore.d.mts +1 -1
- package/dist/storeTaskStore.mjs +1 -2
- package/dist/storeTypes.mjs +1 -2
- package/dist/{task-Dhta7JyA.d.mts → task-4HeGAS8o.d.mts} +6 -6
- package/dist/{task-Dhta7JyA.d.mts.map → task-4HeGAS8o.d.mts.map} +1 -1
- package/dist/{taskStore-pAJ971Ml.mjs → taskStore-BAi54FKL.mjs} +4 -4
- package/dist/{taskStore-pAJ971Ml.mjs.map → taskStore-BAi54FKL.mjs.map} +1 -1
- package/dist/{taskStore-DjU60rMm.cjs → taskStore-C4vcUOzA.cjs} +4 -4
- package/dist/{taskStore-DjU60rMm.cjs.map → taskStore-C4vcUOzA.cjs.map} +1 -1
- package/dist/telemetry-DYfgUFF8.d.mts +35 -0
- package/dist/telemetry-DYfgUFF8.d.mts.map +1 -0
- package/dist/telemetry-gEGWTaMI.mjs +25 -0
- package/dist/telemetry-gEGWTaMI.mjs.map +1 -0
- package/dist/telemetry-x3JxCA5K.cjs +30 -0
- package/dist/telemetry-x3JxCA5K.cjs.map +1 -0
- package/dist/toolPromptGuidelines.cjs +1 -1
- package/dist/toolPromptGuidelines.cjs.map +1 -1
- package/dist/toolPromptGuidelines.mjs +1 -1
- package/dist/toolPromptGuidelines.mjs.map +1 -1
- package/dist/toolResponseEnvelope.mjs +1 -2
- package/dist/toolSchema.d.mts +1 -1
- package/dist/toolSchema.mjs +1 -2
- package/package.json +16 -15
- package/dist/config-CFSs3iku.mjs.map +0 -1
- package/dist/config-CdX-Bv8q.cjs.map +0 -1
- package/dist/delegation-CdMqOZB4.mjs.map +0 -1
- package/dist/delegation-DsnKjMbJ.cjs.map +0 -1
- package/dist/index-Dvb8X_qB.d.mts.map +0 -1
- package/dist/logSinkTelemetry-B23qGiP-.cjs.map +0 -1
- package/dist/logSinkTelemetry-BMBsC54p.mjs.map +0 -1
- package/dist/paths-CSya2l9_.cjs.map +0 -1
- package/dist/paths-Cah1vFGv.mjs.map +0 -1
- package/dist/telemetry-Ca0I3Tqo.cjs +0 -30
- package/dist/telemetry-Ca0I3Tqo.cjs.map +0 -1
- package/dist/telemetry-DyS44zAD.mjs +0 -25
- package/dist/telemetry-DyS44zAD.mjs.map +0 -1
- package/dist/telemetry-FMGRovb4.d.mts +0 -35
- package/dist/telemetry-FMGRovb4.d.mts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.mjs","names":["contribution","contribution","contribution","contribution","contribution","rootSession","channelTaskGraph","commandTasks","resourceTaskBoard","toolTask"],"sources":["../../src/services/contextContribution/index.ts","../../src/services/delegationPlatform/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/services/taskTool/index.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/_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 { DoomContextContribution } 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[]): DoomContextContribution {\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","/** 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 state?: string;\n };\n}\n\nexport interface WebTasksPayload {\n tasks: WebTask[];\n rev: number;\n}\n","import {\n DOOM_BACKGROUND_WORK_SERVICE,\n readDoomBackgroundWorkService,\n type BackgroundWorkProviderHandle,\n type DoomBackgroundWorkService,\n} from '@agimon-ai/po-core/backgroundWork';\nimport {\n DOOM_CONTEXT_CONTRIBUTIONS_SERVICE,\n requireDoomContextContributions,\n} from '@agimon-ai/po-core/contextContributions';\nimport { DOOM_DELEGATION_SERVICE, readDoomDelegationService } from '@agimon-ai/po-core/delegation';\nimport { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport { createDoomReadinessCoordinator, readDoomReadinessCoordinator } from '@agimon-ai/po-core/readiness';\nimport type { DoomServerPluginContext } from '@agimon-ai/po-core/serverFacet';\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 { 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 }: DoomServerPluginContext) => {\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 headless facet 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: DoomBackgroundWorkService | 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 = createDoomReadinessCoordinator({\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 facet\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 facet, 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 serviceContextOwner.inject([DOOM_CONTEXT_CONTRIBUTIONS_SERVICE], (context) => {\n const registration = requireDoomContextContributions(context).register(\n createTaskContextContribution(() => (active && !disposed ? store.snapshot.tasks : [])),\n );\n return () => registration.dispose();\n });\n serviceContextOwner.inject([DOOM_BACKGROUND_WORK_SERVICE], (context) => {\n const service = readDoomBackgroundWorkService(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([DOOM_DELEGATION_SERVICE], (serviceContext) => {\n const service = readDoomDelegationService(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 && readDoomReadinessCoordinator(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 unwatch?.();\n background?.dispose();\n manager.dispose();\n store.dispose();\n await ownedReadiness.dispose();\n await reporter.shutdown();\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 type { DoomHubChannelSource, DoomHubSessionScope, DoomHubChannel } from '@agimon-ai/po-core/hubChannel';\n\nimport type { TaskDocument } from '../../../../models/task';\nimport { 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: DoomHubSessionScope) => 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.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 = {}): DoomHubChannel {\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: DoomHubSessionScope): 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(scope.cwd, scope.environment, scope.sessionId),\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: DoomHubChannelSource = {\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 { DoomHeadlessTool, DoomHeadlessToolResult } 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): DoomHeadlessToolResult {\n if (typeof value === 'object' && value !== null && 'content' in value) return value as DoomHeadlessToolResult;\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): DoomHeadlessToolResult {\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<DoomHeadlessToolResult> {\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\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): DoomHeadlessTool<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 async execute(_toolCallId, rawParams, signal, onUpdate) {\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 };\n}\n","import type { WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { DoomHeadlessExecutionContext } from '@agimon-ai/po-core/headless';\nimport type { DoomServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport { COMMAND_NAME } from '../../../../../../constants/task';\nimport { reducerAction } from '../../../../../../services/taskTool';\nimport type { TaskServerScope } from '../../_lib/root.server';\n\nexport default (context: WithRoot<DoomServerPluginContext, TaskServerScope>) => ({\n name: COMMAND_NAME,\n description: 'List or clear the persistent task graph.',\n async execute(args: string, commandContext: DoomHeadlessExecutionContext) {\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 type { WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport { activeTaskSnapshots, formatTaskSnapshots } from '../../../../../../services/contextContribution';\nimport type { TaskServerScope } from '../../_lib/root.server';\n\nexport default (context: WithRoot<DoomServerPluginContext, TaskServerScope>) => ({\n name: 'po/task-board',\n kind: 'context' as const,\n /**\n * The same bounded projection the Pi facet 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 { DoomServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport { createHeadlessTaskTool } from '../../../../../../services/taskTool';\nimport type { TaskServerScope } from '../../_lib/root.server';\n\nexport default defineServerTool((context: WithRoot<DoomServerPluginContext, 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 DoomServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport channelTaskGraph from '../src/extensions/(backend)/channel/task-graph.server';\nimport commandTasks from '../src/extensions/workspaces/sessions/(backend)/command/tasks.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;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/po-task',\n providerOverrides: composeServerProviderOverrides(rootSession),\n global: () => ({\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'task_graph' }, channelTaskGraph())]; },\n }),\n workspace: () => ({\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'task_graph' }, channelTaskGraph())]; },\n }),\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'task_graph' }, channelTaskGraph())]; },\n get commands(): DoomServerSessionPlugin['commands'] { return [via({ name: 'tasks' }, at(commandTasks, contextSession))]; },\n get resources(): DoomServerSessionPlugin['resources'] { return [at(resourceTaskBoard, contextSession)]; },\n get tools(): DoomServerSessionPlugin['tools'] { return [via({ name: 'task' }, at(toolTask, contextSession))]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.mjs","names":["contribution","contribution","contribution","contribution","contribution","rootSession","channelTaskGraph","commandTasks","resourceTaskBoard","toolTask"],"sources":["../../src/services/contextContribution/index.ts","../../src/services/delegationPlatform/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/services/taskTool/index.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/_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","/** 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 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 {\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 } from '@agimon-ai/po-core/extensionFile';\nimport { createPoReadinessCoordinator, readPoReadinessCoordinator } from '@agimon-ai/po-core/readiness';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\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 { 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 headless facet 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 facet\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 facet, 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 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 unwatch?.();\n background?.dispose();\n manager.dispose();\n store.dispose();\n await ownedReadiness.dispose();\n await reporter.shutdown();\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.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 { 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\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 async execute(_toolCallId, rawParams, signal, onUpdate) {\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 };\n}\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/serverFacet';\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 type { WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\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 facet 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/serverFacet';\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/serverFacet';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport channelTaskGraph from '../src/extensions/(backend)/channel/task-graph.server';\nimport commandTasks from '../src/extensions/workspaces/sessions/(backend)/command/tasks.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;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/po-task',\n providerOverrides: composeServerProviderOverrides(rootSession),\n global: () => ({\n get channels(): PoServerSessionPlugin['channels'] { return [() => via({ frameType: 'task_graph' }, channelTaskGraph())]; },\n }),\n workspace: () => ({\n get channels(): PoServerSessionPlugin['channels'] { return [() => via({ frameType: 'task_graph' }, channelTaskGraph())]; },\n }),\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get channels(): PoServerSessionPlugin['channels'] { return [() => via({ frameType: 'task_graph' }, channelTaskGraph())]; },\n get commands(): PoServerSessionPlugin['commands'] { return [via({ name: 'tasks' }, at(commandTasks, contextSession))]; },\n get resources(): PoServerSessionPlugin['resources'] { return [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 facet;\n"],"mappings":"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"}
|
package/dist/extensions/web.mjs
CHANGED
|
@@ -147,7 +147,7 @@ const DESCRIPTION_ROWS = 5;
|
|
|
147
147
|
const MESSAGE_ROWS = 4;
|
|
148
148
|
function FieldLabel({ children }) {
|
|
149
149
|
return /* @__PURE__ */ jsx("span", {
|
|
150
|
-
className: "text-base font-medium text-
|
|
150
|
+
className: "text-base font-medium text-po-text",
|
|
151
151
|
children
|
|
152
152
|
});
|
|
153
153
|
}
|
|
@@ -160,7 +160,7 @@ function Field({ label, children }) {
|
|
|
160
160
|
function ReadOnlyValue({ value, testId }) {
|
|
161
161
|
return /* @__PURE__ */ jsx("span", {
|
|
162
162
|
"data-testid": testId,
|
|
163
|
-
className: "whitespace-pre-wrap break-words text-base leading-relaxed text-
|
|
163
|
+
className: "whitespace-pre-wrap break-words text-base leading-relaxed text-po-dim",
|
|
164
164
|
children: value
|
|
165
165
|
});
|
|
166
166
|
}
|
|
@@ -243,7 +243,7 @@ function TaskDetailDialog({ task, sessionId, mode: initialMode, send, onClose })
|
|
|
243
243
|
children: [/* @__PURE__ */ jsx(DialogHeader, { children: /* @__PURE__ */ jsxs("div", {
|
|
244
244
|
className: "flex min-w-0 flex-col items-start gap-1 sm:flex-row sm:items-center sm:gap-2.5",
|
|
245
245
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
246
|
-
className: "text-sm text-
|
|
246
|
+
className: "text-sm text-po-dim",
|
|
247
247
|
children: ["task #", task.id]
|
|
248
248
|
}), /* @__PURE__ */ jsx(DialogTitle, {
|
|
249
249
|
"data-testid": "task-detail-title",
|
|
@@ -326,7 +326,7 @@ function TaskDetailDialog({ task, sessionId, mode: initialMode, send, onClose })
|
|
|
326
326
|
className: "flex-wrap sm:flex-nowrap",
|
|
327
327
|
children: [
|
|
328
328
|
/* @__PURE__ */ jsx("span", {
|
|
329
|
-
className: "w-full text-sm text-
|
|
329
|
+
className: "w-full text-sm text-po-dim sm:w-auto",
|
|
330
330
|
children: "saved as one prompt naming only the fields you changed"
|
|
331
331
|
}),
|
|
332
332
|
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1" }),
|
|
@@ -361,7 +361,7 @@ function TaskDetailDialog({ task, sessionId, mode: initialMode, send, onClose })
|
|
|
361
361
|
className: "flex-wrap sm:flex-nowrap",
|
|
362
362
|
children: [
|
|
363
363
|
/* @__PURE__ */ jsx("span", {
|
|
364
|
-
className: "w-full text-sm text-
|
|
364
|
+
className: "w-full text-sm text-po-dim sm:w-auto",
|
|
365
365
|
children: "steers the run, it does not edit the task"
|
|
366
366
|
}),
|
|
367
367
|
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1" }),
|
|
@@ -413,10 +413,10 @@ function TaskRow({ task, sessionId, sendSessionFrame, openDialog }) {
|
|
|
413
413
|
"data-testid": `activity-task-title-${task.id}`,
|
|
414
414
|
title: task.subject,
|
|
415
415
|
onClick: () => openDialog("view"),
|
|
416
|
-
className: `min-h-6 min-w-0 truncate text-left text-base font-semibold hover:underline ${task.status === "failed" ? "text-
|
|
416
|
+
className: `min-h-6 min-w-0 truncate text-left text-base font-semibold hover:underline ${task.status === "failed" ? "text-po-red" : task.status === "completed" ? "text-po-dim" : "text-po-hi"}`,
|
|
417
417
|
children: [
|
|
418
418
|
/* @__PURE__ */ jsxs("span", {
|
|
419
|
-
className: "text-
|
|
419
|
+
className: "text-po-dim",
|
|
420
420
|
children: ["#", task.id]
|
|
421
421
|
}),
|
|
422
422
|
" ",
|
|
@@ -424,7 +424,7 @@ function TaskRow({ task, sessionId, sendSessionFrame, openDialog }) {
|
|
|
424
424
|
]
|
|
425
425
|
}),
|
|
426
426
|
/* @__PURE__ */ jsx("span", {
|
|
427
|
-
className: "shrink-0 text-sm text-
|
|
427
|
+
className: "shrink-0 text-sm text-po-dim",
|
|
428
428
|
children: task.status.replace("_", " ")
|
|
429
429
|
}),
|
|
430
430
|
task.status !== "completed" && task.status !== "deleted" ? /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
|
|
@@ -435,7 +435,7 @@ function TaskRow({ task, sessionId, sendSessionFrame, openDialog }) {
|
|
|
435
435
|
"data-testid": `activity-task-menu-${task.id}`,
|
|
436
436
|
"aria-label": `task #${task.id} actions`,
|
|
437
437
|
title: `task #${task.id} actions`,
|
|
438
|
-
className: "self-center shrink-0 text-
|
|
438
|
+
className: "self-center shrink-0 text-po-faint hover:bg-po-deep hover:text-po-hi data-[state=open]:bg-po-deep data-[state=open]:text-po-hi",
|
|
439
439
|
children: /* @__PURE__ */ jsx(KebabIcon, { className: "h-3 w-3" })
|
|
440
440
|
})
|
|
441
441
|
}), /* @__PURE__ */ jsxs(DropdownMenuContent, {
|
|
@@ -461,7 +461,7 @@ function TaskRow({ task, sessionId, sendSessionFrame, openDialog }) {
|
|
|
461
461
|
})] }) : null
|
|
462
462
|
]
|
|
463
463
|
}), detail || agent || task.blockedBy.length > 0 ? /* @__PURE__ */ jsxs("span", {
|
|
464
|
-
className: "truncate pl-3 text-sm text-
|
|
464
|
+
className: "truncate pl-3 text-sm text-po-dim",
|
|
465
465
|
children: [
|
|
466
466
|
agent ? `[${agent}] ` : "",
|
|
467
467
|
detail ?? "",
|
|
@@ -507,15 +507,15 @@ function TasksActivitySection({ sessionId, sendSessionFrame }) {
|
|
|
507
507
|
size: "xs",
|
|
508
508
|
"aria-expanded": historyOpen,
|
|
509
509
|
onClick: () => setHistoryOpen((open) => !open),
|
|
510
|
-
className: "justify-start gap-1.5 rounded-md px-1 py-0.5 hover:bg-
|
|
510
|
+
className: "justify-start gap-1.5 rounded-md px-1 py-0.5 hover:bg-po-panel",
|
|
511
511
|
children: [
|
|
512
|
-
historyOpen ? /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-2.5 w-2.5 text-
|
|
512
|
+
historyOpen ? /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-2.5 w-2.5 text-po-faint" }) : /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-2.5 w-2.5 text-po-faint" }),
|
|
513
513
|
/* @__PURE__ */ jsx("span", {
|
|
514
|
-
className: "text-base font-medium text-
|
|
514
|
+
className: "text-base font-medium text-po-dim",
|
|
515
515
|
children: "session"
|
|
516
516
|
}),
|
|
517
517
|
/* @__PURE__ */ jsx("span", {
|
|
518
|
-
className: "text-2xs text-
|
|
518
|
+
className: "text-2xs text-po-faint",
|
|
519
519
|
children: history.length
|
|
520
520
|
})
|
|
521
521
|
]
|
|
@@ -840,11 +840,11 @@ function taskResultView(input) {
|
|
|
840
840
|
//#endregion
|
|
841
841
|
//#region src/extensions/workspaces/sessions/(frontend)/tool/_lib/TaskToolMessage.tsx
|
|
842
842
|
const STATUS_TONE = {
|
|
843
|
-
pending: "text-
|
|
844
|
-
in_progress: "text-
|
|
845
|
-
completed: "text-
|
|
846
|
-
failed: "text-
|
|
847
|
-
deleted: "text-
|
|
843
|
+
pending: "text-po-dim",
|
|
844
|
+
in_progress: "text-po-yellow",
|
|
845
|
+
completed: "text-po-green",
|
|
846
|
+
failed: "text-po-red",
|
|
847
|
+
deleted: "text-po-dim"
|
|
848
848
|
};
|
|
849
849
|
const RESULT_TONE = {
|
|
850
850
|
running: "running",
|
|
@@ -864,15 +864,15 @@ function TaskRowLine({ row }) {
|
|
|
864
864
|
children: row.glyph
|
|
865
865
|
}),
|
|
866
866
|
/* @__PURE__ */ jsxs("span", {
|
|
867
|
-
className: "shrink-0 text-
|
|
867
|
+
className: "shrink-0 text-po-dim",
|
|
868
868
|
children: ["#", row.id]
|
|
869
869
|
}),
|
|
870
870
|
/* @__PURE__ */ jsxs("span", {
|
|
871
|
-
className: `min-w-0 flex-1 truncate text-base font-semibold ${row.closed ? "text-
|
|
871
|
+
className: `min-w-0 flex-1 truncate text-base font-semibold ${row.closed ? "text-po-dim line-through" : row.status === "in_progress" ? "text-po-blue" : "text-po-hi"}`,
|
|
872
872
|
children: [
|
|
873
873
|
row.subject,
|
|
874
874
|
row.agent ? /* @__PURE__ */ jsxs("span", {
|
|
875
|
-
className: "text-
|
|
875
|
+
className: "text-po-dim",
|
|
876
876
|
children: [
|
|
877
877
|
" [",
|
|
878
878
|
row.agent,
|
|
@@ -880,7 +880,7 @@ function TaskRowLine({ row }) {
|
|
|
880
880
|
]
|
|
881
881
|
}) : null,
|
|
882
882
|
row.activeForm ? /* @__PURE__ */ jsxs("span", {
|
|
883
|
-
className: "text-
|
|
883
|
+
className: "text-po-dim",
|
|
884
884
|
children: [
|
|
885
885
|
" (",
|
|
886
886
|
row.activeForm,
|
|
@@ -888,7 +888,7 @@ function TaskRowLine({ row }) {
|
|
|
888
888
|
]
|
|
889
889
|
}) : null,
|
|
890
890
|
row.blockedBy.length > 0 ? /* @__PURE__ */ jsxs("span", {
|
|
891
|
-
className: "text-
|
|
891
|
+
className: "text-po-dim",
|
|
892
892
|
children: [" ⛓ ", row.blockedBy.map((id) => `#${id}`).join(",")]
|
|
893
893
|
}) : null
|
|
894
894
|
]
|
|
@@ -939,7 +939,7 @@ function TaskToolMessage({ args, result, output, running, isError }) {
|
|
|
939
939
|
className: "flex min-w-0 flex-1 items-center gap-1.5",
|
|
940
940
|
children: [
|
|
941
941
|
/* @__PURE__ */ jsxs("span", {
|
|
942
|
-
className: "shrink-0 text-base font-semibold text-
|
|
942
|
+
className: "shrink-0 text-base font-semibold text-po-text",
|
|
943
943
|
children: [
|
|
944
944
|
call.glyph,
|
|
945
945
|
" ",
|
|
@@ -947,11 +947,11 @@ function TaskToolMessage({ args, result, output, running, isError }) {
|
|
|
947
947
|
]
|
|
948
948
|
}),
|
|
949
949
|
call.subject ? /* @__PURE__ */ jsx("span", {
|
|
950
|
-
className: `min-w-0 truncate text-base font-semibold ${call.subjectTone === "accent" ? "text-
|
|
950
|
+
className: `min-w-0 truncate text-base font-semibold ${call.subjectTone === "accent" ? "text-po-blue" : "text-po-hi"}`,
|
|
951
951
|
children: call.subject
|
|
952
952
|
}) : null,
|
|
953
953
|
call.detail ? /* @__PURE__ */ jsx("span", {
|
|
954
|
-
className: "shrink-0 text-
|
|
954
|
+
className: "shrink-0 text-po-dim",
|
|
955
955
|
children: call.detail
|
|
956
956
|
}) : null
|
|
957
957
|
]
|
|
@@ -965,7 +965,7 @@ function TaskToolMessage({ args, result, output, running, isError }) {
|
|
|
965
965
|
children: view.rows.map((row) => /* @__PURE__ */ jsx(TaskRowLine, { row }, row.id))
|
|
966
966
|
}) : null,
|
|
967
967
|
view.errorLines.length > 0 ? /* @__PURE__ */ jsx("pre", {
|
|
968
|
-
className: "whitespace-pre-wrap break-words font-mono text-
|
|
968
|
+
className: "whitespace-pre-wrap break-words font-mono text-po-dim",
|
|
969
969
|
children: view.errorLines.join("\n")
|
|
970
970
|
}) : null,
|
|
971
971
|
!expanded && hidden > 0 ? /* @__PURE__ */ jsxs(MessageItemStatus, {
|