@gajae-code/coding-agent 0.11.4 → 0.11.6

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.
Files changed (154) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/types/cli/notify-cli.d.ts +5 -1
  3. package/dist/types/config/settings-schema.d.ts +31 -1
  4. package/dist/types/export/html/template.generated.d.ts +1 -1
  5. package/dist/types/gjc-runtime/deep-interview-state.d.ts +28 -0
  6. package/dist/types/gjc-runtime/launch-tmux.d.ts +3 -0
  7. package/dist/types/gjc-runtime/managed-owner-admission.d.ts +42 -0
  8. package/dist/types/gjc-runtime/managed-owner-supervisor.d.ts +41 -0
  9. package/dist/types/gjc-runtime/tmux-owner-isolation.d.ts +9 -0
  10. package/dist/types/gjc-runtime/ultragoal-owner-loss-recovery.d.ts +94 -0
  11. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +1 -0
  12. package/dist/types/harness-control-plane/owner.d.ts +3 -1
  13. package/dist/types/internal-urls/local-protocol.d.ts +18 -0
  14. package/dist/types/main.d.ts +2 -2
  15. package/dist/types/modes/components/ansi-display-validator.d.ts +2 -0
  16. package/dist/types/modes/components/notifications-settings-editor.d.ts +4 -0
  17. package/dist/types/modes/components/session-observer-overlay.d.ts +3 -1
  18. package/dist/types/modes/components/settings-selector.d.ts +2 -0
  19. package/dist/types/modes/components/tool-transcript-format.d.ts +58 -0
  20. package/dist/types/modes/components/transcript-viewer-overlay.d.ts +3 -0
  21. package/dist/types/modes/controllers/goal-mode-controller.d.ts +8 -1
  22. package/dist/types/modes/controllers/selector-controller.d.ts +15 -0
  23. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +3 -0
  24. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +16 -0
  25. package/dist/types/plan-mode/approved-plan.d.ts +1 -0
  26. package/dist/types/runtime-mcp/manager.d.ts +2 -0
  27. package/dist/types/runtime-mcp/oauth-discovery.d.ts +12 -1
  28. package/dist/types/sdk/bus/chat-daemon-cli.d.ts +3 -1
  29. package/dist/types/sdk/bus/chat-daemon-control.d.ts +42 -4
  30. package/dist/types/sdk/bus/config-commands.d.ts +8 -0
  31. package/dist/types/sdk/bus/config.d.ts +22 -0
  32. package/dist/types/sdk/bus/index.d.ts +162 -2
  33. package/dist/types/sdk/bus/notification-service.d.ts +71 -8
  34. package/dist/types/sdk/bus/session-control.d.ts +11 -8
  35. package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +5 -0
  36. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +11 -3
  37. package/dist/types/sdk/bus/telegram-daemon-control.d.ts +23 -4
  38. package/dist/types/sdk/bus/telegram-daemon.d.ts +214 -20
  39. package/dist/types/sdk/session.d.ts +16 -1
  40. package/dist/types/secrets/index.d.ts +4 -2
  41. package/dist/types/secrets/obfuscator.d.ts +1 -1
  42. package/dist/types/session/agent-session.d.ts +31 -2
  43. package/dist/types/session/artifacts.d.ts +30 -8
  44. package/dist/types/session/internal/managed-session-scope.d.ts +7 -0
  45. package/dist/types/session/internal/managed-session-storage.d.ts +63 -6
  46. package/dist/types/session/session-manager.d.ts +98 -18
  47. package/dist/types/session/session-storage.d.ts +27 -0
  48. package/dist/types/session/streaming-output.d.ts +4 -0
  49. package/dist/types/session/yield-queue.d.ts +8 -0
  50. package/dist/types/task/executor.d.ts +9 -0
  51. package/dist/types/tool-discovery/tool-index.d.ts +2 -0
  52. package/dist/types/tools/ask.d.ts +48 -0
  53. package/dist/types/tools/bash-skill-urls.d.ts +2 -2
  54. package/dist/types/tools/index.d.ts +4 -0
  55. package/package.json +9 -9
  56. package/scripts/generate-sdk-operation-inventory.ts +3 -0
  57. package/src/cli/notify-cli.ts +40 -18
  58. package/src/commands/sdk.ts +7 -2
  59. package/src/config/settings-schema.ts +31 -1
  60. package/src/daemon/runtime.ts +2 -2
  61. package/src/defaults/gjc/skills/deep-interview/SKILL.md +70 -49
  62. package/src/defaults/gjc/skills/ralplan/SKILL.md +0 -6
  63. package/src/defaults/gjc/skills/team/SKILL.md +7 -9
  64. package/src/defaults/gjc/skills/ultragoal/SKILL.md +0 -2
  65. package/src/eval/py/index.ts +2 -2
  66. package/src/export/html/template.generated.ts +1 -1
  67. package/src/extensibility/plugins/marketplace/manager.ts +94 -10
  68. package/src/gjc-runtime/deep-interview-recorder.ts +7 -0
  69. package/src/gjc-runtime/deep-interview-runtime.ts +10 -0
  70. package/src/gjc-runtime/deep-interview-state.ts +127 -3
  71. package/src/gjc-runtime/launch-tmux.ts +61 -6
  72. package/src/gjc-runtime/managed-owner-admission.ts +352 -0
  73. package/src/gjc-runtime/managed-owner-supervisor.ts +162 -0
  74. package/src/gjc-runtime/state-runtime.ts +38 -12
  75. package/src/gjc-runtime/team-runtime.ts +1 -1
  76. package/src/gjc-runtime/tmux-owner-isolation.ts +117 -0
  77. package/src/gjc-runtime/ultragoal-owner-loss-recovery.ts +328 -0
  78. package/src/gjc-runtime/ultragoal-runtime.ts +14 -0
  79. package/src/harness-control-plane/owner.ts +59 -3
  80. package/src/hindsight/client.ts +65 -2
  81. package/src/internal-urls/agent-protocol.ts +76 -5
  82. package/src/internal-urls/docs-index.generated.ts +8 -7
  83. package/src/internal-urls/local-protocol.ts +416 -18
  84. package/src/lsp/index.ts +4 -88
  85. package/src/main.ts +36 -12
  86. package/src/modes/acp/acp-agent.ts +8 -0
  87. package/src/modes/components/ansi-display-validator.ts +54 -0
  88. package/src/modes/components/notifications-settings-editor.ts +26 -2
  89. package/src/modes/components/session-observer-overlay.ts +40 -24
  90. package/src/modes/components/settings-selector.ts +3 -1
  91. package/src/modes/components/tool-transcript-format.ts +321 -0
  92. package/src/modes/components/transcript-viewer-overlay.ts +39 -17
  93. package/src/modes/controllers/command-controller.ts +15 -0
  94. package/src/modes/controllers/extension-ui-controller.ts +14 -2
  95. package/src/modes/controllers/goal-mode-controller.ts +20 -1
  96. package/src/modes/controllers/plan-mode-controller.ts +2 -0
  97. package/src/modes/controllers/runtime-mcp-command-controller.ts +3 -0
  98. package/src/modes/controllers/selector-controller.ts +70 -8
  99. package/src/modes/interactive-mode.ts +1 -0
  100. package/src/modes/runtime-init.ts +16 -2
  101. package/src/modes/shared/agent-wire/deep-interview-gate.ts +31 -1
  102. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +17 -1
  103. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +4 -2
  104. package/src/modes/shared/agent-wire/workflow-gate-types.ts +120 -3
  105. package/src/plan-mode/approved-plan.ts +3 -1
  106. package/src/prompts/agents/architect.md +1 -0
  107. package/src/prompts/agents/critic.md +1 -0
  108. package/src/prompts/system/custom-system-prompt.md +1 -1
  109. package/src/prompts/system/system-prompt.md +2 -1
  110. package/src/prompts/tools/lsp.md +3 -3
  111. package/src/runtime-mcp/manager.ts +16 -1
  112. package/src/runtime-mcp/oauth-discovery.ts +116 -26
  113. package/src/sdk/broker/session-index.ts +122 -64
  114. package/src/sdk/bus/chat-daemon-cli.ts +72 -10
  115. package/src/sdk/bus/chat-daemon-control.ts +538 -130
  116. package/src/sdk/bus/chat-daemon-runtime.ts +1 -0
  117. package/src/sdk/bus/config-commands.ts +22 -0
  118. package/src/sdk/bus/config.ts +37 -0
  119. package/src/sdk/bus/index.ts +388 -94
  120. package/src/sdk/bus/lifecycle-control-runtime.ts +53 -3
  121. package/src/sdk/bus/notification-service.ts +284 -62
  122. package/src/sdk/bus/recent-activity.ts +14 -5
  123. package/src/sdk/bus/session-control.ts +150 -44
  124. package/src/sdk/bus/telegram-daemon-cli.ts +20 -14
  125. package/src/sdk/bus/telegram-daemon-contract.ts +11 -3
  126. package/src/sdk/bus/telegram-daemon-control.ts +312 -76
  127. package/src/sdk/bus/telegram-daemon.ts +1916 -285
  128. package/src/sdk/host/control/dispatch.ts +14 -5
  129. package/src/sdk/protocol/operation-inventory.generated.json +29 -0
  130. package/src/sdk/session.ts +155 -27
  131. package/src/secrets/index.ts +53 -10
  132. package/src/secrets/obfuscator.ts +21 -18
  133. package/src/secrets/regex.ts +2 -0
  134. package/src/session/agent-session.ts +1447 -852
  135. package/src/session/artifacts.ts +188 -23
  136. package/src/session/context-estimation.ts +7 -2
  137. package/src/session/internal/managed-session-scope.ts +200 -38
  138. package/src/session/internal/managed-session-storage.ts +1152 -46
  139. package/src/session/session-manager.ts +1121 -148
  140. package/src/session/session-storage.ts +109 -11
  141. package/src/session/streaming-output.ts +6 -0
  142. package/src/session/yield-queue.ts +20 -0
  143. package/src/slash-commands/builtin-registry.ts +36 -0
  144. package/src/task/executor.ts +71 -26
  145. package/src/task/index.ts +63 -20
  146. package/src/tool-discovery/tool-index.ts +18 -0
  147. package/src/tools/ask-answer-registry.ts +15 -1
  148. package/src/tools/ask.ts +129 -32
  149. package/src/tools/bash-skill-urls.ts +14 -3
  150. package/src/tools/bash.ts +2 -2
  151. package/src/tools/index.ts +4 -0
  152. package/src/tools/plan-mode-guard.ts +1 -0
  153. package/src/tools/sqlite-reader.ts +3 -2
  154. package/src/tools/subagent.ts +2 -0
