Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .agents/durable-facts.jsonl
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@
{"id": "2026-09-16-agent-delegation-toolkit", "recorded_at": "2026-09-16T22:43:16Z", "scope": "server/mcp-delegation", "fact": "Agent delegation is a sidecar MCP toolkit (delegate_thread, delegated_thread_status, delegated_thread_result, send_to_delegated_thread, interrupt_delegated_thread) over existing orchestration commands and projections, with no events, decider branches, projectors, or migrations. A child thread's id is delegated:<parentThreadId>:<first 16 hex of sha256(parent + newline + key)>; ownership, one-level depth, and the eight-live-children limit all derive from that id. The delegation capability is minted only when enableAgentDelegation is on and never for a delegated: thread. Creates, meta updates, and turn starts use deterministic command ids; deletes and interrupts use a unique id per call. Waits are capped at 45 seconds because Prime Agent's MCP client cancels tool calls at 60 seconds. Only a starting session counts as pending admission, and a child is discarded as a crash orphan only with no initial message, session, turn, or rollback.", "source_commits": ["c09309c94fac140d05d0f74c0fce88aa27d9cabf"], "source_paths": ["apps/server/src/mcp/toolkits/delegation/logic.ts", "apps/server/src/mcp/toolkits/delegation/handlers.ts", "apps/server/src/mcp/toolkits/delegation/tools.ts", "apps/server/src/provider/Layers/ProviderService.ts", "docs/internals/delegation.md", "docs/user/agent-delegation.md"], "supersedes": []}
{"id":"2026-09-17-agent-delegation-defaults","recorded_at":"2026-09-17T05:19:42Z","scope":"server/mcp-delegation","fact":"Delegation defaults are project-scoped settings: delegationDefaultModelSelection (null by default) and delegationChildRuntimeMode (inherit or approval-required). An agent-named provider always wins and ignores the default; with no provider, the default supplies the provider, plus its model and options unless the agent named a model, in which case the default options are dropped. With neither, delegate_thread fails with DelegationDefaultMissingError instead of guessing, and an unavailable default provider is an error, never a fallback. The child mode default applies only when the agent passes no runtimeMode, and every mode still resolves to the parent mode or approval-required, never broader. Model selections are whole values: the server patch and the web project-scope write both replace them instead of deep-merging, so a stale options object cannot survive a model change. Harnesses whose session holds the delegation capability get a <pylon_delegation> block in their runtime instructions; Prime Agent receives no Pylon runtime instructions and relies on the delegate_thread tool description for the same guidance.","source_commits":["3cfc8c3fbd0e4e4db10e7c6d2e79db86e0f0e748"],"source_paths":["packages/contracts/src/settings.ts","packages/shared/src/serverSettings.ts","apps/server/src/mcp/toolkits/delegation/logic.ts","apps/server/src/mcp/toolkits/delegation/handlers.ts","apps/server/src/mcp/toolkits/delegation/tools.ts","apps/server/src/provider/RuntimeInstructions.ts","apps/web/src/components/settings/scopedSettings.ts","apps/web/src/components/settings/ProjectDefaultsSettings.tsx","docs/internals/delegation.md","docs/user/agent-delegation.md"],"supersedes":[]}
{"id":"2026-09-18-delegation-follow-through-observation","recorded_at":"2026-09-18T05:16:26Z","scope":"server/mcp-delegation","fact":"Automatic delegation follow-through is not a pure sidecar: it adds the internal thread.delegation.follow-through command, a decider admission branch, and two projection queries, so removing delegation means removing those with the toolkit and reactor. The reactor's observeDelegatedChild must agree with the toolkit's deriveDelegatedThreadState for completed children: a completed turn is observed as completed even when the session was stopped afterwards by a restart or the idle reaper, and only a non-terminal turn on a stopped session reads as interrupted. At startup every child whose observation key differs from the persisted one is baselined, never delivered.","source_commits":["6b71f09db74029e5d6d12dceb0b1997bae35394e"],"source_paths":["apps/server/src/orchestration/delegationFollowThrough.logic.ts","apps/server/src/orchestration/DelegationFollowThroughReactor.ts","docs/internals/delegation.md"],"supersedes":["2026-09-16-agent-delegation-toolkit"]}
{"id":"2026-09-19-pylon-pair-delegation-removed","recorded_at":"2026-09-19T19:23:58.045941Z","scope":"server/mcp-delegation","fact":"Pylon pair mode and cross-provider thread delegation are removed. No pair/delegation MCP tools, shipped delegation skill, runtime routing protocol, follow-through command/reactor, executor lifecycle, settings, or native-subagent restrictions remain. Use provider-native subagents according to the user's instructions. Existing executor/child threads and history remain ordinary threads; no cleanup deletes them. New threads avoid pair-era provider context and per-session settings. Browser, device, computer, pull-request tools, opaque mobile draft IDs, whole-value model settings replacement, and shared-workspace rewind protection are preserved.","source_commits":["aca701395284523cfee09c3061cd0f1a463970a2"],"source_paths":["apps/server/src/mcp/McpHttpServer.ts","apps/server/src/provider/RuntimeInstructions.ts","apps/server/src/provider/Layers/ProviderService.ts","docs/user/updating.md"],"supersedes":["2026-09-16-agent-delegation-toolkit","2026-09-17-agent-delegation-defaults","2026-09-18-delegation-follow-through-observation"]}
36 changes: 0 additions & 36 deletions .agents/skills/pylon-delegation/SKILL.md

