@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.
- package/README.md +53 -92
- package/dist/beeuni.esm.min.js +36 -34
- package/dist/beeuni.global.js +36 -34
- package/dist/browser/cache/idb-sync-cache.js +15 -5
- package/dist/browser/session-sync/server-transcript-mirror.d.ts +7 -1
- package/dist/browser/session-sync/server-transcript-mirror.js +30 -24
- package/dist/browser/session-sync/session-sync-registry.d.ts +3 -1
- package/dist/browser/session-sync/session-sync-registry.js +48 -3
- package/dist/browser/stores/sync-store/keep-unchanged.d.ts +4 -0
- package/dist/browser/stores/sync-store/keep-unchanged.js +34 -0
- package/dist/browser/stores/sync-store.d.ts +7 -0
- package/dist/browser/stores/sync-store.js +122 -35
- package/dist/core/attachments/prompt-attachments.d.ts +4 -0
- package/dist/core/attachments/prompt-attachments.js +34 -0
- package/dist/core/capture/rules.d.ts +17 -0
- package/dist/core/capture/rules.js +27 -0
- package/dist/core/client/beeuni.d.ts +99 -34
- package/dist/core/client/beeuni.js +5 -11
- package/dist/core/client/capture.d.ts +105 -0
- package/dist/core/client/capture.js +48 -0
- package/dist/core/client/facade-catalog.d.ts +0 -4
- package/dist/core/client/facade-catalog.js +1 -5
- package/dist/core/client/facade-identity.d.ts +1 -0
- package/dist/core/client/facade-identity.js +1 -0
- package/dist/core/client/project-access-resources.d.ts +3 -1
- package/dist/core/client/project-access-resources.js +1 -1
- package/dist/core/client/project-connections.d.ts +2 -2
- package/dist/core/client/project-connections.js +2 -2
- package/dist/core/client/project-operations-admin.d.ts +4 -4
- package/dist/core/client/project-operations-review.d.ts +2 -3
- package/dist/core/client/project-operations-review.js +1 -0
- package/dist/core/client/project-operations-workspace.d.ts +4 -4
- package/dist/core/client/project-operations-workspace.js +1 -1
- package/dist/core/client/project-operations.d.ts +9 -19
- package/dist/core/client/project-operations.js +2 -6
- package/dist/core/client/project-platform-security.d.ts +1 -1
- package/dist/core/client/project-platform-settings.d.ts +1 -1
- package/dist/core/client/session-context.d.ts +2 -0
- package/dist/core/client/session-handle.d.ts +13 -0
- package/dist/core/client/session-lifecycle-resources.d.ts +11 -0
- package/dist/core/client/session-lifecycle-resources.js +4 -0
- package/dist/core/client/session-lifecycle-security.d.ts +2 -0
- package/dist/core/client/session-lifecycle-security.js +1 -0
- package/dist/core/client/session-readiness.d.ts +2 -0
- package/dist/core/client/session-readiness.js +20 -1
- package/dist/core/http/api-client.d.ts +1 -7
- package/dist/core/http/api-client.js +2 -37
- package/dist/core/http/auth.d.ts +2 -4
- package/dist/core/http/auth.js +2 -8
- package/dist/core/http/config.d.ts +2 -0
- package/dist/core/http/response-error.js +26 -11
- package/dist/core/http/transport.js +6 -1
- package/dist/core/models/composer-model.d.ts +14 -0
- package/dist/core/models/composer-model.js +21 -1
- package/dist/core/rest/platform-client/capture.d.ts +363 -0
- package/dist/core/rest/platform-client/capture.js +116 -0
- package/dist/core/rest/platform-client/client-policy.d.ts +8 -0
- package/dist/core/rest/platform-client/client-policy.js +30 -0
- package/dist/core/rest/platform-client/index.d.ts +4 -4
- package/dist/core/rest/platform-client/index.js +4 -4
- package/dist/core/rest/platform-client/lifecycle.js +18 -12
- package/dist/core/rest/platform-client/shared.d.ts +5 -0
- package/dist/core/rest/platform-client/shared.js +18 -0
- package/dist/core/rest/platform-client/types.d.ts +1 -1
- package/dist/core/rest/projects-client/account-secret-resources.d.ts +2 -1
- package/dist/core/rest/projects-client/accounts.d.ts +34 -0
- package/dist/core/rest/projects-client/accounts.js +10 -0
- package/dist/core/rest/projects-client/admin-providers.d.ts +0 -61
- package/dist/core/rest/projects-client/admin-providers.js +0 -6
- package/dist/core/rest/projects-client/agent-config.d.ts +3 -0
- package/dist/core/rest/projects-client/apps-fleet.d.ts +5 -1
- package/dist/core/rest/projects-client/apps-fleet.js +2 -2
- package/dist/core/rest/projects-client/apps.d.ts +11 -1
- package/dist/core/rest/projects-client/change-requests.d.ts +2 -0
- package/dist/core/rest/projects-client/change-requests.js +2 -0
- package/dist/core/rest/projects-client/connectors.d.ts +13 -55
- package/dist/core/rest/projects-client/connectors.js +5 -29
- package/dist/core/rest/projects-client/files.d.ts +3 -0
- package/dist/core/rest/projects-client/files.js +4 -0
- package/dist/core/rest/projects-client/gateway.d.ts +5 -0
- package/dist/core/rest/projects-client/git-backend.d.ts +1 -10
- package/dist/core/rest/projects-client/git-backend.js +0 -10
- package/dist/core/rest/projects-client/iam-actions.d.ts +76 -0
- package/dist/core/rest/projects-client/iam-actions.js +101 -0
- package/dist/core/rest/projects-client/iam-sso.d.ts +0 -10
- package/dist/core/rest/projects-client/iam-sso.js +0 -3
- package/dist/core/rest/projects-client/iam.d.ts +1 -0
- package/dist/core/rest/projects-client/iam.js +1 -0
- package/dist/core/rest/projects-client/index.d.ts +1 -4
- package/dist/core/rest/projects-client/index.js +1 -4
- package/dist/core/rest/projects-client/notifications.d.ts +1 -1
- package/dist/core/rest/projects-client/notifications.js +4 -0
- package/dist/core/rest/projects-client/projects.d.ts +4 -2
- package/dist/core/rest/projects-client/projects.js +4 -2
- package/dist/core/rest/projects-client/review-items.d.ts +2 -0
- package/dist/core/rest/projects-client/review-items.js +4 -0
- package/dist/core/rest/projects-client/review.d.ts +17 -3
- package/dist/core/rest/projects-client/review.js +11 -0
- package/dist/core/rest/projects-client/sandbox.d.ts +8 -9
- package/dist/core/rest/projects-client/secrets.d.ts +3 -0
- package/dist/core/rest/projects-client/session-attachments.js +14 -1
- package/dist/core/rest/projects-client/session-sandbox.d.ts +1 -1
- package/dist/core/rest/projects-client/sessions.d.ts +31 -4
- package/dist/core/rest/projects-client/sessions.js +34 -4
- package/dist/core/runtime/runtime-rest-client.js +1 -1
- package/dist/core/runtime/runtime-types.d.ts +1 -0
- package/dist/core/session/control-stream.d.ts +1 -0
- package/dist/core/session/control-stream.js +18 -1
- package/dist/core/session/open-bundle.d.ts +4 -4
- package/dist/core/session/open-bundle.js +29 -46
- package/dist/core/session/turn-end-watch.d.ts +47 -0
- package/dist/core/session/turn-end-watch.js +141 -0
- package/dist/core/session-log/guard.d.ts +6 -0
- package/dist/core/session-log/guard.js +109 -0
- package/dist/core/session-log/index.d.ts +7 -0
- package/dist/core/session-log/index.js +5 -0
- package/dist/core/session-log/saved-log.d.ts +10 -0
- package/dist/core/session-log/saved-log.js +25 -0
- package/dist/core/session-log/source.d.ts +25 -0
- package/dist/core/session-log/source.js +30 -0
- package/dist/core/session-log/store.d.ts +21 -0
- package/dist/core/session-log/store.js +126 -0
- package/dist/core/session-log/tool-call.d.ts +11 -0
- package/dist/core/session-log/tool-call.js +65 -0
- package/dist/core/session-log/turns/blocks.d.ts +60 -0
- package/dist/core/session-log/turns/blocks.js +124 -0
- package/dist/core/session-log/turns/history.d.ts +32 -0
- package/dist/core/session-log/turns/history.js +99 -0
- package/dist/core/session-log/turns/index.d.ts +4 -0
- package/dist/core/session-log/turns/index.js +4 -0
- package/dist/core/session-log/turns/metrics.d.ts +21 -0
- package/dist/core/session-log/turns/metrics.js +29 -0
- package/dist/core/session-log/turns/turn.d.ts +55 -0
- package/dist/core/session-log/turns/turn.js +279 -0
- package/dist/core/session-log/turns/v1-parts.d.ts +8 -0
- package/dist/core/session-log/turns/v1-parts.js +43 -0
- package/dist/core/session-log/types.d.ts +264 -0
- package/dist/core/session-log/types.js +6 -0
- package/dist/core/session-log/v1-view.d.ts +13 -0
- package/dist/core/session-log/v1-view.js +215 -0
- package/dist/core/session-log/v1.d.ts +31 -0
- package/dist/core/session-log/v1.js +473 -0
- package/dist/core/session-sync/copy-store-types.d.ts +19 -0
- package/dist/core/session-sync/copy-store-types.js +1 -0
- package/dist/core/session-sync/saved-copy-store.js +25 -4
- package/dist/core/session-sync/saved-transcript.d.ts +15 -1
- package/dist/core/session-sync/saved-transcript.js +55 -0
- package/dist/core/session-sync/session-sync-controller.js +3 -0
- package/dist/core/stream/event-stream.js +2 -2
- package/dist/core/turns/classify.d.ts +2 -1
- package/dist/core/turns/classify.js +7 -3
- package/dist/core/turns/edit-blocks.d.ts +1 -0
- package/dist/core/turns/edit-blocks.js +15 -0
- package/dist/core/turns/parts.d.ts +3 -2
- package/dist/core/turns/parts.js +4 -2
- package/dist/core/turns/segments/burst-summary.d.ts +1 -0
- package/dist/core/turns/segments/burst-summary.js +24 -0
- package/dist/core/turns/segments/group-steps.d.ts +4 -3
- package/dist/core/turns/segments/group-steps.js +9 -6
- package/dist/core/turns/segments/index.d.ts +1 -0
- package/dist/core/turns/segments/index.js +1 -0
- package/dist/core/turns/segments/narration.d.ts +5 -4
- package/dist/core/turns/segments/narration.js +12 -3
- package/dist/core/turns/segments/session-activity-groups.d.ts +2 -1
- package/dist/core/turns/segments/session-activity-groups.js +3 -1
- package/dist/core/turns/segments/step-label.d.ts +2 -1
- package/dist/core/turns/segments/step-label.js +3 -1
- package/dist/core/turns/segments/work-split.d.ts +10 -0
- package/dist/core/turns/segments/work-split.js +40 -0
- package/dist/core/turns/segments/working-turn.d.ts +4 -2
- package/dist/core/turns/segments/working-turn.js +9 -8
- package/dist/core/turns/state.d.ts +2 -7
- package/dist/core/turns/state.js +28 -134
- package/dist/core/turns/tool-kind.d.ts +1 -1
- package/dist/core/turns/tool-kind.js +3 -2
- package/dist/core/turns/tool-registry.js +1 -0
- package/dist/core/turns/tools/tool-meta.d.ts +3 -2
- package/dist/core/turns/tools/tool-meta.js +5 -2
- package/dist/core/turns/tools/tool-outcome.d.ts +2 -1
- package/dist/core/turns/tools/tool-outcome.js +3 -1
- package/dist/core/turns/types.d.ts +1 -1
- package/dist/core/turns/view-model.js +1 -13
- package/dist/core/warm-session-pool.d.ts +29 -0
- package/dist/core/warm-session-pool.js +127 -0
- package/dist/genui/catalog.d.ts +28 -0
- package/dist/genui/catalog.js +396 -0
- package/dist/genui/expansion.d.ts +3 -0
- package/dist/genui/expansion.js +295 -0
- package/dist/genui/fence-entry.d.ts +2 -0
- package/dist/genui/fence-entry.js +1 -0
- package/dist/genui/fence.d.ts +21 -0
- package/dist/genui/fence.js +138 -0
- package/dist/genui/index.d.ts +6 -0
- package/dist/genui/index.js +6 -0
- package/dist/genui/markdown.d.ts +12 -0
- package/dist/genui/markdown.js +104 -0
- package/dist/genui/parse.d.ts +6 -0
- package/dist/genui/parse.js +75 -0
- package/dist/genui/prompt.d.ts +2 -0
- package/dist/genui/prompt.js +206 -0
- package/dist/genui/react/default-components.d.ts +2 -0
- package/dist/genui/react/default-components.js +72 -0
- package/dist/genui/react/default-components.test.d.ts +1 -0
- package/dist/genui/react/default-components.test.js +94 -0
- package/dist/genui/react/genui-block-disabled.test.d.ts +1 -0
- package/dist/genui/react/genui-block-disabled.test.js +50 -0
- package/dist/genui/react/genui-block.d.ts +28 -0
- package/dist/genui/react/genui-block.js +91 -0
- package/dist/genui/react/genui-block.test.d.ts +1 -0
- package/dist/genui/react/genui-block.test.js +205 -0
- package/dist/genui/react/index.d.ts +2 -0
- package/dist/genui/react/index.js +2 -0
- package/dist/genui/share.d.ts +5 -0
- package/dist/genui/share.js +30 -0
- package/dist/genui/test-fixtures.d.ts +2 -0
- package/dist/genui/test-fixtures.js +16 -0
- package/dist/genui/types.d.ts +29 -0
- package/dist/genui/types.js +1 -0
- package/dist/genui/urls.d.ts +1 -0
- package/dist/genui/urls.js +18 -0
- package/dist/genui/validate.d.ts +9 -0
- package/dist/genui/validate.js +116 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +4 -4
- package/dist/internal/connector-catalog.d.ts +48 -0
- package/dist/internal/connector-catalog.js +27 -0
- package/dist/internal/host-configuration.d.ts +22 -0
- package/dist/internal/host-configuration.js +28 -0
- package/dist/internal/platform-admin-react.d.ts +12 -0
- package/dist/internal/platform-admin-react.js +13 -0
- package/dist/internal/platform-admin.d.ts +9 -0
- package/dist/internal/platform-admin.js +9 -0
- package/dist/platform/ui.d.ts +8 -2
- package/dist/platform/ui.js +19 -4
- package/dist/react/chat/use-chat-turns.d.ts +1 -1
- package/dist/react/human-presence.d.ts +9 -0
- package/dist/react/human-presence.js +12 -0
- package/dist/react/index.d.ts +4 -13
- package/dist/react/index.js +4 -13
- package/dist/react/opencode.d.ts +1 -0
- package/dist/react/opencode.js +1 -0
- package/dist/react/query-contracts.d.ts +6 -0
- package/dist/react/query-contracts.js +6 -0
- package/dist/react/query-keys.d.ts +17 -2
- package/dist/react/query-keys.js +24 -2
- package/dist/react/reset-identity-state.js +2 -0
- package/dist/react/session-cache-write.d.ts +1 -0
- package/dist/react/session-cache-write.js +20 -0
- package/dist/react/session-transcript-subscription.js +3 -1
- package/dist/react/sign-in-with-beeuni.d.ts +6 -6
- package/dist/react/turn-end-handoff.d.ts +13 -0
- package/dist/react/turn-end-handoff.js +101 -0
- package/dist/react/use-admin-providers.d.ts +3 -6
- package/dist/react/use-admin-providers.js +1 -11
- package/dist/react/use-capture.d.ts +47 -0
- package/dist/react/use-capture.js +173 -0
- package/dist/react/use-feature-flag.js +1 -0
- package/dist/react/use-opencode-events/handle-event.d.ts +1 -0
- package/dist/react/use-opencode-events/handle-event.js +5 -0
- package/dist/react/use-opencode-events/handle-interaction-event.js +8 -3
- package/dist/react/use-opencode-events/handle-session-event.js +13 -8
- package/dist/react/use-opencode-events/handler-context.d.ts +1 -0
- package/dist/react/use-opencode-events/helpers.d.ts +1 -0
- package/dist/react/use-opencode-events/helpers.js +11 -1
- package/dist/react/use-opencode-events/index.js +1 -0
- package/dist/react/use-opencode-local.d.ts +5 -1
- package/dist/react/use-opencode-local.js +15 -2
- package/dist/react/use-opencode-sessions/commands.d.ts +11 -1
- package/dist/react/use-opencode-sessions/commands.js +21 -1
- package/dist/react/use-opencode-sessions/permissions.js +28 -1
- package/dist/react/use-project-sessions.d.ts +1 -1
- package/dist/react/use-project-sessions.js +6 -5
- package/dist/react/use-prompt-attachments.js +1 -0
- package/dist/react/use-review-summary.d.ts +13 -0
- package/dist/react/use-review-summary.js +32 -0
- package/dist/react/use-runtime-reconnect.js +1 -1
- package/dist/react/use-session-list-state.d.ts +6 -0
- package/dist/react/use-session-list-state.js +33 -0
- package/dist/react/use-session-log.d.ts +16 -0
- package/dist/react/use-session-log.js +143 -0
- package/dist/react/use-session-messages.d.ts +2 -1
- package/dist/react/use-session-messages.js +15 -14
- package/dist/react/use-session-stream.js +12 -1
- package/dist/react/use-session-sync.d.ts +2 -2
- package/dist/react/use-session-sync.js +10 -8
- package/dist/react/use-session-transcript-history.js +2 -12
- package/dist/react/use-session-working.d.ts +2 -0
- package/dist/react/use-session-working.js +10 -0
- package/dist/react/use-session.d.ts +6 -0
- package/dist/react/use-session.js +88 -6
- 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;
|