agent-afk 5.303.9 → 5.304.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/memory/memory-gc-sweep.d.ts +2 -3
- package/dist/agent/memory/memory-store.schema.d.ts +2 -2
- package/dist/agent/providers/anthropic-direct/input-transformations.d.ts +2 -1
- package/dist/agent/providers/anthropic-direct/types.d.ts +1 -0
- package/dist/agent/tools/dispatcher.d.ts +1 -0
- package/dist/agent/tools/dispatcher.pre-dispatch-gates.d.ts +1 -0
- package/dist/agent/tools/pre-tool-context.d.ts +7 -0
- package/dist/agent/trace/events.d.ts +2 -0
- package/dist/agent/trace/events.session-phase.d.ts +2 -0
- package/dist/agent/trace/types.session-phase.d.ts +1 -1
- package/dist/cli.mjs +357 -342
- package/dist/config/env.d.ts +1 -1
- package/dist/config/env.memory-gc.d.ts +1 -1
- package/dist/index.mjs +159 -144
- package/dist/telegram.mjs +183 -168
- package/package.json +3 -3
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import type { FactCategory } from './types.js';
|
|
2
|
-
export declare const MEMORY_GC_MIN_AGE_DAYS_DEFAULT =
|
|
2
|
+
export declare const MEMORY_GC_MIN_AGE_DAYS_DEFAULT = 30;
|
|
3
3
|
export declare const MEMORY_GC_SWEEP_MIN_INTERVAL_MS: number;
|
|
4
4
|
export declare const MEMORY_GC_SWEEP_START_DELAY_MS = 7000;
|
|
5
|
-
export declare const MEMORY_ACCESS_TRACKING_STARTED_AT = "2026-09-23T00:00:00.000Z";
|
|
6
5
|
export declare const GC_EXCLUDED_CATEGORIES: ReadonlySet<FactCategory>;
|
|
7
6
|
export interface MemoryGcSweepOptions {
|
|
8
7
|
memoryDir?: string;
|
|
@@ -11,7 +10,7 @@ export interface MemoryGcSweepOptions {
|
|
|
11
10
|
}
|
|
12
11
|
export interface MemoryGcSweepResult {
|
|
13
12
|
skipped: boolean;
|
|
14
|
-
skipReason?: 'disabled' | 'too-soon' | 'no-db';
|
|
13
|
+
skipReason?: 'disabled' | 'too-soon' | 'no-db' | 'tracking-unknown';
|
|
15
14
|
candidates: number;
|
|
16
15
|
archived: number;
|
|
17
16
|
error?: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type BetterSqlite3 from 'better-sqlite3';
|
|
2
|
-
export declare const SCHEMA_VERSION =
|
|
3
|
-
export declare const SCHEMA_SQL = "\nCREATE TABLE IF NOT EXISTS sessions (\n session_id TEXT PRIMARY KEY,\n surface TEXT NOT NULL,\n started_at TEXT NOT NULL,\n ended_at TEXT,\n summary TEXT,\n tools_used TEXT NOT NULL DEFAULT '[]',\n outcome TEXT,\n token_count INTEGER,\n cost_usd REAL,\n -- v3: execution role 'main' | 'subagent'. Nullable (NULL on pre-v3 rows).\n -- Listed last to match the position ALTER TABLE ADD COLUMN appends it on\n -- migrated databases, so fresh and migrated DBs share one column order.\n actor TEXT\n);\n\nCREATE TABLE IF NOT EXISTS facts (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT,\n created_at TEXT NOT NULL,\n category TEXT NOT NULL CHECK(category IN ('preference', 'convention', 'decision', 'learning')),\n content TEXT NOT NULL,\n source_surface TEXT NOT NULL DEFAULT 'cli',\n superseded_by INTEGER REFERENCES facts(id),\n confidence REAL NOT NULL DEFAULT 1.0,\n access_count INTEGER NOT NULL DEFAULT 0,\n last_accessed TEXT,\n -- v4: provenance citation backing a codebase fact (file:line, commit SHA,\n -- trace-event id). Nullable (NULL on pre-v4 rows and uncited writes).\n -- Listed last to match the position ALTER TABLE ADD COLUMN appends it on\n -- migrated databases, so fresh and migrated DBs share one column order.\n evidence TEXT\n);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS facts_fts USING fts5(\n content,\n category,\n content=facts,\n content_rowid=id,\n tokenize='porter'\n);\n\nCREATE TRIGGER IF NOT EXISTS facts_ai AFTER INSERT ON facts BEGIN\n INSERT INTO facts_fts(rowid, content, category) VALUES (new.id, new.content, new.category);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS facts_ad AFTER DELETE ON facts BEGIN\n INSERT INTO facts_fts(facts_fts, rowid, content, category) VALUES ('delete', old.id, old.content, old.category);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS facts_au AFTER UPDATE ON facts BEGIN\n INSERT INTO facts_fts(facts_fts, rowid, content, category) VALUES ('delete', old.id, old.content, old.category);\n INSERT INTO facts_fts(rowid, content, category) VALUES (new.id, new.content, new.category);\nEND;\n\nCREATE INDEX IF NOT EXISTS idx_sessions_started_at ON sessions(started_at DESC);\nCREATE INDEX IF NOT EXISTS idx_facts_session_id ON facts(session_id);\n\n-- v2: Fingerprint uniqueness for WAL replay. The four-field key (content,\n-- created_at, session_id, category) is the stable identity used by supersede\n-- WAL entries to locate rows across crash+restart cycles. Without a UNIQUE\n-- constraint, same-ms duplicate inserts make .get() return an arbitrary row.\n-- NULL session_id is coerced to the empty string so it participates in the\n-- uniqueness check (SQLite treats NULLs as distinct in UNIQUE indexes).\nCREATE UNIQUE INDEX IF NOT EXISTS idx_facts_fingerprint\n ON facts(content, created_at, COALESCE(session_id, ''), category);\n";
|
|
2
|
+
export declare const SCHEMA_VERSION = 5;
|
|
3
|
+
export declare const SCHEMA_SQL = "\nCREATE TABLE IF NOT EXISTS sessions (\n session_id TEXT PRIMARY KEY,\n surface TEXT NOT NULL,\n started_at TEXT NOT NULL,\n ended_at TEXT,\n summary TEXT,\n tools_used TEXT NOT NULL DEFAULT '[]',\n outcome TEXT,\n token_count INTEGER,\n cost_usd REAL,\n -- v3: execution role 'main' | 'subagent'. Nullable (NULL on pre-v3 rows).\n -- Listed last to match the position ALTER TABLE ADD COLUMN appends it on\n -- migrated databases, so fresh and migrated DBs share one column order.\n actor TEXT\n);\n\nCREATE TABLE IF NOT EXISTS facts (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT,\n created_at TEXT NOT NULL,\n category TEXT NOT NULL CHECK(category IN ('preference', 'convention', 'decision', 'learning')),\n content TEXT NOT NULL,\n source_surface TEXT NOT NULL DEFAULT 'cli',\n superseded_by INTEGER REFERENCES facts(id),\n confidence REAL NOT NULL DEFAULT 1.0,\n access_count INTEGER NOT NULL DEFAULT 0,\n last_accessed TEXT,\n -- v4: provenance citation backing a codebase fact (file:line, commit SHA,\n -- trace-event id). Nullable (NULL on pre-v4 rows and uncited writes).\n -- Listed last to match the position ALTER TABLE ADD COLUMN appends it on\n -- migrated databases, so fresh and migrated DBs share one column order.\n evidence TEXT\n);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS facts_fts USING fts5(\n content,\n category,\n content=facts,\n content_rowid=id,\n tokenize='porter'\n);\n\nCREATE TRIGGER IF NOT EXISTS facts_ai AFTER INSERT ON facts BEGIN\n INSERT INTO facts_fts(rowid, content, category) VALUES (new.id, new.content, new.category);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS facts_ad AFTER DELETE ON facts BEGIN\n INSERT INTO facts_fts(facts_fts, rowid, content, category) VALUES ('delete', old.id, old.content, old.category);\nEND;\n\nCREATE TABLE IF NOT EXISTS memory_metadata (key TEXT PRIMARY KEY, value TEXT NOT NULL);\n\nCREATE TRIGGER IF NOT EXISTS facts_au AFTER UPDATE OF content, category ON facts BEGIN\n INSERT INTO facts_fts(facts_fts, rowid, content, category) VALUES ('delete', old.id, old.content, old.category);\n INSERT INTO facts_fts(rowid, content, category) VALUES (new.id, new.content, new.category);\nEND;\n\nCREATE INDEX IF NOT EXISTS idx_sessions_started_at ON sessions(started_at DESC);\nCREATE INDEX IF NOT EXISTS idx_facts_session_id ON facts(session_id);\n\n-- v2: Fingerprint uniqueness for WAL replay. The four-field key (content,\n-- created_at, session_id, category) is the stable identity used by supersede\n-- WAL entries to locate rows across crash+restart cycles. Without a UNIQUE\n-- constraint, same-ms duplicate inserts make .get() return an arbitrary row.\n-- NULL session_id is coerced to the empty string so it participates in the\n-- uniqueness check (SQLite treats NULLs as distinct in UNIQUE indexes).\nCREATE UNIQUE INDEX IF NOT EXISTS idx_facts_fingerprint\n ON facts(content, created_at, COALESCE(session_id, ''), category);\n";
|
|
4
4
|
export declare function runMigrations(db: BetterSqlite3.Database, existingVersion: number): void;
|
|
5
5
|
export declare function enableWalMode(db: BetterSqlite3.Database): void;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { TraceSink } from '../../trace/index.js';
|
|
1
2
|
export declare const KNOWN_DROP_REASONS: Set<string>;
|
|
2
|
-
export declare function warnOnDroppedThinkingBlocks(transformations: unknown, source: 'message_start' | 'message_delta'): void;
|
|
3
|
+
export declare function warnOnDroppedThinkingBlocks(transformations: unknown, source: 'message_start' | 'message_delta', traceWriter?: TraceSink): void;
|
|
3
4
|
export declare function _resetWarnCountForTest(): void;
|
|
@@ -93,6 +93,7 @@ export declare class SessionToolDispatcher implements ToolDispatcher {
|
|
|
93
93
|
setAllowAll(allow: boolean): void;
|
|
94
94
|
setResolveBase(newCwd: string): void;
|
|
95
95
|
get toolDefs(): readonly AnthropicToolDef[];
|
|
96
|
+
private readonly preToolContext;
|
|
96
97
|
private gateDeps;
|
|
97
98
|
private coreExecDeps;
|
|
98
99
|
private runPreDispatchGates;
|
|
@@ -31,6 +31,7 @@ export interface PreDispatchGateDeps {
|
|
|
31
31
|
resolveBase: string | undefined;
|
|
32
32
|
traceWriter: TraceSink | undefined;
|
|
33
33
|
isRegisteredTool: (toolName: string) => boolean;
|
|
34
|
+
capturePreToolContext?: (call: ToolCall, context: string) => void;
|
|
34
35
|
denialReason: (toolName: string, permissionReason: string | undefined) => string;
|
|
35
36
|
}
|
|
36
37
|
export declare function emitPreToolUseBlock(blockedTool: string, reason: string, deps: PreDispatchGateDeps): Promise<void>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ToolCall, ToolResult } from '../providers/anthropic-direct/types.js';
|
|
2
|
+
import type { TraceSink } from '../trace/index.js';
|
|
3
|
+
export declare class PreToolContext {
|
|
4
|
+
private readonly pending;
|
|
5
|
+
capture(call: ToolCall, context: string): void;
|
|
6
|
+
deliver(call: ToolCall, result: ToolResult, writer?: TraceSink): Promise<ToolResult>;
|
|
7
|
+
}
|
|
@@ -633,6 +633,7 @@ export declare const TraceEventInputSchema: z.ZodDiscriminatedUnion<[z.ZodObject
|
|
|
633
633
|
stop_hook_continuation: "stop_hook_continuation";
|
|
634
634
|
stop_hook_cap_reached: "stop_hook_cap_reached";
|
|
635
635
|
orphan_repair: "orphan_repair";
|
|
636
|
+
thinking_block_dropped: "thinking_block_dropped";
|
|
636
637
|
background_process_started: "background_process_started";
|
|
637
638
|
background_process_settled: "background_process_settled";
|
|
638
639
|
compose_recovery_decision: "compose_recovery_decision";
|
|
@@ -1052,6 +1053,7 @@ export declare const TraceEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
1052
1053
|
stop_hook_continuation: "stop_hook_continuation";
|
|
1053
1054
|
stop_hook_cap_reached: "stop_hook_cap_reached";
|
|
1054
1055
|
orphan_repair: "orphan_repair";
|
|
1056
|
+
thinking_block_dropped: "thinking_block_dropped";
|
|
1055
1057
|
background_process_started: "background_process_started";
|
|
1056
1058
|
background_process_settled: "background_process_settled";
|
|
1057
1059
|
compose_recovery_decision: "compose_recovery_decision";
|
|
@@ -43,6 +43,7 @@ export declare const SessionPhaseNameSchema: z.ZodEnum<{
|
|
|
43
43
|
stop_hook_continuation: "stop_hook_continuation";
|
|
44
44
|
stop_hook_cap_reached: "stop_hook_cap_reached";
|
|
45
45
|
orphan_repair: "orphan_repair";
|
|
46
|
+
thinking_block_dropped: "thinking_block_dropped";
|
|
46
47
|
background_process_started: "background_process_started";
|
|
47
48
|
background_process_settled: "background_process_settled";
|
|
48
49
|
compose_recovery_decision: "compose_recovery_decision";
|
|
@@ -92,6 +93,7 @@ export declare const SessionPhasePayloadSchema: z.ZodObject<{
|
|
|
92
93
|
stop_hook_continuation: "stop_hook_continuation";
|
|
93
94
|
stop_hook_cap_reached: "stop_hook_cap_reached";
|
|
94
95
|
orphan_repair: "orphan_repair";
|
|
96
|
+
thinking_block_dropped: "thinking_block_dropped";
|
|
95
97
|
background_process_started: "background_process_started";
|
|
96
98
|
background_process_settled: "background_process_settled";
|
|
97
99
|
compose_recovery_decision: "compose_recovery_decision";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type SessionPhaseName = 'bootstrap_start' | 'bootstrap_done' | 'session_init_start' | 'session_init_done' | 'mcp_connect_start' | 'mcp_connect_done' | 'mcp_server_start' | 'mcp_server_done' | 'loop_start' | 'loop_end' | 'model_ttfb' | 'context_pressure_wind_down' | 'catalog_model_upgrade' | 'interrupt_halt' | 'rate_limit' | 'ttfb_timeout' | 'usage_limit_pause' | 'usage_limit_resume' | 'overload_pause' | 'overload_resume' | 'idle_watchdog_fired' | 'pause_extension_granted' | 'suspected_loop' | 'compaction_disabled' | 'boot_warning' | 'workspace_subscribed' | 'workspace_delivery' | 'gate_shape' | 'session_id_assigned' | 'many_image_degraded' | 'stream_accepted_after_drop' | 'connection_retry' | 'connection_retry_exhausted' | 'connection_failure' | 'connection_recovered' | 'connection_budget_exhausted' | 'usage_notice' | 'tool_degraded' | 'strategy_nudge_fired' | 'stop_inject_dropped' | 'stop_hook_continuation' | 'stop_hook_cap_reached' | 'orphan_repair' | 'background_process_started' | 'background_process_settled' | 'compose_recovery_decision';
|
|
1
|
+
export type SessionPhaseName = 'bootstrap_start' | 'bootstrap_done' | 'session_init_start' | 'session_init_done' | 'mcp_connect_start' | 'mcp_connect_done' | 'mcp_server_start' | 'mcp_server_done' | 'loop_start' | 'loop_end' | 'model_ttfb' | 'context_pressure_wind_down' | 'catalog_model_upgrade' | 'interrupt_halt' | 'rate_limit' | 'ttfb_timeout' | 'usage_limit_pause' | 'usage_limit_resume' | 'overload_pause' | 'overload_resume' | 'idle_watchdog_fired' | 'pause_extension_granted' | 'suspected_loop' | 'compaction_disabled' | 'boot_warning' | 'workspace_subscribed' | 'workspace_delivery' | 'gate_shape' | 'session_id_assigned' | 'many_image_degraded' | 'stream_accepted_after_drop' | 'connection_retry' | 'connection_retry_exhausted' | 'connection_failure' | 'connection_recovered' | 'connection_budget_exhausted' | 'usage_notice' | 'tool_degraded' | 'strategy_nudge_fired' | 'stop_inject_dropped' | 'stop_hook_continuation' | 'stop_hook_cap_reached' | 'orphan_repair' | 'thinking_block_dropped' | 'background_process_started' | 'background_process_settled' | 'compose_recovery_decision';
|
|
2
2
|
export interface SessionPhasePayload {
|
|
3
3
|
phase: SessionPhaseName;
|
|
4
4
|
durationMs?: number;
|