Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
dd5d286
refactor(agent-core-v2): unify model-facing reminder scheduling
7Sageer Aug 5, 2026
2fb23f4
fix(agent-core-v2): make system reminders undo-aware
7Sageer Aug 5, 2026
d1551a0
test(agent-core-v2): migrate plugin session-start harness
7Sageer Aug 5, 2026
2f22d1a
Merge remote-tracking branch 'origin/main' into refactor/system-reminder
7Sageer Aug 5, 2026
a6edc7b
fix(agent-core-v2): preserve reminder boundary ordering
7Sageer Aug 5, 2026
da7f6b5
refactor(agent-core-v2): narrow reminder and swarm helper exposure
7Sageer Aug 5, 2026
23b1e75
chore(agent-core-v2): keep comments in module headers
7Sageer Aug 5, 2026
81864fb
refactor(agent-core-v2): track reminder state via injection disclosure
7Sageer Aug 5, 2026
15ef35c
fix(agent-core-v2): isolate failing turn-start providers and warn onc…
7Sageer Aug 5, 2026
61f5242
refactor(agent-core-v2): compute injection positions on read
7Sageer Aug 6, 2026
8a86747
refactor(agent-core-v2): formalize injector once-channels and raw mes…
7Sageer Aug 6, 2026
54e1091
refactor(agent-core-v2): declare dynamic tool schemas at injection bo…
7Sageer Aug 6, 2026
9cb3076
refactor(agent-core-v2): deliver AGENTS.md reminders through the remi…
7Sageer Aug 6, 2026
167f23d
refactor(agent-core-v2): make injection disclosures opaque and domain…
7Sageer Aug 6, 2026
f2b9fc6
fix(agent-core-v2): isolate failing step context providers
7Sageer Aug 6, 2026
774b3e8
refactor(agent-core-v2): derive injector isNewTurn per injection boun…
7Sageer Aug 6, 2026
b955966
refactor(agent-core-v2): unify disclosure placement and injector para…
7Sageer Aug 6, 2026
49d7dfa
fix(agent-core-v2): keep pending tool schemas across compaction splices
7Sageer Aug 6, 2026
04195a7
fix(agent-core-v2): consume the plugin session-start refresh after a …
7Sageer Aug 6, 2026
c6033dd
refactor(agent-core-v2): remove the generic reminder queue
7Sageer Aug 6, 2026
6039100
chore(agent-core-v2): drop the stale reminder-queue mention in system…
7Sageer Aug 6, 2026
fdf26fc
Merge remote-tracking branch 'origin/main' into refactor/system-reminder
7Sageer Aug 6, 2026
bb906b6
test(node-sdk): align side-question fork parity with event-point remi…
7Sageer Aug 11, 2026
7ff94a5
Merge remote-tracking branch 'origin/main' into refactor/system-reminder
7Sageer Aug 11, 2026
dcf4548
chore(agent-core-v2): address reminder review standards
7Sageer Aug 11, 2026
2cada79
docs(agent-core-v2): condense the model-facing reminders section
7Sageer Aug 11, 2026
76073d7
refactor(agent-core-v2): write all system reminders through wrapSyste…
7Sageer Aug 11, 2026
d5cf43f
fix(agent-core-v2): preserve reminder lifecycle invariants
7Sageer Aug 11, 2026
6440b56
refactor(agent-core-v2): reconcile context injections at the step head
7Sageer Aug 12, 2026
b3c32fe
refactor(agent-core-v2): clarify the injector's step-hook handler
7Sageer Aug 12, 2026
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
4 changes: 4 additions & 0 deletions packages/agent-core-v2/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,10 @@ Business code must not `import 'node:fs'`, write SQL, hand-roll append-logs / at

`context.undo` is the only persisted undo fact. `contextMemory/conversationTime.ts` owns the conversation clock (`isUndoAnchor` — the single tick predicate used by `computeUndoCut`, the checkpoint reducers, and the transcript reducer) and the checkpoint protocol. A wire Model whose state must follow conversation undo (todo, plan, task-notification delivery, …) **MUST** be defined with `defineCheckpointedModel` — never hand-roll the push/clear/restore reducers — which also registers it into `CHECKPOINTED_MODELS` for the undo pipeline's pre-cut depth check. World-time state (turn counters, task registries, revision counters) must stay outside checkpointed Models.