@@ -1,3 +1,4 @@
1
+ import { type NativeDirectoryTreeSnapshot, type NativeOwnerOnlySecurityResult, type RecoveryFsRoot } from "@gajae-code/natives";
1
2
  export declare const MANAGED_ARTIFACT_MAX_DEPTH = 32;
2
3
  export declare const MANAGED_ARTIFACT_MAX_FILES = 10000;
3
4
  export declare const MANAGED_ARTIFACT_MAX_FILE_BYTES: number;
@@ -16,23 +17,79 @@ export interface ManagedFileSnapshot {
16
17
  ino: bigint;
17
18
  size: number;
18
19
  mtimeNs: bigint;
20
+ ctimeNs: bigint;
21
+ sha256: string;
19
22
  };
20
23
  }
24
+ export declare function validateNativeSecurityResult(value: unknown, operation: "apply" | "verify", kind: "directory" | "file"): NativeOwnerOnlySecurityResult;
25
+ /** Captured configured-root authority for managed paths only. */
26
+ export interface ManagedDirectoryRoot {
27
+ readonly canonicalPath: string;
28
+ readonly dev: bigint;
29
+ readonly ino: bigint;
30
+ }
31
+ export declare function managedDirectoryRoot(configuredRoot: string): ManagedDirectoryRoot;
32
+ export declare function retainManagedDirectoryAuthority(root: ManagedDirectoryRoot, directory: string, expected?: {
33
+ dev: bigint;
34
+ ino: bigint;
35
+ }): RecoveryFsRoot | undefined;
36
+ export declare function assertManagedDirectoryRoot(root: ManagedDirectoryRoot): void;
37
+ /** Internal retained-root capability for one managed descendant subtree. */
38
+ export declare class ManagedSessionDescendantStore {
39
+ #private;
40
+ constructor(root: ManagedDirectoryRoot, baseDir: string, retained?: {
41
+ authority: RecoveryFsRoot;
42
+ authorityBaseDir: string;
43
+ });
44
+ get dir(): string;
45
+ get rootAuthority(): ManagedDirectoryRoot;
46
+ get subtreeRootAuthority(): ManagedDirectoryRoot;
47
+ deriveSubtree(relativePath: string): ManagedSessionDescendantStore;
48
+ retainAuthority(): RecoveryFsRoot | undefined;
49
+ assertBound(): void;
50
+ verifyRootSecurity(): void;
51
+ ensureDirectory(relativePath?: string): ManagedDirectoryRoot;
52
+ publishNoReplace(relativePath: string, bytes: Uint8Array): Promise<void>;
53
+ publishNoReplaceSync(relativePath: string, bytes: Uint8Array): void;
54
+ replace(relativePath: string, bytes: Uint8Array): Promise<void>;
55
+ replaceSync(relativePath: string, bytes: Uint8Array): void;
56
+ appendSync(relativePath: string, bytes: Uint8Array): void;
57
+ /** Read an exact managed file without exposing its pathname as authority. */
58
+ readExpected(relativePath: string): ManagedFileSnapshot | null;
59
+ /** Remove an exact captured file without reopening its pathname as authority. */
60
+ removeExpected(relativePath: string, expected: ManagedFileSnapshot): void;
61
+ /** Read and remove one managed descendant through retained authority. */
62
+ consume(relativePath: string): Promise<Uint8Array | null>;
63
+ /** Remove one managed descendant through retained authority when it exists. */
64
+ remove(relativePath: string): Promise<void>;
65
+ /** Capture a complete descendant tree through this retained root. */
66
+ captureTree(relativePath: string): NativeDirectoryTreeSnapshot;
67
+ /** Copy an exact captured tree into an absent managed destination. */
68
+ importTree(sourceRelativePath: string, destinationRelativePath: string, snapshot: NativeDirectoryTreeSnapshot): Promise<void>;
69
+ moveTreeNoReplace(sourceRelativePath: string, destinationRelativePath: string, expected: NativeDirectoryTreeSnapshot): void;
70
+ removeTreeExpected(relativePath: string, expected: NativeDirectoryTreeSnapshot): void;
71
+ fsyncTree(): NativeDirectoryTreeSnapshot;
72
+ }
21
73
  export declare function shouldFsyncManagedDirectory(platform?: NodeJS.Platform): boolean;
