trajectories 0.0.0 → 0.1.2

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 (205) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/LICENSE +201 -0
  3. package/README.md +288 -2
  4. package/dist/cli.js +30210 -0
  5. package/dist/convert.d.ts +31 -0
  6. package/dist/convert.js +431 -0
  7. package/dist/deepagents_checkpoint.py +362 -0
  8. package/dist/index.d.ts +7 -0
  9. package/dist/index.js +8402 -0
  10. package/dist/log-baseline.d.ts +26 -0
  11. package/dist/log-baseline.js +104 -0
  12. package/dist/log-content.d.ts +16 -0
  13. package/dist/log-content.js +80 -0
  14. package/dist/log-io.d.ts +10 -0
  15. package/dist/log-io.js +121 -0
  16. package/dist/log-read.d.ts +24 -0
  17. package/dist/log-read.js +117 -0
  18. package/dist/log-reconcile.d.ts +5 -0
  19. package/dist/log-reconcile.js +38 -0
  20. package/dist/log-records.d.ts +35 -0
  21. package/dist/log-records.js +85 -0
  22. package/dist/log-recovery.d.ts +18 -0
  23. package/dist/log-recovery.js +123 -0
  24. package/dist/log-stage.d.ts +14 -0
  25. package/dist/log-stage.js +138 -0
  26. package/dist/log-state.d.ts +89 -0
  27. package/dist/log-state.js +92 -0
  28. package/dist/log-switch.d.ts +3 -0
  29. package/dist/log-switch.js +98 -0
  30. package/dist/log-types.d.ts +129 -0
  31. package/dist/log-types.js +8 -0
  32. package/dist/log.d.ts +8 -0
  33. package/dist/log.js +62 -0
  34. package/dist/migrate.d.ts +29 -0
  35. package/dist/migrate.js +173 -0
  36. package/dist/normalization-runtime.d.ts +1 -0
  37. package/dist/normalization-runtime.js +3150 -0
  38. package/dist/portable.d.ts +9 -0
  39. package/dist/portable.js +26 -0
  40. package/dist/readers/canonical.d.ts +13 -0
  41. package/dist/readers/canonical.js +54 -0
  42. package/dist/readers/cline.d.ts +10 -0
  43. package/dist/readers/cline.js +107 -0
  44. package/dist/readers/cursor.d.ts +20 -0
  45. package/dist/readers/cursor.js +374 -0
  46. package/dist/readers/deepagents.d.ts +41 -0
  47. package/dist/readers/deepagents.js +163 -0
  48. package/dist/readers/fx.d.ts +11 -0
  49. package/dist/readers/fx.js +573 -0
  50. package/dist/readers/github-copilot.d.ts +8 -0
  51. package/dist/readers/github-copilot.js +216 -0
  52. package/dist/readers/grok-build.d.ts +12 -0
  53. package/dist/readers/grok-build.js +391 -0
  54. package/dist/readers/guards.d.ts +4 -0
  55. package/dist/readers/guards.js +121 -0
  56. package/dist/readers/pi-compaction.d.ts +7 -0
  57. package/dist/readers/pi-compaction.js +112 -0
  58. package/dist/readers/pi-context.d.ts +13 -0
  59. package/dist/readers/pi-context.js +64 -0
  60. package/dist/store.d.ts +25 -0
  61. package/dist/store.js +218 -0
  62. package/dist/types.d.ts +91 -0
  63. package/dist/types.js +1 -0
  64. package/dist/writers/claude-code.d.ts +5 -0
  65. package/dist/writers/claude-code.js +51 -0
  66. package/dist/writers/cline.d.ts +3 -0
  67. package/dist/writers/cline.js +77 -0
  68. package/dist/writers/codex.d.ts +3 -0
  69. package/dist/writers/codex.js +32 -0
  70. package/dist/writers/cursor.d.ts +3 -0
  71. package/dist/writers/cursor.js +197 -0
  72. package/dist/writers/deepagents.d.ts +3 -0
  73. package/dist/writers/deepagents.js +116 -0
  74. package/dist/writers/entropy.d.ts +5 -0
  75. package/dist/writers/entropy.js +33 -0
  76. package/dist/writers/fx.d.ts +3 -0
  77. package/dist/writers/fx.js +135 -0
  78. package/dist/writers/github-copilot.d.ts +3 -0
  79. package/dist/writers/github-copilot.js +71 -0
  80. package/dist/writers/grok-build.d.ts +3 -0
  81. package/dist/writers/grok-build.js +43 -0
  82. package/dist/writers/helpers.d.ts +17 -0
  83. package/dist/writers/helpers.js +75 -0
  84. package/dist/writers/omp.d.ts +3 -0
  85. package/dist/writers/omp.js +7 -0
  86. package/dist/writers/opencode.d.ts +3 -0
  87. package/dist/writers/opencode.js +65 -0
  88. package/dist/writers/pi.d.ts +3 -0
  89. package/dist/writers/pi.js +45 -0
  90. package/docs/cline-native-format.md +43 -0
  91. package/docs/copilot-native-format.md +78 -0
  92. package/docs/cursor-native-format.md +103 -0
  93. package/docs/deepagents-native-format.md +98 -0
  94. package/docs/evidence-api.md +170 -0
  95. package/docs/fx-native-format.md +87 -0
  96. package/docs/harness-parity-bootstrap.md +78 -0
  97. package/docs/harness-support-parity.md +107 -0
  98. package/docs/inspirations.md +103 -0
  99. package/docs/ledger-migration.md +141 -0
  100. package/docs/pi-compaction-context.md +75 -0
  101. package/docs/pi-provider-context.md +76 -0
  102. package/docs/research/2026-10-06-huihua-and-oar.md +176 -0
  103. package/docs/research/ledger/README.md +96 -0
  104. package/docs/research/ledger/confer/2026-09-13-round-10/README.md +61 -0
  105. package/docs/research/ledger/confer/2026-09-13-round-2/cass.md +72 -0
  106. package/docs/research/ledger/confer/2026-09-13-round-3/README.md +70 -0
  107. package/docs/research/ledger/confer/2026-09-13-round-5/README.md +61 -0
  108. package/docs/research/ledger/confer/2026-09-13-round-6/README.md +68 -0
  109. package/docs/research/ledger/confer/2026-09-13-round-7/README.md +64 -0
  110. package/docs/research/ledger/confer/2026-09-13-round-9/README.md +59 -0
  111. package/docs/research/ledger/confer/2026-09-14-wake/wake.md +146 -0
  112. package/docs/research/ledger/docs/inspirations.md +320 -0
  113. package/docs/research/ledger/docs/pr2-pr6-integration.md +53 -0
  114. package/docs/research/ledger/docs/research/2026-09-07-confer-inspirations.md +163 -0
  115. package/docs/research/ledger/docs/research/2026-09-07-letta-continuous-service.md +104 -0
  116. package/docs/research/ledger/docs/research/2026-09-08-claude-history-retrieval.md +117 -0
  117. package/docs/research/ledger/docs/research/2026-09-09-agentsview-native-discovery.md +87 -0
  118. package/docs/research/ledger/docs/research/2026-09-09-daemon-observation.md +231 -0
  119. package/docs/research/ledger/docs/research/2026-09-09-discovery-pagination.md +114 -0
  120. package/docs/research/ledger/docs/research/2026-09-09-harness-transcript-contract.md +145 -0
  121. package/docs/research/ledger/docs/research/2026-09-09-native-history-discovery.md +180 -0
  122. package/docs/research/ledger/docs/research/2026-09-09-native-history-implementation.md +137 -0
  123. package/docs/research/ledger/docs/research/2026-09-09-other-inspirations.md +279 -0
  124. package/docs/research/ledger/docs/research/2026-09-09-trajectory-and-letta-code.md +128 -0
  125. package/docs/research/ledger/docs/research/2026-09-13-diagnostics-coverage.md +116 -0
  126. package/docs/research/ledger/docs/research/2026-09-13-fts-rebuild.md +83 -0
  127. package/docs/research/ledger/docs/research/2026-09-13-read-path-split.md +74 -0
  128. package/docs/research/ledger/docs/research/2026-09-13-runtime-rollout.md +102 -0
  129. package/docs/research/ledger/docs/research/2026-09-13-scan-outcomes.md +80 -0
  130. package/docs/research/ledger/docs/research/2026-09-13-search-quality.md +105 -0
  131. package/docs/research/ledger/docs/research/2026-09-13-source-coverage.md +64 -0
  132. package/docs/research/ledger/docs/research/2026-09-13-sync-wall-budget.md +82 -0
  133. package/docs/research/ledger/docs/research/2026-09-13-typed-read-gate.md +81 -0
  134. package/docs/research/ledger/docs/research/2026-09-13-writer-lease.md +84 -0
  135. package/docs/research/ledger/docs/research/2026-09-16-c1-copy-fallback.md +227 -0
  136. package/docs/research/ledger/docs/research/2026-09-16-c10-kimi.md +414 -0
  137. package/docs/research/ledger/docs/research/2026-09-16-c2-derive-counter.md +216 -0
  138. package/docs/research/ledger/docs/research/2026-09-16-c3-echo-filter.md +305 -0
  139. package/docs/research/ledger/docs/research/2026-09-16-c4-title-index.md +349 -0
  140. package/docs/research/ledger/docs/research/2026-09-16-c5-trigram.md +268 -0
  141. package/docs/research/ledger/docs/research/2026-09-16-c6-recency-prior.md +438 -0
  142. package/docs/research/ledger/docs/research/2026-09-16-c7-tombstones.md +467 -0
  143. package/docs/research/ledger/docs/research/2026-09-16-c8-remote-truth.md +390 -0
  144. package/docs/research/ledger/docs/research/2026-09-16-c9-grok.md +380 -0
  145. package/docs/research/ledger/docs/research/2026-09-16-wake-port-program.md +38 -0
  146. package/docs/research/ledger/docs/research/2026-09-17-cursor-blobstore.md +157 -0
  147. package/docs/research/ledger/manifest.json +540 -0
  148. package/legacy/NOTICE.md +50 -0
  149. package/legacy/bin/ledger-core.ts +7 -0
  150. package/legacy/bin/ledger.ts +7 -0
  151. package/legacy/bin/traj-bridge.ts +7 -0
  152. package/legacy/scripts/import-claude-history.ts +130 -0
  153. package/legacy/scripts/native-history-smoke.ts +52 -0
  154. package/legacy/scripts/observe-daemon.ts +570 -0
  155. package/legacy/scripts/retitle-sessions.md +19 -0
  156. package/legacy/scripts/verify-runtime-rollout.ts +151 -0
  157. package/legacy/src/canonical.ts +108 -0
  158. package/legacy/src/cli.ts +1293 -0
  159. package/legacy/src/db.ts +2254 -0
  160. package/legacy/src/diagnostics.ts +87 -0
  161. package/legacy/src/discovery.ts +56 -0
  162. package/legacy/src/embeddings.ts +382 -0
  163. package/legacy/src/filter.ts +602 -0
  164. package/legacy/src/gemini_embeddings.ts +103 -0
  165. package/legacy/src/identity.ts +9 -0
  166. package/legacy/src/index.ts +10 -0
  167. package/legacy/src/ingest.ts +791 -0
  168. package/legacy/src/managed.ts +178 -0
  169. package/legacy/src/native/common.ts +68 -0
  170. package/legacy/src/native/cursor.ts +647 -0
  171. package/legacy/src/native/grok.ts +540 -0
  172. package/legacy/src/native/kimi.ts +706 -0
  173. package/legacy/src/native/opencode.ts +470 -0
  174. package/legacy/src/native/sqlite-ro.ts +281 -0
  175. package/legacy/src/native.ts +97 -0
  176. package/legacy/src/normalizer.ts +457 -0
  177. package/legacy/src/parentage.ts +562 -0
  178. package/legacy/src/pressure.ts +162 -0
  179. package/legacy/src/private-storage.ts +74 -0
  180. package/legacy/src/reader.ts +1255 -0
  181. package/legacy/src/scanner.ts +591 -0
  182. package/legacy/src/schema-gate.ts +263 -0
  183. package/legacy/src/schema.ts +829 -0
  184. package/legacy/src/semantic-top-k.ts +71 -0
  185. package/legacy/src/session-hash.ts +49 -0
  186. package/legacy/src/store-status.ts +218 -0
  187. package/legacy/src/sync-preparation.ts +45 -0
  188. package/legacy/src/sync-truth.ts +843 -0
  189. package/legacy/src/sync.ts +1233 -0
  190. package/legacy/src/types.ts +436 -0
  191. package/legacy/src/vocab.txt +30522 -0
  192. package/legacy/src/watch.ts +673 -0
  193. package/legacy/src/writer-lease.ts +310 -0
  194. package/ops/README.md +150 -0
  195. package/ops/install-cli.sh +63 -0
  196. package/ops/install-native.sh +35 -0
  197. package/ops/install-release.sh +49 -0
  198. package/ops/linux/install-systemd-user.sh +103 -0
  199. package/ops/macos/install-launchd.sh +72 -0
  200. package/ops/sync-settings.sh +37 -0
  201. package/package.json +21 -5
  202. package/skills/trajectories/SKILL.md +138 -0
  203. package/skills/trajectories/scripts/trajectories_recent.sh +26 -0
  204. package/skills/trajectories/scripts/trajectories_search.sh +26 -0
  205. package/index.js +0 -1
