@beeuni/sdk 0.1.0 → 0.3.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.
Files changed (291) hide show
  1. package/README.md +53 -92
  2. package/dist/beeuni.esm.min.js +36 -34
  3. package/dist/beeuni.global.js +36 -34
  4. package/dist/browser/cache/idb-sync-cache.js +15 -5
  5. package/dist/browser/session-sync/server-transcript-mirror.d.ts +7 -1
  6. package/dist/browser/session-sync/server-transcript-mirror.js +30 -24
  7. package/dist/browser/session-sync/session-sync-registry.d.ts +3 -1
  8. package/dist/browser/session-sync/session-sync-registry.js +48 -3
  9. package/dist/browser/stores/sync-store/keep-unchanged.d.ts +4 -0
  10. package/dist/browser/stores/sync-store/keep-unchanged.js +34 -0
  11. package/dist/browser/stores/sync-store.d.ts +7 -0
  12. package/dist/browser/stores/sync-store.js +122 -35
  13. package/dist/core/attachments/prompt-attachments.d.ts +4 -0
  14. package/dist/core/attachments/prompt-attachments.js +34 -0
  15. package/dist/core/capture/rules.d.ts +17 -0
  16. package/dist/core/capture/rules.js +27 -0
  17. package/dist/core/client/beeuni.d.ts +99 -34
  18. package/dist/core/client/beeuni.js +5 -11
  19. package/dist/core/client/capture.d.ts +105 -0
  20. package/dist/core/client/capture.js +48 -0
  21. package/dist/core/client/facade-catalog.d.ts +0 -4
  22. package/dist/core/client/facade-catalog.js +1 -5
  23. package/dist/core/client/facade-identity.d.ts +1 -0
  24. package/dist/core/client/facade-identity.js +1 -0
  25. package/dist/core/client/project-access-resources.d.ts +3 -1
  26. package/dist/core/client/project-access-resources.js +1 -1
  27. package/dist/core/client/project-connections.d.ts +2 -2
  28. package/dist/core/client/project-connections.js +2 -2
  29. package/dist/core/client/project-operations-admin.d.ts +4 -4
  30. package/dist/core/client/project-operations-review.d.ts +2 -3
  31. package/dist/core/client/project-operations-review.js +1 -0
  32. package/dist/core/client/project-operations-workspace.d.ts +4 -4
  33. package/dist/core/client/project-operations-workspace.js +1 -1
  34. package/dist/core/client/project-operations.d.ts +9 -19
  35. package/dist/core/client/project-operations.js +2 -6
  36. package/dist/core/client/project-platform-security.d.ts +1 -1
  37. package/dist/core/client/project-platform-settings.d.ts +1 -1
  38. package/dist/core/client/session-context.d.ts +2 -0
  39. package/dist/core/client/session-handle.d.ts +13 -0
  40. package/dist/core/client/session-lifecycle-resources.d.ts +11 -0
  41. package/dist/core/client/session-lifecycle-resources.js +4 -0
  42. package/dist/core/client/session-lifecycle-security.d.ts +2 -0
  43. package/dist/core/client/session-lifecycle-security.js +1 -0
  44. package/dist/core/client/session-readiness.d.ts +2 -0
  45. package/dist/core/client/session-readiness.js +20 -1
  46. package/dist/core/http/api-client.d.ts +1 -7
  47. package/dist/core/http/api-client.js +2 -37
  48. package/dist/core/http/auth.d.ts +2 -4
  49. package/dist/core/http/auth.js +2 -8
  50. package/dist/core/http/config.d.ts +2 -0
  51. package/dist/core/http/response-error.js +26 -11
  52. package/dist/core/http/transport.js +6 -1
  53. package/dist/core/models/composer-model.d.ts +14 -0
  54. package/dist/core/models/composer-model.js +21 -1
  55. package/dist/core/rest/platform-client/capture.d.ts +363 -0
  56. package/dist/core/rest/platform-client/capture.js +116 -0
  57. package/dist/core/rest/platform-client/client-policy.d.ts +8 -0
  58. package/dist/core/rest/platform-client/client-policy.js +30 -0
  59. package/dist/core/rest/platform-client/index.d.ts +4 -4
  60. package/dist/core/rest/platform-client/index.js +4 -4
  61. package/dist/core/rest/platform-client/lifecycle.js +18 -12
  62. package/dist/core/rest/platform-client/shared.d.ts +5 -0
  63. package/dist/core/rest/platform-client/shared.js +18 -0
  64. package/dist/core/rest/platform-client/types.d.ts +1 -1
  65. package/dist/core/rest/projects-client/account-secret-resources.d.ts +2 -1
  66. package/dist/core/rest/projects-client/accounts.d.ts +34 -0
  67. package/dist/core/rest/projects-client/accounts.js +10 -0
  68. package/dist/core/rest/projects-client/admin-providers.d.ts +0 -61
  69. package/dist/core/rest/projects-client/admin-providers.js +0 -6
  70. package/dist/core/rest/projects-client/agent-config.d.ts +3 -0
  71. package/dist/core/rest/projects-client/apps-fleet.d.ts +5 -1
  72. package/dist/core/rest/projects-client/apps-fleet.js +2 -2
  73. package/dist/core/rest/projects-client/apps.d.ts +11 -1
  74. package/dist/core/rest/projects-client/change-requests.d.ts +2 -0
  75. package/dist/core/rest/projects-client/change-requests.js +2 -0
  76. package/dist/core/rest/projects-client/connectors.d.ts +13 -55
  77. package/dist/core/rest/projects-client/connectors.js +5 -29
  78. package/dist/core/rest/projects-client/files.d.ts +3 -0
  79. package/dist/core/rest/projects-client/files.js +4 -0
  80. package/dist/core/rest/projects-client/gateway.d.ts +5 -0
  81. package/dist/core/rest/projects-client/git-backend.d.ts +1 -10
  82. package/dist/core/rest/projects-client/git-backend.js +0 -10
  83. package/dist/core/rest/projects-client/iam-actions.d.ts +76 -0
  84. package/dist/core/rest/projects-client/iam-actions.js +101 -0
  85. package/dist/core/rest/projects-client/iam-sso.d.ts +0 -10
  86. package/dist/core/rest/projects-client/iam-sso.js +0 -3
  87. package/dist/core/rest/projects-client/iam.d.ts +1 -0
  88. package/dist/core/rest/projects-client/iam.js +1 -0
  89. package/dist/core/rest/projects-client/index.d.ts +1 -4
  90. package/dist/core/rest/projects-client/index.js +1 -4
  91. package/dist/core/rest/projects-client/notifications.d.ts +1 -1
  92. package/dist/core/rest/projects-client/notifications.js +4 -0
  93. package/dist/core/rest/projects-client/projects.d.ts +4 -2
  94. package/dist/core/rest/projects-client/projects.js +4 -2
  95. package/dist/core/rest/projects-client/review-items.d.ts +2 -0
  96. package/dist/core/rest/projects-client/review-items.js +4 -0
  97. package/dist/core/rest/projects-client/review.d.ts +17 -3
  98. package/dist/core/rest/projects-client/review.js +11 -0
  99. package/dist/core/rest/projects-client/sandbox.d.ts +8 -9
  100. package/dist/core/rest/projects-client/secrets.d.ts +3 -0
  101. package/dist/core/rest/projects-client/session-attachments.js +14 -1
  102. package/dist/core/rest/projects-client/session-sandbox.d.ts +1 -1
  103. package/dist/core/rest/projects-client/sessions.d.ts +31 -4
  104. package/dist/core/rest/projects-client/sessions.js +34 -4
  105. package/dist/core/runtime/runtime-rest-client.js +1 -1
  106. package/dist/core/runtime/runtime-types.d.ts +1 -0
  107. package/dist/core/session/control-stream.d.ts +1 -0
  108. package/dist/core/session/control-stream.js +18 -1
  109. package/dist/core/session/open-bundle.d.ts +4 -4
  110. package/dist/core/session/open-bundle.js +29 -46
  111. package/dist/core/session/turn-end-watch.d.ts +47 -0
  112. package/dist/core/session/turn-end-watch.js +141 -0
  113. package/dist/core/session-log/guard.d.ts +6 -0
  114. package/dist/core/session-log/guard.js +109 -0
  115. package/dist/core/session-log/index.d.ts +7 -0
  116. package/dist/core/session-log/index.js +5 -0
  117. package/dist/core/session-log/saved-log.d.ts +10 -0
  118. package/dist/core/session-log/saved-log.js +25 -0
  119. package/dist/core/session-log/source.d.ts +25 -0
  120. package/dist/core/session-log/source.js +30 -0
  121. package/dist/core/session-log/store.d.ts +21 -0
  122. package/dist/core/session-log/store.js +126 -0
  123. package/dist/core/session-log/tool-call.d.ts +11 -0
  124. package/dist/core/session-log/tool-call.js +65 -0
  125. package/dist/core/session-log/turns/blocks.d.ts +60 -0
  126. package/dist/core/session-log/turns/blocks.js +124 -0
  127. package/dist/core/session-log/turns/history.d.ts +32 -0
  128. package/dist/core/session-log/turns/history.js +99 -0
  129. package/dist/core/session-log/turns/index.d.ts +4 -0
  130. package/dist/core/session-log/turns/index.js +4 -0
  131. package/dist/core/session-log/turns/metrics.d.ts +21 -0
  132. package/dist/core/session-log/turns/metrics.js +29 -0
  133. package/dist/core/session-log/turns/turn.d.ts +55 -0
  134. package/dist/core/session-log/turns/turn.js +279 -0
  135. package/dist/core/session-log/turns/v1-parts.d.ts +8 -0
  136. package/dist/core/session-log/turns/v1-parts.js +43 -0
  137. package/dist/core/session-log/types.d.ts +264 -0
  138. package/dist/core/session-log/types.js +6 -0
  139. package/dist/core/session-log/v1-view.d.ts +13 -0
  140. package/dist/core/session-log/v1-view.js +215 -0
  141. package/dist/core/session-log/v1.d.ts +31 -0
  142. package/dist/core/session-log/v1.js +473 -0
  143. package/dist/core/session-sync/copy-store-types.d.ts +19 -0
  144. package/dist/core/session-sync/copy-store-types.js +1 -0
  145. package/dist/core/session-sync/saved-copy-store.js +25 -4
  146. package/dist/core/session-sync/saved-transcript.d.ts +15 -1
  147. package/dist/core/session-sync/saved-transcript.js +55 -0
  148. package/dist/core/session-sync/session-sync-controller.js +3 -0
  149. package/dist/core/stream/event-stream.js +2 -2
  150. package/dist/core/turns/classify.d.ts +2 -1
  151. package/dist/core/turns/classify.js +7 -3
  152. package/dist/core/turns/edit-blocks.d.ts +1 -0
  153. package/dist/core/turns/edit-blocks.js +15 -0
  154. package/dist/core/turns/parts.d.ts +3 -2
  155. package/dist/core/turns/parts.js +4 -2
  156. package/dist/core/turns/segments/burst-summary.d.ts +1 -0
  157. package/dist/core/turns/segments/burst-summary.js +24 -0
  158. package/dist/core/turns/segments/group-steps.d.ts +4 -3
  159. package/dist/core/turns/segments/group-steps.js +9 -6
  160. package/dist/core/turns/segments/index.d.ts +1 -0
  161. package/dist/core/turns/segments/index.js +1 -0
  162. package/dist/core/turns/segments/narration.d.ts +5 -4
  163. package/dist/core/turns/segments/narration.js +12 -3
  164. package/dist/core/turns/segments/session-activity-groups.d.ts +2 -1
  165. package/dist/core/turns/segments/session-activity-groups.js +3 -1
  166. package/dist/core/turns/segments/step-label.d.ts +2 -1
  167. package/dist/core/turns/segments/step-label.js +3 -1
  168. package/dist/core/turns/segments/work-split.d.ts +10 -0
  169. package/dist/core/turns/segments/work-split.js +40 -0
  170. package/dist/core/turns/segments/working-turn.d.ts +4 -2
  171. package/dist/core/turns/segments/working-turn.js +9 -8
  172. package/dist/core/turns/state.d.ts +2 -7
  173. package/dist/core/turns/state.js +28 -134
  174. package/dist/core/turns/tool-kind.d.ts +1 -1
  175. package/dist/core/turns/tool-kind.js +3 -2
  176. package/dist/core/turns/tool-registry.js +1 -0
  177. package/dist/core/turns/tools/tool-meta.d.ts +3 -2
  178. package/dist/core/turns/tools/tool-meta.js +5 -2
  179. package/dist/core/turns/tools/tool-outcome.d.ts +2 -1
  180. package/dist/core/turns/tools/tool-outcome.js +3 -1
  181. package/dist/core/turns/types.d.ts +1 -1
  182. package/dist/core/turns/view-model.js +1 -13
  183. package/dist/core/warm-session-pool.d.ts +29 -0
  184. package/dist/core/warm-session-pool.js +127 -0
  185. package/dist/genui/catalog.d.ts +28 -0
  186. package/dist/genui/catalog.js +396 -0
  187. package/dist/genui/expansion.d.ts +3 -0
  188. package/dist/genui/expansion.js +295 -0
  189. package/dist/genui/fence-entry.d.ts +2 -0
  190. package/dist/genui/fence-entry.js +1 -0
  191. package/dist/genui/fence.d.ts +21 -0
  192. package/dist/genui/fence.js +138 -0
  193. package/dist/genui/index.d.ts +6 -0
  194. package/dist/genui/index.js +6 -0
  195. package/dist/genui/markdown.d.ts +12 -0
  196. package/dist/genui/markdown.js +104 -0
  197. package/dist/genui/parse.d.ts +6 -0
  198. package/dist/genui/parse.js +75 -0
  199. package/dist/genui/prompt.d.ts +2 -0
  200. package/dist/genui/prompt.js +206 -0
  201. package/dist/genui/react/default-components.d.ts +2 -0
  202. package/dist/genui/react/default-components.js +72 -0
  203. package/dist/genui/react/default-components.test.d.ts +1 -0
  204. package/dist/genui/react/default-components.test.js +94 -0
  205. package/dist/genui/react/genui-block-disabled.test.d.ts +1 -0
  206. package/dist/genui/react/genui-block-disabled.test.js +50 -0
  207. package/dist/genui/react/genui-block.d.ts +28 -0
  208. package/dist/genui/react/genui-block.js +91 -0
  209. package/dist/genui/react/genui-block.test.d.ts +1 -0
  210. package/dist/genui/react/genui-block.test.js +205 -0
  211. package/dist/genui/react/index.d.ts +2 -0
  212. package/dist/genui/react/index.js +2 -0
  213. package/dist/genui/share.d.ts +5 -0
  214. package/dist/genui/share.js +30 -0
  215. package/dist/genui/test-fixtures.d.ts +2 -0
  216. package/dist/genui/test-fixtures.js +16 -0
  217. package/dist/genui/types.d.ts +29 -0
  218. package/dist/genui/types.js +1 -0
  219. package/dist/genui/urls.d.ts +1 -0
  220. package/dist/genui/urls.js +18 -0
  221. package/dist/genui/validate.d.ts +9 -0
  222. package/dist/genui/validate.js +116 -0
  223. package/dist/index.d.ts +4 -4
  224. package/dist/index.js +4 -4
  225. package/dist/internal/connector-catalog.d.ts +48 -0
  226. package/dist/internal/connector-catalog.js +27 -0
  227. package/dist/internal/host-configuration.d.ts +22 -0
  228. package/dist/internal/host-configuration.js +28 -0
  229. package/dist/internal/platform-admin-react.d.ts +12 -0
  230. package/dist/internal/platform-admin-react.js +13 -0
  231. package/dist/internal/platform-admin.d.ts +9 -0
  232. package/dist/internal/platform-admin.js +9 -0
  233. package/dist/platform/ui.d.ts +8 -2
  234. package/dist/platform/ui.js +19 -4
  235. package/dist/react/chat/use-chat-turns.d.ts +1 -1
  236. package/dist/react/human-presence.d.ts +9 -0
  237. package/dist/react/human-presence.js +12 -0
  238. package/dist/react/index.d.ts +4 -13
  239. package/dist/react/index.js +4 -13
  240. package/dist/react/opencode.d.ts +1 -0
  241. package/dist/react/opencode.js +1 -0
  242. package/dist/react/query-contracts.d.ts +6 -0
  243. package/dist/react/query-contracts.js +6 -0
  244. package/dist/react/query-keys.d.ts +17 -2
  245. package/dist/react/query-keys.js +24 -2
  246. package/dist/react/reset-identity-state.js +2 -0
  247. package/dist/react/session-cache-write.d.ts +1 -0
  248. package/dist/react/session-cache-write.js +20 -0
  249. package/dist/react/session-transcript-subscription.js +3 -1
  250. package/dist/react/sign-in-with-beeuni.d.ts +6 -6
  251. package/dist/react/turn-end-handoff.d.ts +13 -0
  252. package/dist/react/turn-end-handoff.js +101 -0
  253. package/dist/react/use-admin-providers.d.ts +3 -6
  254. package/dist/react/use-admin-providers.js +1 -11
  255. package/dist/react/use-capture.d.ts +47 -0
  256. package/dist/react/use-capture.js +173 -0
  257. package/dist/react/use-feature-flag.js +1 -0
  258. package/dist/react/use-opencode-events/handle-event.d.ts +1 -0
  259. package/dist/react/use-opencode-events/handle-event.js +5 -0
  260. package/dist/react/use-opencode-events/handle-interaction-event.js +8 -3
  261. package/dist/react/use-opencode-events/handle-session-event.js +13 -8
  262. package/dist/react/use-opencode-events/handler-context.d.ts +1 -0
  263. package/dist/react/use-opencode-events/helpers.d.ts +1 -0
  264. package/dist/react/use-opencode-events/helpers.js +11 -1
  265. package/dist/react/use-opencode-events/index.js +1 -0
  266. package/dist/react/use-opencode-local.d.ts +5 -1
  267. package/dist/react/use-opencode-local.js +15 -2
  268. package/dist/react/use-opencode-sessions/commands.d.ts +11 -1
  269. package/dist/react/use-opencode-sessions/commands.js +21 -1
  270. package/dist/react/use-opencode-sessions/permissions.js +28 -1
  271. package/dist/react/use-project-sessions.d.ts +1 -1
  272. package/dist/react/use-project-sessions.js +6 -5
  273. package/dist/react/use-prompt-attachments.js +1 -0
  274. package/dist/react/use-review-summary.d.ts +13 -0
  275. package/dist/react/use-review-summary.js +32 -0
  276. package/dist/react/use-runtime-reconnect.js +1 -1
  277. package/dist/react/use-session-list-state.d.ts +6 -0
  278. package/dist/react/use-session-list-state.js +33 -0
  279. package/dist/react/use-session-log.d.ts +16 -0
  280. package/dist/react/use-session-log.js +143 -0
  281. package/dist/react/use-session-messages.d.ts +2 -1
  282. package/dist/react/use-session-messages.js +15 -14
  283. package/dist/react/use-session-stream.js +12 -1
  284. package/dist/react/use-session-sync.d.ts +2 -2
  285. package/dist/react/use-session-sync.js +10 -8
  286. package/dist/react/use-session-transcript-history.js +2 -12
  287. package/dist/react/use-session-working.d.ts +2 -0
  288. package/dist/react/use-session-working.js +10 -0
  289. package/dist/react/use-session.d.ts +6 -0
  290. package/dist/react/use-session.js +88 -6
  291. package/package.json +62 -8