22
74
  /** Create a managed directory and fail closed unless its owner-only mode/ACL verifies. */
23
- export declare function ensureManagedDirectory(pathname: string): void;
75
+ export declare function ensureManagedDirectory(pathname: string, root?: ManagedDirectoryRoot): void;
76
+ /** Captures a bounded prefix from one no-follow descriptor and rechecks the pathname before use. */
77
+ export declare function captureManagedFilePrefixNoFollow(pathname: string, maxBytes: number): ManagedFileSnapshot;
24
78
  /** Captures header/hash/copy input from one no-follow descriptor and rechecks the pathname before use. */
25
79
  export declare function captureManagedFileNoFollow(pathname: string): ManagedFileSnapshot;
26
80
  /** Atomically publishes bytes without replacing an existing destination. */
27
- export declare function publishManagedFileNoReplace(destination: string, bytes: Uint8Array, assertOwned?: () => void): Promise<void>;
28
- export declare function publishManagedFileNoReplaceSync(destination: string, bytes: Uint8Array): void;
81
+ export declare function publishManagedFileNoReplace(destination: string, bytes: Uint8Array, assertOwned?: () => void, root?: ManagedDirectoryRoot): Promise<void>;
82
+ export declare function publishManagedFileNoReplaceSync(destination: string, bytes: Uint8Array, root?: ManagedDirectoryRoot): void;
83
+ /** Replace one managed regular file while retaining the secured staging fd through publication. */
84
+ export declare function replaceManagedFileSync(destination: string, bytes: Uint8Array, root: ManagedDirectoryRoot): void;
85
+ export declare function replaceManagedFile(destination: string, bytes: Uint8Array, root: ManagedDirectoryRoot): Promise<void>;
29
86
  /** Copy the exact bytes captured from one no-follow source descriptor. */
30
- export declare function copyManagedFileNoReplace(source: string, destination: string, snapshot?: ManagedFileSnapshot): Promise<void>;
87
+ export declare function copyManagedFileNoReplace(source: string, destination: string, snapshot?: ManagedFileSnapshot, root?: ManagedDirectoryRoot): Promise<void>;
31
88
  /** Acquire a lease lock with bounded wait, heartbeats, conservative stale reclaim, and fencing. */
32
- export declare function acquireManagedLock(locksDirectory: string, name: string): Promise<ManagedStorageLock>;
89
+ export declare function acquireManagedLock(locksDirectory: string, name: string, root?: ManagedDirectoryRoot): Promise<ManagedStorageLock>;
33
90
  /** Bounds a no-follow artifact tree before it can be copied or deleted. */
34
91
  export declare function validateManagedArtifactTree(root: string): void;
35
92
  /** Flush a copied managed artifact tree, including empty directories, before publishing its receipt. */
36
- export declare function fsyncManagedArtifactTree(root: string): void;
93
+ export declare function fsyncManagedArtifactTree(root: string): NativeDirectoryTreeSnapshot;
37
94
  export declare function publishManagedTombstone(destination: string, record: Record<string, unknown>, assertOwned?: () => void): Promise<void>;
38
95
  export declare function unlinkManagedFileVerified(pathname: string, expected: ManagedFileSnapshot["identity"]): Promise<void>;
@@ -1,14 +1,17 @@
1
1
  import { type AgentMessage } from "@gajae-code/agent-core";
2
2
  import type { ConfiguredModelChainEntry as SharedConfiguredModelChainEntry } from "@gajae-code/agent-core/compaction";
3
3
  import type { ImageContent, Message, MessageAttribution, ServiceTier, TextContent } from "@gajae-code/ai";
4
+ import * as native from "@gajae-code/natives";
4
5
  import type { TtsrInjectionRecord } from "../export/ttsr";
6
+ import type { ManagedLegacyLocalMigrationSource } from "../internal-urls/local-protocol";
5
7
  import { ArtifactManager } from "./artifacts";
6
8
  import { type BlobPutResult, BlobStore } from "./blob-store";
7
9
  import { type ManagedMigrationPolicy } from "./internal/managed-session-scope";
10
+ import { type ManagedDirectoryRoot, ManagedSessionDescendantStore } from "./internal/managed-session-storage";
8
11
  import { type BashExecutionMessage, type CustomMessage, type FileMentionMessage, type HookMessage, type PythonExecutionMessage } from "./messages";
9
12
  import { type SessionManagerReadAccess, sessionManagerReadCapability } from "./session-manager-internal";