## Model-facing reminders

Two delivery paths only — never introduce a third (no deferred-delivery queues, no mid-step splice channels): reminders that restate current state (goal state, plan mode, date change, …) register a `contextInjector` provider (`register`) that reconciles at every step head (before the step's request is built) and re-emits after compaction or undo; reminders that report a one-off event (goal cancelled, AGENTS.md discovered, `/init` finished, …) append at the event point through `IAgentSystemReminderService.appendSystemReminder` with origin `{ kind: 'injection', variant: '<domain_fact>' }`, where the event point must itself be a safe position (a step/restore hook, an idle moment, or the loop-event fold's deferred append). `kind: 'injection'` is a lifecycle classification (hidden from the UI, not an undo anchor, dropped by compaction), not a provenance claim; prompt-owned attachments additionally carry `ownerPromptId` so undo treats them as part of their host prompt.

## Docs

Per-domain references live in `docs/`.
Expand Down
32 changes: 7 additions & 25 deletions packages/agent-core-v2/docs/state-manifest.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
// references become '(circular)', and class instances collapse to a '(ClassName)'
// marker — the wire shape of an entry is the JSON projection of the type here.
//
// Index (App: 0 keys · Workspace: 6 keys · Session: 18 keys · Agent: 70 keys)
// Index (App: 0 keys · Workspace: 6 keys · Session: 18 keys · Agent: 69 keys)
// App
// Workspace
// workspaceDirs.ephemeralDirs src/workspace/workspaceDirs/workspaceDirsService.ts
Expand Down Expand Up @@ -57,10 +57,10 @@
// activityView.lastTurn src/agent/activityView/activityViewService.ts
// activityView.lifecycle src/agent/activityView/activityViewService.ts
// activityView.turn src/agent/activityView/activityViewService.ts
// agentPlugin.sessionStartRefreshPending src/agent/plugin/agentPluginService.ts
// agentsMdReminder.cwd src/agent/agentsMdReminder/agentsMdReminderService.ts
// agentsMdReminder.known src/agent/agentsMdReminder/agentsMdReminderService.ts
// agentsMdReminder.seeded src/agent/agentsMdReminder/agentsMdReminderService.ts
// contextInjector.isNewTurn src/agent/contextInjector/contextInjectorService.ts
// contextProjector.lastRepairSignature src/agent/contextProjector/contextProjectorService.ts
// dateChange.seed src/agent/dateChange/dateChangeService.ts
// externalHooks.stopHookContinuationUsed src/agent/externalHooks/externalHooksService.ts
Expand Down Expand Up @@ -118,7 +118,6 @@
// toolDedupe.syntheticCallIds src/agent/toolDedupe/toolDedupeService.ts
// toolExecutor.dupTypeTurnId src/agent/toolExecutor/toolExecutorService.ts
// toolExecutor.toolCallDupTypes src/agent/toolExecutor/toolExecutorService.ts
// toolSelect.needsBoundaryInjection src/agent/toolSelect/toolSelectAnnouncementsService.ts
// toolSelect.pendingLoaded src/agent/toolSelect/toolSelectService.ts
// usage.currentTurn src/agent/usage/usageService.ts
// usage.currentTurnId src/agent/usage/usageService.ts
Expand Down Expand Up @@ -752,12 +751,7 @@ export interface AgentStateSnapshot {
readonly kind: 'injection';
readonly variant: string;
readonly ownerPromptId?: string;
readonly disclosure?: /* ContextInjectionDisclosure — packages/agent-core-v2/src/agent/contextMemory/types.ts */ {
readonly kind: 'date';
readonly renderGeneration: number;
readonly localDate: string;
readonly timeZone: string;
};
readonly disclosure?: unknown;
} | /* ShellCommandOrigin — packages/agent-core-v2/src/agent/contextMemory/types.ts */ {
readonly kind: 'shell_command';
readonly phase: 'input' | 'output';
Expand Down Expand Up @@ -882,12 +876,7 @@ export interface AgentStateSnapshot {
readonly kind: 'injection';
readonly variant: string;
readonly ownerPromptId?: string;
readonly disclosure?: /* ContextInjectionDisclosure — packages/agent-core-v2/src/agent/contextMemory/types.ts */ {
readonly kind: 'date';
readonly renderGeneration: number;
readonly localDate: string;
readonly timeZone: string;
};
readonly disclosure?: unknown;
} | /* ShellCommandOrigin — packages/agent-core-v2/src/agent/contextMemory/types.ts */ {
readonly kind: 'shell_command';
readonly phase: 'input' | 'output';
Expand Down Expand Up @@ -944,12 +933,7 @@ export interface AgentStateSnapshot {
readonly kind: 'injection';
readonly variant: string;
readonly ownerPromptId?: string;
readonly disclosure?: /* ContextInjectionDisclosure — packages/agent-core-v2/src/agent/contextMemory/types.ts */ {
readonly kind: 'date';
readonly renderGeneration: number;
readonly localDate: string;
readonly timeZone: string;
};
readonly disclosure?: unknown;
} | /* ShellCommandOrigin — packages/agent-core-v2/src/agent/contextMemory/types.ts */ {
readonly kind: 'shell_command';
readonly phase: 'input' | 'output';
Expand Down Expand Up @@ -1012,8 +996,6 @@ export interface AgentStateSnapshot {
'agentsMdReminder.cwd': string | undefined;
'agentsMdReminder.known': Set<string>;
'agentsMdReminder.seeded': boolean;
// src/agent/contextInjector/contextInjectorService.ts
'contextInjector.isNewTurn': boolean;
// src/agent/contextProjector/contextProjectorService.ts
'contextProjector.lastRepairSignature': string | null;
// src/agent/dateChange/dateChangeService.ts
Expand Down Expand Up @@ -1125,6 +1107,8 @@ export interface AgentStateSnapshot {
}>;
// src/agent/permissionMode/injection/permissionModeInjection.ts
'permissionMode.lastMode': 'manual' | 'yolo' | 'auto' | undefined;
// src/agent/plugin/agentPluginService.ts
'agentPlugin.sessionStartRefreshPending': boolean;
// src/agent/profile/profileService.ts
'profile.activeToolNamesOverlay': readonly string[] | undefined;
'profile.agentsMdWarning': string | undefined;
Expand Down Expand Up @@ -1197,8 +1181,6 @@ export interface AgentStateSnapshot {
// src/agent/toolExecutor/toolExecutorService.ts
'toolExecutor.dupTypeTurnId': number | undefined;
'toolExecutor.toolCallDupTypes': Map<string, /* ToolCallDupType — packages/agent-core-v2/src/agent/toolExecutor/toolExecutor.ts */ 'same_step' | 'cross_step'>;
// src/agent/toolSelect/toolSelectAnnouncementsService.ts
'toolSelect.needsBoundaryInjection': boolean;
// src/agent/toolSelect/toolSelectService.ts
'toolSelect.pendingLoaded': Set<string>;
// src/agent/usage/usageService.ts
Expand Down
111 changes: 61 additions & 50 deletions packages/agent-core-v2/docs/wire-manifest.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,55 +21,56 @@
// owning model offloads inline media to blob storage), cross-reducers
// (foreign models that also reduce this record on dispatch and replay).

// Index (48 record types)
// config.update profile persisted src/agent/profile/profileOps.ts
// context.append_loop_event contextMemory persisted src/agent/contextMemory/contextOps.ts
// context.append_message contextMemory persisted src/agent/contextMemory/contextOps.ts
// context.apply_compaction contextMemory persisted src/agent/contextMemory/contextOps.ts
// context.clear contextMemory persisted src/agent/contextMemory/contextOps.ts
// context.undo contextMemory persisted src/agent/contextMemory/contextOps.ts
// cron.add cron transient src/session/cron/cronOps.ts
// cron.cursor cron transient src/session/cron/cronOps.ts
// cron.delete cron transient src/session/cron/cronOps.ts
// forked goal persisted src/agent/goal/goalOps.ts
// full_compaction.begin fullCompaction persisted src/agent/fullCompaction/compactionOps.ts
// full_compaction.cancel fullCompaction persisted src/agent/fullCompaction/compactionOps.ts
// full_compaction.complete fullCompaction persisted src/agent/fullCompaction/compactionOps.ts
// goal.clear goal persisted src/agent/goal/goalOps.ts
// goal.create goal persisted src/agent/goal/goalOps.ts
// goal.update goal persisted src/agent/goal/goalOps.ts
// interaction.request interaction persisted src/session/interaction/interactionOps.ts
// interaction.resolved interaction persisted src/session/interaction/interactionOps.ts
// interruptionReminder.recorded interruptionReminder persisted src/agent/interruptionReminder/interruptionReminderOps.ts
// llm.request llm.requestTrace persisted src/agent/llmRequester/llmRequestOps.ts
// llm.tools_snapshot llm.requestTrace persisted src/agent/llmRequester/llmRequestOps.ts
// mcp.tools_discovered mcp.discovery persisted src/agent/mcp/mcpDiscoveryOps.ts
// permission.record_approval_result permissionRules persisted src/agent/permissionRules/permissionRulesOps.ts
// permission.rules.add permissionRules transient src/agent/permissionRules/permissionRulesOps.ts
// permission.set_mode permissionMode persisted src/agent/permissionMode/permissionModeOps.ts
// plan_mode.cancel plan persisted src/features/plan/planOps.ts
// plan_mode.enter plan persisted src/features/plan/planOps.ts
// plan_mode.exit plan persisted src/features/plan/planOps.ts
// plan.revision plan persisted src/features/plan/planOps.ts
// profile.bind profile persisted src/agent/profile/profileOps.ts
// skill.activate skill transient src/agent/skill/skillOps.ts
// swarm_mode.enter swarm persisted src/agent/swarm/swarmOps.ts
// swarm_mode.exit swarm persisted src/agent/swarm/swarmOps.ts
// task.started task persisted src/agent/task/taskOps.ts
// task.terminated task persisted src/agent/task/taskOps.ts
// token_counting.measured tokenCounting transient src/agent/tokenCounting/tokenCountingOps.ts
// token_counting.rebased tokenCounting transient src/agent/tokenCounting/tokenCountingOps.ts
// token_counting.truncated tokenCounting transient src/agent/tokenCounting/tokenCountingOps.ts
// tools.register_user_tool userTool persisted src/agent/userTool/userToolOps.ts
// tools.reset_active_tools profile.activeTools persisted src/agent/profile/profileOps.ts
// tools.set_active_tools profile.activeTools persisted src/agent/profile/profileOps.ts
// tools.unregister_user_tool userTool persisted src/agent/userTool/userToolOps.ts
// tools.update_store todo persisted src/session/todo/todoOps.ts
// turn.cancel turn persisted src/agent/loop/turnOps.ts
// turn.ended turn persisted src/agent/loop/turnOps.ts
// turn.prompt turn persisted src/agent/loop/turnOps.ts
// turn.steer turn persisted src/agent/loop/turnOps.ts
// usage.record usage persisted src/agent/usage/usageOps.ts
// Index (49 record types)
// config.update profile persisted src/agent/profile/profileOps.ts
// context.append_loop_event contextMemory persisted src/agent/contextMemory/contextOps.ts
// context.append_message contextMemory persisted src/agent/contextMemory/contextOps.ts
// context.apply_compaction contextMemory persisted src/agent/contextMemory/contextOps.ts
// context.clear contextMemory persisted src/agent/contextMemory/contextOps.ts
// context.undo contextMemory persisted src/agent/contextMemory/contextOps.ts
// cron.add cron transient src/session/cron/cronOps.ts
// cron.cursor cron transient src/session/cron/cronOps.ts
// cron.delete cron transient src/session/cron/cronOps.ts
// forked goal persisted src/agent/goal/goalOps.ts
// full_compaction.begin fullCompaction persisted src/agent/fullCompaction/compactionOps.ts
// full_compaction.cancel fullCompaction persisted src/agent/fullCompaction/compactionOps.ts
// full_compaction.complete fullCompaction persisted src/agent/fullCompaction/compactionOps.ts
// goal.clear goal persisted src/agent/goal/goalOps.ts
// goal.create goal persisted src/agent/goal/goalOps.ts
// goal.update goal persisted src/agent/goal/goalOps.ts
// interaction.request interaction persisted src/session/interaction/interactionOps.ts
// interaction.resolved interaction persisted src/session/interaction/interactionOps.ts
// interruptionReminder.recorded interruptionReminder persisted src/agent/interruptionReminder/interruptionReminderOps.ts
// llm.request llm.requestTrace persisted src/agent/llmRequester/llmRequestOps.ts
// llm.tools_snapshot llm.requestTrace persisted src/agent/llmRequester/llmRequestOps.ts
// mcp.tools_discovered mcp.discovery persisted src/agent/mcp/mcpDiscoveryOps.ts
// permission.record_approval_result permissionRules persisted src/agent/permissionRules/permissionRulesOps.ts
// permission.rules.add permissionRules transient src/agent/permissionRules/permissionRulesOps.ts
// permission.set_mode permissionMode persisted src/agent/permissionMode/permissionModeOps.ts
// plan_mode.cancel plan persisted src/features/plan/planOps.ts
// plan_mode.enter plan persisted src/features/plan/planOps.ts
// plan_mode.exit plan persisted src/features/plan/planOps.ts
// plan.revision plan persisted src/features/plan/planOps.ts
// plugin.session_start pluginSessionStartSnapshot persisted src/agent/plugin/agentPluginOps.ts
// profile.bind profile persisted src/agent/profile/profileOps.ts
// skill.activate skill transient src/agent/skill/skillOps.ts
// swarm_mode.enter swarm persisted src/agent/swarm/swarmOps.ts
// swarm_mode.exit swarm persisted src/agent/swarm/swarmOps.ts
// task.started task persisted src/agent/task/taskOps.ts
// task.terminated task persisted src/agent/task/taskOps.ts
// token_counting.measured tokenCounting transient src/agent/tokenCounting/tokenCountingOps.ts
// token_counting.rebased tokenCounting transient src/agent/tokenCounting/tokenCountingOps.ts
// token_counting.truncated tokenCounting transient src/agent/tokenCounting/tokenCountingOps.ts
// tools.register_user_tool userTool persisted src/agent/userTool/userToolOps.ts
// tools.reset_active_tools profile.activeTools persisted src/agent/profile/profileOps.ts
// tools.set_active_tools profile.activeTools persisted src/agent/profile/profileOps.ts
// tools.unregister_user_tool userTool persisted src/agent/userTool/userToolOps.ts
// tools.update_store todo persisted src/session/todo/todoOps.ts
// turn.cancel turn persisted src/agent/loop/turnOps.ts
// turn.ended turn persisted src/agent/loop/turnOps.ts
// turn.prompt turn persisted src/agent/loop/turnOps.ts
// turn.steer turn persisted src/agent/loop/turnOps.ts
// usage.record usage persisted src/agent/usage/usageOps.ts

/**
* model: profile · persisted
Expand Down Expand Up @@ -448,6 +449,15 @@ interface PlanRevisionPayload {
bytes: number;
}

/**
* model: pluginSessionStartSnapshot · persisted
* owner: src/agent/plugin/agentPluginOps.ts
*/
interface PluginSessionStartPayload {
_name: 'plugin.session_start';
content: string | null;
}

/**
* model: profile · persisted · cross-reducers: profile.activeTools
* owner: src/agent/profile/profileOps.ts
Expand Down Expand Up @@ -610,7 +620,7 @@ interface ToolsUpdateStorePayload {
}

/**
* model: turn · persisted · cross-reducers: interruptionReminder
* model: turn · persisted
* owner: src/agent/loop/turnOps.ts
*/
interface TurnCancelPayload {
Expand Down Expand Up @@ -746,6 +756,7 @@ interface WirePayloadMap {
"plan_mode.enter": PlanModeEnterPayload;
"plan_mode.exit": PlanModeExitPayload;
"plan.revision": PlanRevisionPayload;
"plugin.session_start": PluginSessionStartPayload;
"profile.bind": ProfileBindPayload;
"skill.activate": SkillActivatePayload;
"swarm_mode.enter": SwarmModeEnterPayload;
Expand Down
Loading
Loading