@@ -0,0 +1,13 @@
1
+ import type { Message, Part } from '../runtime/runtime-types.js';
2
+ import type { SessionLogState, SessionLogThreadHead } from './store.js';
3
+ import { type SessionLog, type SessionLogMessage, type SessionLogThread } from './types.js';
4
+ export interface V1MessageRow {
5
+ info: Message;
6
+ parts: Part[];
7
+ }
8
+ export declare const isV1Thread: (head: SessionLogThreadHead | undefined) => boolean;
9
+ export declare function rowsOf(head: SessionLogThreadHead, message: SessionLogMessage): V1MessageRow[];
10
+ export type OptimisticEchoOf = (id: string) => string | undefined;
11
+ export declare function sessionLogRowsFor<R extends V1MessageRow>(logs: Record<string, SessionLogState>, runtimeSessionId: string, v1Rows: R[], echoOf?: OptimisticEchoOf): R[];
12
+ export declare function sessionLogThreadWithV1Rows(state: SessionLogState, thread: SessionLogThread, v1Rows: readonly V1MessageRow[], echoOf?: OptimisticEchoOf): SessionLogThread;
13
+ export declare function sessionLogOfV1Rows(sessionId: string, runtimeSessionId: string, rows: readonly V1MessageRow[]): SessionLog;
@@ -0,0 +1,215 @@
1
+ import { SESSION_LOG_MINOR, SESSION_LOG_SCHEMA } from './types.js';
2
+ import { BEEUNI_TRANSCRIPT_SCHEMA } from '../runtime/transcript-types.js';
3
+ import { fromV1, toV1 } from './v1.js';
4
+ const SHELL = {
5
+ schema: SESSION_LOG_SCHEMA,
6
+ v: SESSION_LOG_MINOR,
7
+ session_id: '',
8
+ title: null,
9
+ created_at: '',
10
+ restore_grade: 'native',
11
+ harness: { current: '', history: [] },
12
+ selection: { agent: null, model: null },
13
+ todos: [],
14
+ pending: { questions: [], permissions: [] },
15
+ };
16
+ const NO_MESSAGES = [];
17
+ const v1Ext = (head) => Object.values(head.ext ?? {}).find((e) => e.version === BEEUNI_TRANSCRIPT_SCHEMA);
18
+ export const isV1Thread = (head) => !!head && v1Ext(head) !== undefined;
19
+ const nativeOf = (head) => {
20
+ const e = v1Ext(head);
21
+ return e ? (e.native_id ?? null) : head.thread_id;
22
+ };
23
+ const messageRows = new WeakMap();
24
+ export function rowsOf(head, message) {
25
+ const native = nativeOf(head);
26
+ const cached = messageRows.get(message);
27
+ if (cached && cached.native === native)
28
+ return cached.rows;
29
+ const { rows } = toV1({ ...SHELL, threads: [{ ...head, messages: [message] }] });
30
+ const out = rows.map((r) => ({ info: r.info, parts: r.parts }));
31
+ messageRows.set(message, { native, rows: out });
32
+ return out;
33
+ }
34
+ const indexes = new WeakMap();
35
+ function indexOf(state) {
36
+ let index = indexes.get(state);
37
+ if (!index) {
38
+ index = new Map();
39
+ for (const head of Object.values(state.threads)) {
40
+ const native = nativeOf(head);
41
+ if (native !== null && !index.has(native))
42
+ index.set(native, head.thread_id);
43
+ }
44
+ indexes.set(state, index);
45
+ }
46
+ return index;
47
+ }
48
+ function findThread(logs, runtimeSessionId) {
49
+ for (const state of Object.values(logs)) {
50
+ const threadId = indexOf(state).get(runtimeSessionId);
51
+ if (threadId !== undefined)
52
+ return { state, head: state.threads[threadId], list: state.messages[threadId] ?? NO_MESSAGES };
53
+ }
54
+ return null;
55
+ }
56
+ const createdOf = (row) => row.info.time?.created;
57
+ function insertAt(rows, row) {
58
+ const created = createdOf(row);
59
+ if (created === undefined)
60
+ return rows.length;
61
+ const at = rows.findIndex((other) => {
62
+ const t = createdOf(other);
63
+ return t !== undefined && (t > created || (t === created && other.info.id > row.info.id));
64
+ });
65
+ return at < 0 ? rows.length : at;
66
+ }
67
+ function messageInsertAt(messages, message) {
68
+ const created = Date.parse(message.created_at);
69
+ if (!Number.isFinite(created))
70
+ return messages.length;
71
+ const at = messages.findIndex((other) => {
72
+ const t = Date.parse(other.created_at);
73
+ return Number.isFinite(t) && (t > created || (t === created && other.message_id > message.message_id));
74
+ });
75
+ return at < 0 ? messages.length : at;
76
+ }
77
+ const v1Order = (a, b) => (createdOf(a) ?? -Infinity) - (createdOf(b) ?? -Infinity) || (a.info.id < b.info.id ? -1 : a.info.id > b.info.id ? 1 : 0);
78
+ const merged = new WeakMap();
79
+ function heldByLog(row, held, revs, echoOf) {
80
+ const id = row.info.id;
81
+ if (held.has(id) || revs[id] !== undefined)
82
+ return true;
83
+ const echo = echoOf?.(id);
84
+ return echo !== undefined && (held.has(echo) || revs[echo] !== undefined);
85
+ }
86
+ export function sessionLogRowsFor(logs, runtimeSessionId, v1Rows, echoOf) {
87
+ const found = findThread(logs, runtimeSessionId);
88
+ if (!found)
89
+ return v1Rows;
90
+ const { state, head, list } = found;
91
+ const cached = merged.get(list);
92
+ const native = nativeOf(head);
93
+ const own = cached && cached.v1Rows === v1Rows && cached.native === native && cached.revs === state.revs ? cached.own : list.flatMap((m) => rowsOf(head, m)).sort(v1Order);
94
+ const shown = new Set(own.map((r) => r.info.id));
95
+ const extra = v1Rows.filter((row) => !heldByLog(row, shown, state.revs, echoOf));
96
+ if (cached && cached.own === own && cached.extra.length === extra.length && cached.extra.every((r, i) => r === extra[i]))
97
+ return cached.result;
98
+ const result = [...own];
99
+ for (const row of extra)
100
+ result.splice(insertAt(result, row), 0, row);
101
+ merged.set(list, { v1Rows, native, revs: state.revs, own, extra, result });
102
+ return result;
103
+ }
104
+ const extended = new WeakMap();
105
+ export function sessionLogThreadWithV1Rows(state, thread, v1Rows, echoOf) {
106
+ const cached = extended.get(thread);
107
+ const held = cached?.held ?? new Set(thread.messages.flatMap((m) => rowsOf(thread, m).map((r) => r.info.id)));
108
+ const extra = v1Rows.filter((r) => !heldByLog(r, held, state.revs, echoOf));
109
+ if (cached && cached.extra.length === extra.length && cached.extra.every((r, i) => r === extra[i]))
110
+ return cached.result;
111
+ let result = thread;
112
+ if (extra.length) {
113
+ let seq = thread.messages[thread.messages.length - 1]?.seq ?? 0;
114
+ const { paired, used } = pairCompactions(extra);
115
+ const messages = [...thread.messages];
116
+ for (const r of extra) {
117
+ if (used.has(r))
118
+ continue;
119
+ const message = convert(state.session.session_id ?? '', thread.thread_id, r, paired.get(r), ++seq).message;
120
+ messages.splice(messageInsertAt(messages, message), 0, message);
121
+ }
122
+ result = { ...thread, messages };
123
+ }
124
+ extended.set(thread, { held, extra, result });
125
+ return result;
126
+ }
127
+ const converted = new WeakMap();
128
+ const views = new WeakMap();
129
+ const isObj = (v) => typeof v === 'object' && v !== null;
130
+ const iso = (ms) => (ms !== undefined && Number.isFinite(ms) && Math.abs(ms) <= 8.64e15 ? new Date(ms).toISOString() : null);
131
+ const isMarker = (row) => row.info.role === 'user' && row.parts.some((p) => isObj(p) && p.type === 'compaction');
132
+ const summaryOf = (row, marker) => {
133
+ const info = row.info;
134
+ return info.role === 'assistant' && info.summary === true && info.parentID === marker.info.id;
135
+ };
136
+ const partBlocks = new WeakMap();
137
+ function reuseBlocks(native, row, message) {
138
+ const info = row.info;
139
+ const at = `${native}|${String(info.id)}|${String(info.time?.created)}`;
140
+ let reused = false;
141
+ const blocks = message.blocks.map((block, i) => {
142
+ const part = row.parts[i];
143
+ if (!isObj(part) || block.type === 'compaction')
144
+ return block;
145
+ const key = `${at}|${i}|${block.id}`;
146
+ const prev = partBlocks.get(part);
147
+ if (prev && prev.key === key) {
148
+ reused = true;
149
+ return prev.block;
150
+ }
151
+ partBlocks.set(part, { key, block });
152
+ return block;
153
+ });
154
+ return reused ? { ...message, blocks } : message;
155
+ }
156
+ function pairCompactions(rows) {
157
+ const paired = new Map();
158
+ const used = new Set();
159
+ for (const row of rows) {
160
+ if (!isMarker(row))
161
+ continue;
162
+ const sum = rows.find((r) => !used.has(r) && summaryOf(r, row));
163
+ if (!sum)
164
+ continue;
165
+ paired.set(row, sum);
166
+ used.add(sum);
167
+ }
168
+ return { paired, used };
169
+ }
170
+ function convert(sessionId, native, row, sum, seq) {
171
+ const cached = converted.get(row);
172
+ if (cached && cached.sessionId === sessionId && cached.native === native && cached.sum === sum && cached.seq === seq)
173
+ return cached;
174
+ const unit = sum ? [row, sum] : [row];
175
+ const log = fromV1({ session_id: sessionId, root_id: native, rows: unit.map((r) => ({ runtime_session_id: native, info: r.info, parts: r.parts })) }, { live: true });
176
+ const message = reuseBlocks(native, row, log.threads[0].messages[0]);
177
+ const entry = { sessionId, native, sum, seq, message: { ...message, seq }, lost: log.grade_counts };
178
+ converted.set(row, entry);
179
+ return entry;
180
+ }
181
+ export function sessionLogOfV1Rows(sessionId, runtimeSessionId, rows) {
182
+ const cached = views.get(rows);
183
+ if (cached && cached.sessionId === sessionId && cached.native === runtimeSessionId)
184
+ return cached.log;
185
+ const sorted = [...rows].sort(v1Order);
186
+ const { paired, used } = pairCompactions(sorted);
187
+ const counts = { tool_input: 0, cut_point: 0, attachment: 0 };
188
+ const messages = [];
189
+ for (const row of sorted) {
190
+ if (used.has(row))
191
+ continue;
192
+ const entry = convert(sessionId, runtimeSessionId, row, paired.get(row), messages.length + 1);
193
+ for (const k of ['tool_input', 'cut_point', 'attachment'])
194
+ counts[k] += entry.lost[k];
195
+ messages.push(entry.message);
196
+ }
197
+ const created = iso(sorted.map(createdOf).find((t) => typeof t === 'number' && Number.isFinite(t))) ?? '';
198
+ const users = messages.filter((m) => m.role === 'user' && m.kind === 'turn');
199
+ const log = {
200
+ ...SHELL,
201
+ session_id: sessionId,
202
+ created_at: created,
203
+ restore_grade: counts.tool_input + counts.cut_point + counts.attachment > 0 ? 'partial' : 'converted',
204
+ grade_counts: counts,
205
+ harness: { current: 'opencode', history: [] },
206
+ selection: { agent: users.at(-1)?.agent ?? null, model: users.at(-1)?.model ?? null },
207
+ threads: [{
208
+ schema: SESSION_LOG_SCHEMA, v: SESSION_LOG_MINOR, thread_id: runtimeSessionId, parent_thread_id: null, spawned_by: null,
209
+ agent: users[0]?.agent ?? null, title: null, created_at: messages[0]?.created_at || created, messages,
210
+ ext: { opencode: { version: BEEUNI_TRANSCRIPT_SCHEMA, native_id: runtimeSessionId } },
211
+ }],
212
+ };
213
+ views.set(rows, { sessionId, native: runtimeSessionId, log });
214
+ return log;
215
+ }
@@ -0,0 +1,31 @@
1
+ import type { BeeuniFilePart, BeeuniMessageInfo, BeeuniPart } from '../runtime/transcript-types.js';
2
+ import { type SessionLog } from './types.js';
3
+ export type V1Row = {
4
+ runtime_session_id: string | null;
5
+ info: BeeuniMessageInfo;
6
+ parts: BeeuniPart[];
7
+ };
8
+ export type V1Transcript = {
9
+ session_id: string;
10
+ root_id: string | null;
11
+ rows: V1Row[];
12
+ };
13
+ export type V1Attachment = {
14
+ ref: string;
15
+ bytes: number;
16
+ sha256?: string;
17
+ };
18
+ export type FromV1Options = {
19
+ harness?: 'opencode' | 'pi';
20
+ resolveAttachment?: (part: BeeuniFilePart) => V1Attachment | null;
21
+ live?: boolean;
22
+ };
23
+ export type V1Change = {
24
+ set: unknown;
25
+ } | {
26
+ del: true;
27
+ } | {
28
+ sub: Record<string, V1Change>;
29
+ };
30
+ export declare function toV1(input: SessionLog): V1Transcript;
31
+ export declare function fromV1(v1: V1Transcript, options?: FromV1Options): SessionLog;