10
- import type { SessionStorage, SessionStorageStat, VerifiedSessionDeleteResult, VerifiedSessionDeleteTarget } from "./session-storage";
11
- export declare const CURRENT_SESSION_VERSION = 4;
13
+ import type { ManagedSessionSecurityContext, SessionStorage, SessionStorageStat, VerifiedSessionDeleteResult, VerifiedSessionDeleteTarget } from "./session-storage";
14
+ export declare const CURRENT_SESSION_VERSION = 5;
12
15
  export interface SessionHeader {
13
16
  type: "session";
14
17
  version?: number;
@@ -167,6 +170,17 @@ export interface MCPToolSelectionEntry extends SessionEntryBase {
167
170
  type: "mcp_tool_selection";
168
171
  /** MCP tool names selected for visibility in discovery mode. */
169
172
  selectedToolNames: string[];
173
+ /** Legacy v4 combined built-in authority, retained for read compatibility. */
174
+ selectedDiscoveredBuiltinToolNames?: string[];
175
+ /** Correlates the ordered MCP and built-in entries emitted by one combined activation. */
176
+ mutationCorrelationId?: string;
177
+ }
178
+ /** Persisted discovered-built-in selection state, independent of MCP authority. */
179
+ export interface DiscoveredBuiltinToolSelectionEntry extends SessionEntryBase {
180
+ type: "discovered_builtin_tool_selection";
181
+ selectedToolNames: string[];
182
+ /** Correlates the ordered MCP and built-in entries emitted by one combined activation. */
183
+ mutationCorrelationId?: string;
170
184
  }
171
185
  /** Session init entry - captures initial context for subagent sessions (debugging/replay). */
172
186
  export interface SessionInitEntry extends SessionEntryBase {
@@ -214,7 +228,7 @@ export interface CustomMessageEntry<T = unknown> extends SessionEntryBase {
214
228
  evictedContent?: EvictedContentMarker;
215
229
  }
216
230
  /** Session entry - has id/parentId for tree structure (returned by "read" methods in SessionManager) */
217
- export type SessionEntry = SessionMessageEntry | ThinkingLevelChangeEntry | ModelChangeEntry | ServiceTierChangeEntry | CompactionEntry | BranchSummaryEntry | CustomEntry | CustomMessageEntry | LabelEntry | TtsrInjectionEntry | MCPToolSelectionEntry | SessionInitEntry | ModeChangeEntry | ConfiguredModelChainEntry;
231
+ export type SessionEntry = SessionMessageEntry | ThinkingLevelChangeEntry | ModelChangeEntry | ServiceTierChangeEntry | CompactionEntry | BranchSummaryEntry | CustomEntry | CustomMessageEntry | LabelEntry | TtsrInjectionEntry | MCPToolSelectionEntry | DiscoveredBuiltinToolSelectionEntry | SessionInitEntry | ModeChangeEntry | ConfiguredModelChainEntry;
218
232
  /** Append-only replacement for mutable fields on the session header. */
219
233
  export interface HeaderPatchRecord {
220
234
  type: "header_patch";
@@ -270,8 +284,12 @@ export interface SessionContext {
270
284
  ttsrMessageCount?: number;
271
285
  /** MCP tool names selected through discovery for this session branch. */
272
286
  selectedMCPToolNames: string[];
287
+ /** Built-in discoverable tool names activated through discovery, when explicitly persisted. */
288
+ selectedDiscoveredBuiltinToolNames?: string[];
273
289
  /** Whether this branch contains an explicit persisted MCP selection entry. */
274
290
  hasPersistedMCPToolSelection: boolean;
291
+ /** Whether this branch contains an explicit persisted discovered-built-in selection entry. */
292
+ hasPersistedDiscoveredBuiltinToolSelection?: boolean;
275
293
  /** Active mode (e.g. "plan") or "none" if no special mode is active */
276
294
  mode: string;
277
295
  /** Mode-specific data from the last mode_change entry */
@@ -316,7 +334,7 @@ export interface StrictSessionOpenSuccess {
316
334
  }
317
335
  export interface StrictSessionOpenFailure {
318
336
  kind: "error";
319
- reason: ResumeTailError["reason"] | "identity-mismatch";
337
+ reason: ResumeTailError["reason"] | "identity-mismatch" | "migration-required";
320
338
  }
321
339
  /** Exact transcript bytes and authority captured from one descriptor-bound read. */
322
340
  export interface CapturedSessionTranscriptSnapshot {
@@ -335,6 +353,23 @@ export type StrictSessionForkResult = {
335
353
  } | StrictSessionOpenFailure;
336
354
  /** Result of opening an inspected session without create-or-rewrite fallback. */
337
355
  export type StrictSessionOpenResult = StrictSessionOpenSuccess | StrictSessionOpenFailure;
356
+ /**
357
+ * Capability returned only by a strict recovery hydration open. It represents
358
+ * immutable transcript authority and is consumed by the promotion seam.
359
+ */
360
+ export interface RecoveryHydrationContext {
361
+ readonly identity: ResumeSessionIdentity;
362
+ }
363
+ export interface RecoveryHydrationOpenSuccess {
364
+ readonly kind: "hydrated";
365
+ readonly manager: SessionManager;
366
+ readonly context: RecoveryHydrationContext;
367
+ }
368
+ export type RecoveryHydrationOpenResult = RecoveryHydrationOpenSuccess | StrictSessionOpenFailure;
369
+ export interface RecoveryHydrationPromotionFence {
370
+ /** The caller has durably published ownership and acquired its writer lease. */
371
+ readonly ownershipReady: true;
372
+ }
338
373
  export interface SessionInfo {
339
374
  path: string;
340
375
  id: string;
@@ -434,6 +469,22 @@ export declare function getLatestCompactionEntry(entries: SessionEntry[]): Compa
434
469
  * Handles compaction and branch summaries along the path.
435
470
  */
436
471
  export declare function buildSessionContext(entries: SessionEntry[], leafId?: string | null, byId?: Map<string, SessionEntry>, sessionIdentityNamespace?: string): SessionContext;
472
+ /** A session directory's authority is distinct from its string path. */
473
+ export type SessionDestination = {
474
+ readonly kind: "managed";
475
+ readonly directory: string;
476
+ readonly securityContext: ManagedSessionSecurityContext;
477
+ } | {
478
+ readonly kind: "explicit";
479
+ readonly directory: string;
480
+ };
481
+ export type SessionDestinationInput = string | SessionDestination | undefined;
482
+ interface ForkArtifactPublication {
483
+ readonly snapshot: native.NativeDirectoryTreeSnapshot;
484
+ readonly store: ManagedSessionDescendantStore;
485
+ readonly cleanupStore: ManagedSessionDescendantStore;
486
+ readonly cleanupRelativePath: string;
487
+ }
437
488
  /** Exported for testing */
438
489
  export declare function loadEntriesFromFile(filePath: string, storage?: SessionStorage): Promise<FileEntry[]>;
439
490
  declare class RecentSessionInfo {
@@ -520,6 +571,7 @@ export declare class SessionManager {
520
571
  private sessionDir;
521
572
  private readonly persist;
522
573
  private readonly storage;
574
+ private destination;
523
575
  private constructor();
524
576
  /**
525
577
  * Snapshot of the five cache-invalidation revision domains (plan: Lane 1
@@ -543,6 +595,16 @@ export declare class SessionManager {
543
595
  newSession(options?: NewSessionOptions): Promise<string | undefined>;
544
596
  /** Tombstone and exact-delete managed transcripts, detaching the active transcript first. */
545
597
  dropSession(sessionPath: string): Promise<void>;
598
+ /**
599
+ * Exact-delete a session transcript and its artifacts by path WITHOUT requiring
600
+ * managed logical authorization. This is only for discarding an UNCOMMITTED
601
+ * successor that a transaction (e.g. handoff) created via `newSession()` but
602
+ * never durably authorized — such a session has no managed candidate listing
603
+ * yet, so `dropSession` would refuse it and leak its resident-cache/artifact
604
+ * root. Bounded to this manager's configured session root and refuses to touch
605
+ * the active session; tolerates missing files.
606
+ */
607
+ discardUncommittedSession(sessionPath: string): Promise<void>;
546
608
  /**
547
609
  * Fork the current session, creating a new session file with the same entries.
548
610
  * Returns both the old and new session file paths for artifact copying.
@@ -552,6 +614,7 @@ export declare class SessionManager {
552
614
  oldSessionFile: string;
553
615
  newSessionFile: string;
554
616
  } | undefined>;
617
+ copyArtifactsForFork(oldSessionFile: string, newSessionFile: string): Promise<ForkArtifactPublication | undefined>;
555
618
  /**
556
619
  * Move the session to a new working directory.
557
620
  * Moves session files and artifacts on disk, updates all internal references,
@@ -592,10 +655,13 @@ export declare class SessionManager {
592
655
  * Returns the session artifacts directory path (session file path without .jsonl).
593
656
  * Returns null when the session is not persisted to a file.
594
657
  * When this session has adopted an external ArtifactManager (subagent case),
595
- * returns that manager's directory so reads/writes land in the shared parent
596
- * dir instead of a private (non-existent) subdir.
658
+ * never exposes that managed directory as a pathname. Reads and writes use the
659
+ * adopted manager capability directly.
597
660
  */
598
661
  getArtifactsDir(): string | null;
662
+ isManagedDestination(): boolean;
663
+ /** Supplies opaque retained authority for mandatory managed legacy local migration. */
664
+ getManagedLegacyLocalMigrationSource(): ManagedLegacyLocalMigrationSource | null;
599
665
  /**
600
666
  * Adopt an externally-owned ArtifactManager. Used by subagents to share
601
667
  * the parent session's artifact directory and ID counter.
@@ -716,12 +782,10 @@ export declare class SessionManager {
716
782
  * @returns Entry id
717
783
  */
718
784
  appendCustomMessageEntry<T = unknown>(customType: string, content: string | (TextContent | ImageContent)[], display: boolean, details?: T, attribution?: MessageAttribution, observationId?: string): string;
719
- /**
720
- * Append an MCP tool selection entry recording the discovery-selected MCP tools.
721
- * @param selectedToolNames MCP tool names selected for this branch
722
- * @returns Entry id
723
- */
724
- appendMCPToolSelection(selectedToolNames: string[]): string;
785
+ /** Append MCP discovery selection authority without altering discovered built-in authority. */
786
+ appendMCPToolSelection(selectedToolNames: string[], mutationCorrelationId?: string): string;
787
+ /** Append discovered built-in selection authority without altering MCP authority. */
788
+ appendDiscoveredBuiltinToolSelection(selectedToolNames: string[], mutationCorrelationId?: string): string;
725
789
  /**
726
790
  * Append a TTSR injection entry recording which rules were injected.
727
791
  * @param ruleNames Names of rules that were injected
@@ -833,20 +897,24 @@ export declare class SessionManager {
833
897
  * @param cwd Working directory (stored in session header)
834
898
  * @param sessionDir Optional session directory. If omitted, uses default (~/.gjc/agent/sessions/<encoded-cwd>/).
835
899
  */
836
- static create(cwd: string, sessionDir?: string, storage?: SessionStorage): SessionManager;
900
+ static nestedManagedDestination(authority: ManagedDirectoryRoot | ManagedSessionDescendantStore, directory: string): SessionDestination;
901
+ static managedDestination(cwd: string, agentDir?: string, storage?: SessionStorage): SessionDestination;
902
+ static explicitDestination(directory: string): SessionDestination;
903
+ static create(cwd: string, destinationInput?: SessionDestinationInput, storage?: SessionStorage): SessionManager;
837
904
  /** Resolve a default-managed candidate through binding validation and copy-retain migration before mutation. */
838
905
  static prepareManagedCandidateForWrite(filePath: string, migrationPolicy: SessionDirectoryMigrationPolicy): Promise<string>;
839
906
  /**
840
907
  * Fork a session into the current project directory.
841
908
  * Copies history from another session file while creating a new session file in the current sessionDir.
842
909
  */
843
- static forkFrom(sourcePath: string, cwd: string, sessionDir?: string, storage?: SessionStorage, migrationPolicy?: SessionDirectoryMigrationPolicy): Promise<SessionManager>;
910
+ static forkFrom(sourcePath: string, cwd: string, destinationInput?: SessionDestinationInput, storage?: SessionStorage, migrationPolicy?: SessionDirectoryMigrationPolicy): Promise<SessionManager>;
844
911
  /**
845
912
  * Open a specific session file.
846
913
  * @param path Path to session file
847
914
  * @param sessionDir Optional session directory for /new or /branch. If omitted, derives from file's parent.
848
915
  */
849
- static open(filePath: string, sessionDir?: string, storage?: SessionStorage, migrationPolicy?: SessionDirectoryMigrationPolicy): Promise<SessionManager>;
916
+ static open(filePath: string, destinationInput?: SessionDestinationInput, storage?: SessionStorage, migrationPolicy?: SessionDirectoryMigrationPolicy): Promise<SessionManager>;
917
+ static openNestedManaged(filePath: string, destination: SessionDestination, store: ManagedSessionDescendantStore, storage?: SessionStorage): Promise<SessionManager>;
850
918
  /**
851
919
  * List sessions for the resume picker without recovery or other maintenance writes.
852
920
  */
@@ -860,21 +928,33 @@ export declare class SessionManager {
860
928
  * revalidate captured authority before destination initialization and transcript
861
929
  * persistence; destination history always comes from the captured bytes.
862
930
  */
863
- static forkFromCaptured(snapshot: CapturedSessionTranscriptSnapshot, cwd: string, sessionDir?: string, _migrationPolicy?: SessionDirectoryMigrationPolicy): Promise<StrictSessionForkResult>;
931
+ static forkFromCaptured(snapshot: CapturedSessionTranscriptSnapshot, cwd: string, destinationInput?: SessionDestinationInput, _migrationPolicy?: SessionDirectoryMigrationPolicy): Promise<StrictSessionForkResult>;
864
932
  /** Inspect a selected session without acquiring write-capable ownership. */
865
933
  static inspectSessionTailReadOnly(filePath: string, storage?: SessionStorage): Promise<ResumeTailInspection>;
934
+ /**
935
+ * Hydrate an existing predecessor transcript for recovery without taking any
936
+ * write-capable action. The caller must retain the returned context and use
937
+ * the explicit promotion seam only after its ownership-ready fence and writer
938
+ * lease are durable.
939
+ */
940
+ static openExistingForRecoveryHydrationStrict(identity: ResumeSessionIdentity, destinationInput?: SessionDestinationInput, storage?: SessionStorage): Promise<RecoveryHydrationOpenResult>;
941
+ /**
942
+ * Allows the normal post-open metadata sanitation only after the caller has
943
+ * fsynced its external ownership-ready fence and acquired the writer lease.
944
+ */
945
+ promoteRecoveryHydrationAfterOwnershipReadyFence(context: RecoveryHydrationContext, fence: RecoveryHydrationPromotionFence): Promise<void>;
866
946
  /**
867
947
  * Main startup code MUST retain the consented inspection identity and branch on
868
948
  * the returned discriminant; an error result never creates, rewrites, or adopts
869
949
  * the selected path. Breadcrumb ownership begins only after `kind: "opened"`.
870
950
  */
871
- static openExistingStrict(identity: ResumeSessionIdentity, sessionDir?: string, storage?: SessionStorage, migrationPolicy?: SessionDirectoryMigrationPolicy): Promise<StrictSessionOpenResult>;
951
+ static openExistingStrict(identity: ResumeSessionIdentity, destinationInput?: SessionDestinationInput, storage?: SessionStorage, migrationPolicy?: SessionDirectoryMigrationPolicy): Promise<StrictSessionOpenResult>;
872
952
  /**
873
953
  * Continue the most recent session, or create new if none.
874
954
  * @param cwd Working directory
875
955
  * @param sessionDir Optional session directory. If omitted, uses default (~/.gjc/agent/sessions/<encoded-cwd>/).
876
956
  */
877
- static continueRecent(cwd: string, sessionDir?: string, storage?: SessionStorage, migrationPolicy?: SessionDirectoryMigrationPolicy): Promise<SessionManager>;
957
+ static continueRecent(cwd: string, destinationInput?: SessionDestinationInput, storage?: SessionStorage, migrationPolicy?: SessionDirectoryMigrationPolicy): Promise<SessionManager>;
878
958
  /** Create an in-memory session (no file persistence) */
879
959
  static inMemory(cwd?: string, storage?: SessionStorage): SessionManager;
880
960
  /**
@@ -1,3 +1,5 @@
1
+ import * as native from "@gajae-code/natives";
2
+ import { type ManagedDirectoryRoot } from "./internal/managed-session-storage";
1
3
  export interface SessionStorageStat {
2
4
  dev: bigint;
3
5
  ino: bigint;
@@ -48,7 +50,31 @@ export interface SessionStorageWriterOpenOptions {
48
50
  onError?: (err: Error) => void;
49
51
  /** Injectable OS-close dispatcher; defaults to `fs.closeSync`. */
50
52
  closeAdapter?: SessionStorageWriterCloseAdapter;
53
+ /** Opaque authority for default-computed managed destinations only. */
54
+ securityContext?: SessionStorageSecurityContext;
51
55
  }
56
+ /**
57
+ * Immutable authority attached only to a computed managed session destination.
58
+ * A caller-supplied pathname never receives this capability, even when it
59
+ * happens to equal the current default session directory.
60
+ */
61
+ export interface ManagedSessionSecurityContext {
62
+ readonly kind: "managed";
63
+ readonly agentDir: string;
64
+ readonly sessionsRoot: string;
65
+ readonly sessionDir: string;
66
+ readonly rootAuthority: ManagedDirectoryRoot;
67
+ readonly retainedAuthority?: native.RecoveryFsRoot;
68
+ }
69
+ /** @internal Create the only accepted managed writer authority object. */
70
+ export declare function createManagedSessionSecurityContext(input: {
71
+ agentDir: string;
72
+ sessionsRoot: string;
73
+ sessionDir: string;
74
+ rootAuthority: ManagedDirectoryRoot;
75
+ retainedAuthority?: native.RecoveryFsRoot;
76
+ }): ManagedSessionSecurityContext;
77
+ export type SessionStorageSecurityContext = ManagedSessionSecurityContext | undefined;
52
78
  export interface SessionStorageWriter {
53
79
  writeLine(line: string): Promise<void>;
54
80
  /**
@@ -205,6 +231,7 @@ type NativeDirectoryTreeEntry = {
205
231
  ino: string;
206
232
  size: string;
207
233
  mtimeNs: string;
234
+ ctimeNs: string;
208
235
  sha256?: string;
209
236
  };
210
237
  export type NativeDirectoryTreeSnapshot = {
@@ -24,6 +24,10 @@ export interface OutputSummary {
24
24
  artifactTruncatedBytes?: number;
25
25
  }
26
26
  export interface OutputSinkOptions {
27
+ /**
28
+ * Deprecated managed artifact pathname. Bare paths are deliberately ignored:
29
+ * streaming output must be terminally published through ArtifactManager.
30
+ */
27
31
  artifactPath?: string;
28
32
  artifactId?: string;
29
33
  /** Tail buffer budget (bytes). Default DEFAULT_MAX_BYTES. */
@@ -20,5 +20,13 @@ export declare class YieldQueue {
20
20
  has(kind?: string): boolean;
21
21
  flush(mode: YieldFlushMode): Promise<void>;
22
22
  clear(): void;
23
+ /** Drop only the queued entries of a single kind, leaving other kinds intact. */
24
+ clearKind(kind: string): void;
25
+ /**
26
+ * Re-schedule an idle flush if work remains and the session is idle. Used after
27
+ * a transition (e.g. handoff) releases a delivery fence so entries queued while
28
+ * fenced are not stranded until an unrelated enqueue or agent yield.
29
+ */
30
+ rearmIdle(): void;
23
31
  }
24
32
  export {};
@@ -15,6 +15,7 @@ import { AgentRegistry } from "../registry/agent-registry";
15
15
  import type { ForkContextSeed } from "../session/agent-session";
16
16
  import type { ArtifactManager } from "../session/artifacts";
17
17
  import type { AuthStorage } from "../session/auth-storage";
18
+ import { SessionManager } from "../session/session-manager";
18
19
  import type { ContextFileEntry } from "../tools";
19
20
  import type { EventBus } from "../utils/event-bus";
20
21
  import type { WorkspaceTree } from "../workspace-tree";
@@ -80,6 +81,7 @@ export interface ExecutorOptions {
80
81
  * artifacts directory (no per-subagent subdir).
81
82
  */
82
83
  parentArtifactManager?: ArtifactManager;
84
+ managedPersistence?: ManagedTaskPersistence;
83
85
  parentHindsightSessionState?: HindsightSessionState;
84
86
  /**
85
87
  * Parent agent's OpenTelemetry configuration. When defined, the subagent's
@@ -94,6 +96,13 @@ export interface ExecutorOptions {
94
96
  autoloadSkills?: Skill[];
95
97
  forkContextSeed?: ForkContextSeed;
96
98
  }
99
+ export declare class ManagedTaskPersistence {
100
+ #private;
101
+ constructor(artifacts: ArtifactManager, taskId: string);
102
+ openSession(): Promise<SessionManager>;
103
+ publishOutput(rawOutput: string, metadata: Uint8Array): Promise<void>;
104
+ }
105
+ export declare function createManagedTaskPersistence(artifacts: ArtifactManager, taskId: string): ManagedTaskPersistence;
97
106
  export declare function renderSubagentUserPrompt(assignment: string, independentMode: boolean): string;
98
107
  export interface YieldItem {
99
108
  data?: unknown;
@@ -36,6 +36,8 @@ export interface DiscoverableToolSearchResult {
36
36
  score: number;
37
37
  }
38
38
  export declare function isMCPToolName(name: string): boolean;
39
+ /** Select persisted built-in discoveries that remain eligible in the current registry, allowlist, and baseline policy. */
40
+ export declare function selectRestorableDiscoveredBuiltinToolNames(toolNames: Iterable<string>, toolRegistry: ReadonlyMap<string, AgentTool>, allowedNames?: ReadonlySet<string>, excludedNames?: ReadonlySet<string>): string[];
39
41
  export declare function isMCPBridgeTool(tool: {
40
42
  name: string;
41
43
  mcpServerName?: unknown;
@@ -36,9 +36,25 @@ export declare const askSchema: z.ZodObject<{
36
36
  component: z.ZodString;
37
37
  dimension: z.ZodString;
38
38
  ambiguity: z.ZodNumber;
39
+ confused_terms: z.ZodOptional<z.ZodArray<z.ZodString>>;
40
+ references: z.ZodOptional<z.ZodArray<z.ZodObject<{
41
+ reference_id: z.ZodString;
42
+ label: z.ZodString;
43
+ origin: z.ZodString;
44
+ url: z.ZodOptional<z.ZodString>;
45
+ excerpt: z.ZodOptional<z.ZodString>;
46
+ }, z.core.$strict>>>;
39
47
  }, z.core.$strict>, z.ZodObject<{
40
48
  round_id: z.ZodOptional<z.ZodString>;
41
49
  ambiguity: z.ZodNumber;
50
+ confused_terms: z.ZodOptional<z.ZodArray<z.ZodString>>;
51
+ references: z.ZodOptional<z.ZodArray<z.ZodObject<{
52
+ reference_id: z.ZodString;
53
+ label: z.ZodString;
54
+ origin: z.ZodString;
55
+ url: z.ZodOptional<z.ZodString>;
56
+ excerpt: z.ZodOptional<z.ZodString>;
57
+ }, z.core.$strict>>>;
42
58
  round: z.ZodLiteral<0>;
43
59
  component: z.ZodLiteral<"review-topology">;
44
60
  dimension: z.ZodLiteral<"topology">;
@@ -60,6 +76,14 @@ export declare const askSchema: z.ZodObject<{
60
76
  component: z.ZodString;
61
77
  dimension: z.ZodString;
62
78
  ambiguity: z.ZodNumber;
79
+ confused_terms: z.ZodOptional<z.ZodArray<z.ZodString>>;
80
+ references: z.ZodOptional<z.ZodArray<z.ZodObject<{
81
+ reference_id: z.ZodString;
82
+ label: z.ZodString;
83
+ origin: z.ZodString;
84
+ url: z.ZodOptional<z.ZodString>;
85
+ excerpt: z.ZodOptional<z.ZodString>;
86
+ }, z.core.$strict>>>;
63
87
  round: z.ZodNumber;
64
88
  intent_review: z.ZodObject<{
65
89
  observed_items: z.ZodArray<z.ZodObject<{
@@ -169,9 +193,25 @@ export declare class AskTool implements AgentTool<typeof askSchema, AskToolDetai
169
193
  component: z.ZodString;
170
194
  dimension: z.ZodString;
171
195
  ambiguity: z.ZodNumber;
196
+ confused_terms: z.ZodOptional<z.ZodArray<z.ZodString>>;
197
+ references: z.ZodOptional<z.ZodArray<z.ZodObject<{
198
+ reference_id: z.ZodString;
199
+ label: z.ZodString;
200
+ origin: z.ZodString;
201
+ url: z.ZodOptional<z.ZodString>;
202
+ excerpt: z.ZodOptional<z.ZodString>;
203
+ }, z.core.$strict>>>;
172
204
  }, z.core.$strict>, z.ZodObject<{
173
205
  round_id: z.ZodOptional<z.ZodString>;
174
206
  ambiguity: z.ZodNumber;
207
+ confused_terms: z.ZodOptional<z.ZodArray<z.ZodString>>;
208
+ references: z.ZodOptional<z.ZodArray<z.ZodObject<{
209
+ reference_id: z.ZodString;
210
+ label: z.ZodString;
211
+ origin: z.ZodString;
212
+ url: z.ZodOptional<z.ZodString>;
213
+ excerpt: z.ZodOptional<z.ZodString>;
214
+ }, z.core.$strict>>>;
175
215
  round: z.ZodLiteral<0>;
176
216
  component: z.ZodLiteral<"review-topology">;
177
217
  dimension: z.ZodLiteral<"topology">;
@@ -193,6 +233,14 @@ export declare class AskTool implements AgentTool<typeof askSchema, AskToolDetai
193
233
  component: z.ZodString;
194
234
  dimension: z.ZodString;
195
235
  ambiguity: z.ZodNumber;
236
+ confused_terms: z.ZodOptional<z.ZodArray<z.ZodString>>;
237
+ references: z.ZodOptional<z.ZodArray<z.ZodObject<{
238
+ reference_id: z.ZodString;
239
+ label: z.ZodString;
240
+ origin: z.ZodString;
241
+ url: z.ZodOptional<z.ZodString>;
242
+ excerpt: z.ZodOptional<z.ZodString>;
243
+ }, z.core.$strict>>>;
196
244
  round: z.ZodNumber;
197
245
  intent_review: z.ZodObject<{
198
246
  observed_items: z.ZodArray<z.ZodObject<{
@@ -24,8 +24,8 @@ export declare function resolveSkillUrlToPath(url: string, skills: readonly Skil
24
24
  */
25
25
  export declare function expandSkillUrls(command: string, skills: readonly Skill[]): string;
26
26
  /**
27
- * Expand supported internal URLs in a bash command string to shell-escaped absolute paths.
28
- * Supported schemes: skill://, agent://, artifact://, memory://, rule://, local://
27
+ * Expand filesystem-safe internal URLs in a bash command string. `agent://` and
28
+ * `artifact://` remain internal-reader-only and are rejected before resolution.
29
29
  */
30
30
  export declare function expandInternalUrls(command: string, options: InternalUrlExpansionOptions): Promise<string>;
31
31
  export {};
@@ -139,6 +139,8 @@ export interface ToolSession {
139
139
  cwd: string;
140
140
  /** Whether UI is available */
141
141
  hasUI: boolean;
142
+ /** Whether this session will bind a workflow-gate emitter after tool construction. */
143
+ workflowGateEligible?: boolean;
142
144
  /** Skip Python kernel availability check and warmup */
143
145
  skipPythonPreflight?: boolean;
144
146
  /** Pre-loaded context files (AGENTS.md, etc) */
@@ -185,6 +187,8 @@ export interface ToolSession {
185
187
  requestForegroundBashBackground?: () => boolean;
186
188
  /** Get session ID */
187
189
  getSessionId?: () => string | null;
190
+ /** Whether local:// must use external managed scratch instead of artifacts/local. */
191
+ isManagedSessionDestination?: () => boolean;
188
192
  /** Get Hindsight runtime state for this agent session. */
189
193
  getHindsightSessionState?: () => HindsightSessionState | undefined;
190
194
  /** Agent identity used for IRC routing. Returns the registry id (e.g. "0-Main", "0-AuthLoader"). */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@gajae-code/coding-agent",
4
- "version": "0.11.4",
4
+ "version": "0.11.6",
5
5
  "description": "Gajae Code CLI with read, bash, edit, write tools and session management",
6
6
  "homepage": "https://gajae-code.com",
7
7
  "author": "Yeachan-Heo and Gajae Code Contributors",
@@ -47,19 +47,19 @@
47
47
  "install:defaults": "bun src/cli.ts setup defaults",
48
48
  "verify:insane-vendor": "bun scripts/verify-insane-vendor.ts",
49
49
  "verify:sdk-canonicalization": "bun scripts/verify-gjc-sdk-canonicalization.ts",
50
- "check:sdk-closure": "bun scripts/generate-sdk-operation-inventory.ts --check && bun scripts/generate-sdk-adapter-parity-manifest.ts --check && bun scripts/run-test-manifest.ts test/manifests/sdk-adapter-parity-v1.json && bun scripts/generate-telegram-baseline-manifest.ts --check && bun scripts/run-test-manifest.ts test/manifests/telegram-baseline-v1.json && bun test test/sdk-downgrade-rollback.test.ts test/sdk-downgrade-unknown-version.test.ts && bun scripts/verify-gjc-sdk-canonicalization.ts --self-test && bun scripts/verify-gjc-sdk-canonicalization.ts && bun scripts/verify-gjc-sdk-rename.ts"
50
+ "check:sdk-closure": "bun ../../scripts/telegram-daemon-generation-guard.ts --validate-current-tree && bun test ../../scripts/telegram-daemon-generation-guard.test.ts && bun scripts/generate-sdk-operation-inventory.ts --check && bun scripts/generate-sdk-adapter-parity-manifest.ts --check && bun scripts/run-test-manifest.ts test/manifests/sdk-adapter-parity-v1.json && bun scripts/generate-telegram-baseline-manifest.ts --check && bun scripts/run-test-manifest.ts test/manifests/telegram-baseline-v1.json && bun test test/sdk-downgrade-rollback.test.ts test/sdk-downgrade-unknown-version.test.ts && bun scripts/verify-gjc-sdk-canonicalization.ts --self-test && bun scripts/verify-gjc-sdk-canonicalization.ts && bun scripts/verify-gjc-sdk-rename.ts"
51
51
  },
52
52
  "dependencies": {
53
53
  "@agentclientprotocol/sdk": "1.2.1",
54
54
  "@babel/parser": "^7.29.3",
55
55
  "@mozilla/readability": "^0.6.0",
56
- "@gajae-code/stats": "0.11.4",
57
- "@gajae-code/agent-core": "0.11.4",
58
- "@gajae-code/ai": "0.11.4",
59
- "@gajae-code/bridge-client": "0.11.4",
60
- "@gajae-code/natives": "0.11.4",
61
- "@gajae-code/tui": "0.11.4",
62
- "@gajae-code/utils": "0.11.4",
56
+ "@gajae-code/stats": "0.11.6",
57
+ "@gajae-code/agent-core": "0.11.6",
58
+ "@gajae-code/ai": "0.11.6",
59
+ "@gajae-code/bridge-client": "0.11.6",
60
+ "@gajae-code/natives": "0.11.6",
61
+ "@gajae-code/tui": "0.11.6",
62
+ "@gajae-code/utils": "0.11.6",
63
63
  "@puppeteer/browsers": "^2.13.0",
64
64
  "@types/turndown": "5.0.6",
65
65
  "@xterm/headless": "^6.0.0",
@@ -113,6 +113,8 @@ const LOCKED_EXCLUSIONS: Readonly<Record<string, string>> = {
113
113
  "agent_session:cancelAndSubmit": "interactive queue transaction plumbing, not an independent SDK control seam",
114
114
  "agent_session:applyCompactionPostAppendForTests": "internal accessor/plumbing, not a user-facing control seam",
115
115
  "agent_session:continuePersistedHistory": "internal startup lifecycle plumbing, not a user-facing control seam",
116
+ "agent_session:promoteRecoveryHydrationAfterOwnershipReadyFence":
117
+ "internal owner-recovery authority transition after a durable writer fence, never a user-facing SDK operation",
116
118
  "agent_session:setActiveModelProfile": "internal accessor/plumbing, not a user-facing control seam",
117
119
  "agent_session:getActiveModelProfile": "internal accessor/plumbing, not a user-facing control seam",
118
120
  "agent_session:getSessionDefaultModelSelector": "internal accessor/plumbing, not a user-facing control seam",
@@ -256,6 +258,7 @@ const SEAM_TO_SDK: Readonly<Record<string, string>> = {
256
258
  "slash_command:clear": "context.clear",
257
259
  "slash_command:new": "session.new",
258
260
  "slash_command:compact": "compaction.run",
261
+ "slash_command:handoff": "session.handoff",
259
262
  "slash_command:resume": "session.resume",
260
263
  "slash_command:retry": "retry.last",
261
264
  "slash_command:background": "bash.background",