This file was deleted.

4 changes: 0 additions & 4 deletions .agents/skills/pylon-delegation/agents/openai.yaml

This file was deleted.

4 changes: 1 addition & 3 deletions apps/mobile/src/features/home/HomeRouteScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { useEffect, useMemo, useState } from "react";
import { Platform, useWindowDimensions } from "react-native";

import { NativeHeaderToolbar, NativeStackScreenOptions } from "../../native/StackHeader";
import { withoutPairExecutors } from "@t3tools/client-runtime/state/pair";
import { useProjects, useThreadShells } from "../../state/entities";
import { usePendingNewTasks } from "../../state/use-pending-new-tasks";
import { useWorkspaceState } from "../../state/workspace";
Expand All @@ -30,8 +29,7 @@ export function HomeRouteScreen() {
const { width: windowWidth } = useWindowDimensions();
const { layout } = useAdaptiveWorkspaceLayout();
const projects = useProjects();
const threadShells = useThreadShells();
const threads = useMemo(() => withoutPairExecutors(threadShells), [threadShells]);
const threads = useThreadShells();
const { environments: workspaceEnvironments, state: catalogState } = useWorkspaceState();
const { savedConnectionsById } = useSavedRemoteConnections();
const navigation = useNavigation();
Expand Down
54 changes: 0 additions & 54 deletions apps/mobile/src/features/threads/PairStatusNotice.test.tsx

This file was deleted.

44 changes: 0 additions & 44 deletions apps/mobile/src/features/threads/PairStatusNotice.tsx

This file was deleted.

52 changes: 0 additions & 52 deletions apps/mobile/src/features/threads/ThreadComposer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -168,13 +168,10 @@ import {
} from "../voice-input/ComposerDictationControl";
import { useVoiceInputController } from "../voice-input/useVoiceInputController";
import { resolveVoiceComposerPresentation } from "../voice-input/voiceInputPresentation";
import { pairSettingsRow, type PairLead } from "@t3tools/client-runtime/state/pair-control";
import { delegatedParentThreadId } from "@t3tools/shared/delegatedThreads";
import {
type ExistingThreadSettingsRouteSession,
useExistingThreadSettingsRoutePresentation,
} from "./ThreadSettingsSheet";
import { usePairToggle } from "./usePairToggle";
import {
useThreadSettingsSheetPresentation,
type NavigationWithFinishTransitioning,
Expand Down Expand Up @@ -1565,53 +1562,6 @@ export const ThreadComposer = memo(function ThreadComposer(props: ThreadComposer
}),
[currentModelOption?.capabilities, currentModelSelection.options],
);
const isDelegatedThread = delegatedParentThreadId(props.selectedThread.id) !== null;
const lead = useMemo<PairLead>(
() => ({
id: props.selectedThread.id,
projectId: props.selectedThread.projectId,
title: props.selectedThread.title,
runtimeMode: props.selectedThread.runtimeMode,
branch: props.selectedThread.branch,
worktreePath: props.selectedThread.worktreePath,
session: props.selectedThread.session,
}),
[props.selectedThread],
);
const leadDriverKind = composerAuthority.provider?.driver ?? null;
const {
state: pairState,
executorSelection,
lockedReason: pairLockedReasonValue,
onToggle: onTogglePair,
} = usePairToggle({
environmentId: props.environmentId,
projectId: props.selectedThread.projectId,
lead,
leadDriverKind,
});
const executorLabel = executorSelection?.model ?? "";
const pairRow = useMemo(
() =>
pairSettingsRow({
state: pairState,
lockedReason: pairLockedReasonValue,
executorSelection,
executorLabel,
}),
[executorLabel, executorSelection, pairLockedReasonValue, pairState],
);
const pairSession = useMemo(
() =>
isDelegatedThread
? undefined
: {
...pairRow,
onToggle: onTogglePair,
},
[isDelegatedThread, onTogglePair, pairRow],
);

const settingsOwnerId = composerOwnerKey;
const settingsRouteSession = useMemo<ExistingThreadSettingsRouteSession>(
() => ({
Expand All @@ -1633,14 +1583,12 @@ export const ThreadComposer = memo(function ThreadComposer(props: ThreadComposer
if (!props.sessionInputBlocked) props.onUpdateRuntimeMode(mode);
},
getModelDisabledReason: getModelChangeDisabledReason,
...(pairSession ? { pair: pairSession } : {}),
}),
[
confirmSessionHarnessRefinement,
currentModelSelection,
currentRuntimeMode,
getModelChangeDisabledReason,
pairSession,
props.onUpdateModelSelection,
props.onUpdateRuntimeMode,
props.sessionInputBlocked,
Expand Down
Loading
Loading