@@ -0,0 +1,41 @@
1
+ import { type CanonicalResult, type DeepAgentsCheckpointData } from '@letta-ai/trajectory';
2
+ export interface DeepAgentsSeed {
3
+ version: 1;
4
+ source: 'deepagents';
5
+ session: {
6
+ threadId: string;
7
+ checkpointNamespace: '';
8
+ cwd: string;
9
+ createdAt: string;
10
+ model?: string;
11
+ checkpointId?: string;
12
+ checkpointTimestamp?: string;
13
+ };
14
+ messages: Array<DeepAgentsCheckpointData['messages'][number] & {
15
+ id?: string;
16
+ }>;
17
+ }
18
+ export interface DeepAgentsReadResult {
19
+ raw: string;
20
+ canonical: CanonicalResult;
21
+ nativeSessionId: string;
22
+ cwd?: string;
23
+ checkpoint: {
24
+ id?: string;
25
+ namespace: string;
26
+ timestamp?: string;
27
+ };
28
+ diagnostics: Array<{
29
+ code: string;
30
+ message: string;
31
+ }>;
32
+ }
33
+ export declare function normalizeDeepAgentsSeed(seed: DeepAgentsSeed): CanonicalResult;
34
+ export declare function readDeepAgentsSeed(raw: string): DeepAgentsReadResult;
35
+ export declare function assertDeepAgentsPortable(raw: string): void;
36
+ /** Read either a portable checkpoint.json seed or one selected thread from sessions.db. */
37
+ export declare function readDeepAgents(input: {
38
+ path: string;
39
+ threadId: string;
40
+ pythonExecutable?: string;
41
+ }): Promise<DeepAgentsReadResult>;
@@ -0,0 +1,163 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { resolve } from 'node:path';
3
+ import { loadDeepAgentsCheckpoint, } from '@letta-ai/trajectory';
4
+ import { canonicalFromRecords } from './canonical.js';
5
+ function object(value) {
6
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
7
+ }
8
+ function requireString(value, label, allowEmpty = false) {
9
+ if (typeof value !== 'string' || (!allowEmpty && !value.trim()))
10
+ throw new Error(`Deep Agents seed requires ${label}.`);
11
+ return value;
12
+ }
13
+ function decodeSeed(value) {
14
+ if (!object(value) || value.version !== 1 || value.source !== 'deepagents' || !object(value.session)
15
+ || !Array.isArray(value.messages))
16
+ throw new Error('Invalid Deep Agents checkpoint seed.');
17
+ const session = value.session;
18
+ if (requireString(session.checkpointNamespace, 'root checkpoint namespace', true) !== '') {
19
+ throw new Error('Deep Agents continuation only supports the root checkpoint namespace.');
20
+ }
21
+ const decoded = { version: 1, source: 'deepagents', session: {
22
+ threadId: requireString(session.threadId, 'threadId'), checkpointNamespace: '',
23
+ cwd: requireString(session.cwd, 'cwd'), createdAt: requireString(session.createdAt, 'createdAt'),
24
+ ...(session.model === undefined ? {} : { model: requireString(session.model, 'model') }),
25
+ ...(session.checkpointId === undefined ? {} : { checkpointId: requireString(session.checkpointId, 'checkpointId') }),
26
+ ...(session.checkpointTimestamp === undefined ? {} : { checkpointTimestamp: requireString(session.checkpointTimestamp, 'checkpointTimestamp') }),
27
+ }, messages: [] };
28
+ if (!Number.isFinite(Date.parse(decoded.session.createdAt)))
29
+ throw new Error('Invalid Deep Agents seed createdAt.');
30
+ for (const [index, message] of value.messages.entries()) {
31
+ if (!object(message))
32
+ throw new Error(`Invalid Deep Agents seed message ${index}.`);
33
+ const timestamp = message.timestamp === undefined ? undefined : requireString(message.timestamp, `message ${index} timestamp`);
34
+ const id = message.id === undefined ? undefined : requireString(message.id, `message ${index} id`);
35
+ if (timestamp && !Number.isFinite(Date.parse(timestamp)))
36
+ throw new Error(`Invalid Deep Agents seed message ${index} timestamp.`);
37
+ if (message.role === 'human') {
38
+ decoded.messages.push({ role: 'human', content: requireString(message.content, `message ${index} content`, true), timestamp,
39
+ ...(id ? { id } : {}) });
40
+ }
41
+ else if (message.role === 'ai') {
42
+ if (!Array.isArray(message.reasoning) || message.reasoning.some(item => typeof item !== 'string') || !Array.isArray(message.toolCalls)) {
43
+ throw new Error('Deep Agents seed contains malformed reasoning or tool calls.');
44
+ }
45
+ const toolCalls = message.toolCalls.map((call, callIndex) => {
46
+ if (!object(call) || !object(call.args))
47
+ throw new Error(`Invalid Deep Agents seed tool call ${index}:${callIndex}.`);
48
+ return { id: requireString(call.id, `tool call ${index}:${callIndex} id`),
49
+ name: requireString(call.name, `tool call ${index}:${callIndex} name`), args: call.args };
50
+ });
51
+ decoded.messages.push({ role: 'ai', content: requireString(message.content, `message ${index} content`, true),
52
+ reasoning: message.reasoning, toolCalls,
53
+ ...(message.model === undefined ? {} : { model: requireString(message.model, `message ${index} model`) }),
54
+ ...(timestamp ? { timestamp } : {}), ...(id ? { id } : {}) });
55
+ }
56
+ else if (message.role === 'tool') {
57
+ decoded.messages.push({ role: 'tool', content: requireString(message.content, `message ${index} content`, true),
58
+ toolCallId: requireString(message.toolCallId, `message ${index} toolCallId`), timestamp, ...(id ? { id } : {}) });
59
+ }
60
+ else
61
+ throw new Error(`Unsupported Deep Agents seed role at message ${index}.`);
62
+ }
63
+ return decoded;
64
+ }
65
+ function seedEntries(seed) {
66
+ const entries = [{ record: { role: 'meta', source: 'deepagents', cwd: seed.session.cwd,
67
+ ...(seed.session.model ? { model: seed.session.model } : {}) }, nativeId: 'meta', sourceSequence: 0 }];
68
+ let sequence = 0;
69
+ let synthesized = 0;
70
+ for (const message of seed.messages) {
71
+ const timestamp = message.timestamp ?? seed.session.checkpointTimestamp ?? seed.session.createdAt;
72
+ if (!message.timestamp)
73
+ synthesized += 1;
74
+ const common = () => ({ ...(message.id ? { nativeId: message.id } : {}),
75
+ ...(message.timestamp ? { sourceTimestamp: message.timestamp } : {}), sourceSequence: ++sequence });
76
+ if (message.role === 'human')
77
+ entries.push({ ...common(),
78
+ record: { role: 'user', content: message.content, timestamp } });
79
+ else if (message.role === 'ai') {
80
+ for (const reasoning of message.reasoning)
81
+ entries.push({ ...common(),
82
+ record: { role: 'reasoning', content: reasoning, timestamp } });
83
+ if (message.content)
84
+ entries.push({ ...common(),
85
+ record: { role: 'assistant', content: message.content, timestamp } });
86
+ if (message.toolCalls.length)
87
+ entries.push({ ...common(),
88
+ record: { role: 'assistant', content: null, tool_calls: message.toolCalls.map(call => ({
89
+ id: call.id, name: call.name, args: JSON.stringify(call.args),
90
+ })), timestamp } });
91
+ }
92
+ else
93
+ entries.push({ ...common(),
94
+ record: { role: 'tool', tool_call_id: message.toolCallId, content: message.content, timestamp } });
95
+ }
96
+ const diagnostics = synthesized ? [{ code: 'timestamps_synthesized',
97
+ message: `Synthesized timestamps for ${synthesized} Deep Agents checkpoint messages from the checkpoint timestamp.`,
98
+ count: synthesized }] : [];
99
+ return { entries, diagnostics };
100
+ }
101
+ export function normalizeDeepAgentsSeed(seed) {
102
+ const { entries, diagnostics } = seedEntries(seed);
103
+ return canonicalFromRecords('deepagents', JSON.stringify([seed.session.threadId, '']), entries, diagnostics);
104
+ }
105
+ export function readDeepAgentsSeed(raw) {
106
+ const seed = decodeSeed(JSON.parse(raw));
107
+ const canonical = normalizeDeepAgentsSeed(seed);
108
+ return { raw, canonical, nativeSessionId: seed.session.threadId, cwd: seed.session.cwd,
109
+ checkpoint: { id: seed.session.checkpointId, namespace: '', timestamp: seed.session.checkpointTimestamp },
110
+ diagnostics: [{ code: 'checkpoint-seed', message: 'Read the portable Deep Agents seed. Run its explicit prepare step before native resume.' },
111
+ ...canonical.diagnostics.map(item => ({ code: item.code, message: item.message }))] };
112
+ }
113
+ export function assertDeepAgentsPortable(raw) {
114
+ const seed = decodeSeed(JSON.parse(raw));
115
+ const pending = new Set();
116
+ const messageIds = new Set();
117
+ for (const message of seed.messages) {
118
+ if (message.id && messageIds.has(message.id)) {
119
+ throw new Error('Unsupported deepagents continuation history: duplicate native message id.');
120
+ }
121
+ if (message.id)
122
+ messageIds.add(message.id);
123
+ if (message.role === 'ai' && message.toolCalls.length) {
124
+ for (const call of message.toolCalls) {
125
+ if (!call.id || !call.name || !object(call.args) || pending.has(call.id)) {
126
+ throw new Error('Unsupported deepagents continuation history: malformed or duplicate tool call.');
127
+ }
128
+ pending.add(call.id);
129
+ }
130
+ }
131
+ else if (message.role === 'tool') {
132
+ if (!pending.delete(message.toolCallId))
133
+ throw new Error('Unsupported deepagents continuation history: orphan or duplicate tool result.');
134
+ }
135
+ else if (pending.size && (message.role === 'human' || message.role === 'ai')) {
136
+ throw new Error('Unsupported deepagents continuation history: unfinished tool batch.');
137
+ }
138
+ }
139
+ if (pending.size)
140
+ throw new Error(`Unsupported deepagents continuation history: pending tool calls: ${[...pending].join(', ')}.`);
141
+ }
142
+ /** Read either a portable checkpoint.json seed or one selected thread from sessions.db. */
143
+ export async function readDeepAgents(input) {
144
+ const path = resolve(input.path);
145
+ if (path.endsWith('.json')) {
146
+ const selected = readDeepAgentsSeed(await readFile(path, 'utf8'));
147
+ if (selected.nativeSessionId !== input.threadId)
148
+ throw new Error('Deep Agents seed threadId does not match the requested selector.');
149
+ return selected;
150
+ }
151
+ const location = { path, threadId: input.threadId, ...(input.pythonExecutable ? { pythonExecutable: input.pythonExecutable } : {}) };
152
+ const checkpoint = await loadDeepAgentsCheckpoint(location);
153
+ const readout = { version: 1, source: 'deepagents', session: {
154
+ threadId: checkpoint.threadId, checkpointNamespace: '', cwd: checkpoint.cwd ?? '',
155
+ createdAt: checkpoint.checkpointTimestamp, checkpointId: checkpoint.checkpointId,
156
+ checkpointTimestamp: checkpoint.checkpointTimestamp, ...(checkpoint.model ? { model: checkpoint.model } : {}),
157
+ }, messages: checkpoint.messages };
158
+ const canonical = normalizeDeepAgentsSeed(readout);
159
+ return { raw: JSON.stringify(readout, null, 2) + '\n', canonical, nativeSessionId: checkpoint.threadId,
160
+ ...(checkpoint.cwd ? { cwd: checkpoint.cwd } : {}), checkpoint: { id: checkpoint.checkpointId,
161
+ namespace: checkpoint.checkpointNamespace, timestamp: checkpoint.checkpointTimestamp },
162
+ diagnostics: canonical.diagnostics.map(item => ({ code: item.code, message: item.message })) };
163
+ }
@@ -0,0 +1,11 @@
1
+ import type { CanonicalResult } from '@letta-ai/trajectory';
2
+ export interface FxNativeCompanions {
3
+ /** Native schema-4 conversation log (`events.jsonl`). */
4
+ events?: string;
5
+ /** Exact `tool-results/<artifact_ref>` bodies, keyed by artifact_ref. */
6
+ toolResults?: Readonly<Record<string, string>>;
7
+ }
8
+ /** Parse a native FX session for archival inspection, retaining unsupported-feature diagnostics. */
9
+ export declare function readFx(raw: string, companions?: FxNativeCompanions): CanonicalResult;
10
+ /** Fail closed before converting FX history whose native context cannot be represented completely. */
11
+ export declare function assertFxPortable(raw: string, companions?: FxNativeCompanions): void;