@vibesdotdev/code-sessions 0.0.0-stage → 1.0.0-rc.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/LICENSE +18 -0
- package/README.md +165 -2
- package/dist/agent/coordinator.agent.descriptor.d.ts +69 -0
- package/dist/agent/coordinator.agent.descriptor.d.ts.map +1 -0
- package/dist/agent/coordinator.agent.descriptor.js +60 -0
- package/dist/agent/coordinator.agent.descriptor.js.map +1 -0
- package/dist/agent/coordinator.prompt.descriptor.d.ts +135 -0
- package/dist/agent/coordinator.prompt.descriptor.d.ts.map +1 -0
- package/dist/agent/coordinator.prompt.descriptor.js +29 -0
- package/dist/agent/coordinator.prompt.descriptor.js.map +1 -0
- package/dist/agent/coordinator.system-prompt.d.ts +3 -0
- package/dist/agent/coordinator.system-prompt.d.ts.map +1 -0
- package/dist/agent/coordinator.system-prompt.js +18 -0
- package/dist/agent/coordinator.system-prompt.js.map +1 -0
- package/dist/agent/developer.agent.descriptor.d.ts +74 -0
- package/dist/agent/developer.agent.descriptor.d.ts.map +1 -0
- package/dist/agent/developer.agent.descriptor.js +138 -0
- package/dist/agent/developer.agent.descriptor.js.map +1 -0
- package/dist/agent/developer.prompt.descriptor.d.ts +137 -0
- package/dist/agent/developer.prompt.descriptor.d.ts.map +1 -0
- package/dist/agent/developer.prompt.descriptor.js +29 -0
- package/dist/agent/developer.prompt.descriptor.js.map +1 -0
- package/dist/agent/reviewer.agent.descriptor.d.ts +69 -0
- package/dist/agent/reviewer.agent.descriptor.d.ts.map +1 -0
- package/dist/agent/reviewer.agent.descriptor.js +60 -0
- package/dist/agent/reviewer.agent.descriptor.js.map +1 -0
- package/dist/agent/reviewer.prompt.descriptor.d.ts +135 -0
- package/dist/agent/reviewer.prompt.descriptor.d.ts.map +1 -0
- package/dist/agent/reviewer.prompt.descriptor.js +29 -0
- package/dist/agent/reviewer.prompt.descriptor.js.map +1 -0
- package/dist/agent/reviewer.system-prompt.d.ts +3 -0
- package/dist/agent/reviewer.system-prompt.d.ts.map +1 -0
- package/dist/agent/reviewer.system-prompt.js +17 -0
- package/dist/agent/reviewer.system-prompt.js.map +1 -0
- package/dist/agent/system-prompt.d.ts +12 -0
- package/dist/agent/system-prompt.d.ts.map +1 -0
- package/dist/agent/system-prompt.js +28 -0
- package/dist/agent/system-prompt.js.map +1 -0
- package/dist/api/code-sessions.api-client.descriptor.d.ts +25 -0
- package/dist/api/code-sessions.api-client.descriptor.d.ts.map +1 -0
- package/dist/api/code-sessions.api-client.descriptor.js +26 -0
- package/dist/api/code-sessions.api-client.descriptor.js.map +1 -0
- package/dist/api/code-sessions.api-client.impl.d.ts +156 -0
- package/dist/api/code-sessions.api-client.impl.d.ts.map +1 -0
- package/dist/api/code-sessions.api-client.impl.js +852 -0
- package/dist/api/code-sessions.api-client.impl.js.map +1 -0
- package/dist/api/code-sessions.api-client.schemas.d.ts +2 -0
- package/dist/api/code-sessions.api-client.schemas.d.ts.map +1 -0
- package/dist/api/code-sessions.api-client.schemas.js +2 -0
- package/dist/api/code-sessions.api-client.schemas.js.map +1 -0
- package/dist/api/code-sessions.api-client.types.d.ts +252 -0
- package/dist/api/code-sessions.api-client.types.d.ts.map +1 -0
- package/dist/api/code-sessions.api-client.types.js +77 -0
- package/dist/api/code-sessions.api-client.types.js.map +1 -0
- package/dist/api/index.d.ts +13 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +20 -0
- package/dist/api/index.js.map +1 -0
- package/dist/capability.d.ts +9 -0
- package/dist/capability.d.ts.map +1 -0
- package/dist/capability.js +9 -0
- package/dist/capability.js.map +1 -0
- package/dist/catalog/index.d.ts +2 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +2 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/session-catalog.d.ts +131 -0
- package/dist/catalog/session-catalog.d.ts.map +1 -0
- package/dist/catalog/session-catalog.impl.consumer.worker.d.ts +113 -0
- package/dist/catalog/session-catalog.impl.consumer.worker.d.ts.map +1 -0
- package/dist/catalog/session-catalog.impl.consumer.worker.js +32 -0
- package/dist/catalog/session-catalog.impl.consumer.worker.js.map +1 -0
- package/dist/catalog/session-catalog.js +126 -0
- package/dist/catalog/session-catalog.js.map +1 -0
- package/dist/clock/clock.client.d.ts +18 -0
- package/dist/clock/clock.client.d.ts.map +1 -0
- package/dist/clock/clock.client.js +43 -0
- package/dist/clock/clock.client.js.map +1 -0
- package/dist/code-sessions.consumer.plugin.d.ts +4 -0
- package/dist/code-sessions.consumer.plugin.d.ts.map +1 -0
- package/dist/code-sessions.consumer.plugin.js +16 -0
- package/dist/code-sessions.consumer.plugin.js.map +1 -0
- package/dist/code-sessions.plugin.d.ts +15 -0
- package/dist/code-sessions.plugin.d.ts.map +1 -0
- package/dist/code-sessions.plugin.js +65 -0
- package/dist/code-sessions.plugin.js.map +1 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +9 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/preparation.d.ts +2 -0
- package/dist/config/preparation.d.ts.map +1 -0
- package/dist/config/preparation.js +2 -0
- package/dist/config/preparation.js.map +1 -0
- package/dist/docs/code-sessions.docs.descriptor.d.ts +4 -0
- package/dist/docs/code-sessions.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/code-sessions.docs.descriptor.js +241 -0
- package/dist/docs/code-sessions.docs.descriptor.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/pull-request-plan.d.ts +68 -0
- package/dist/pull-request-plan.d.ts.map +1 -0
- package/dist/pull-request-plan.js +94 -0
- package/dist/pull-request-plan.js.map +1 -0
- package/dist/schemas/preparation.d.ts +51 -0
- package/dist/schemas/preparation.d.ts.map +1 -0
- package/dist/schemas/preparation.js +20 -0
- package/dist/schemas/preparation.js.map +1 -0
- package/dist/schemas/requests.d.ts +411 -0
- package/dist/schemas/requests.d.ts.map +1 -0
- package/dist/schemas/requests.js +87 -0
- package/dist/schemas/requests.js.map +1 -0
- package/dist/schemas/responses.d.ts +275 -0
- package/dist/schemas/responses.d.ts.map +1 -0
- package/dist/schemas/responses.js +90 -0
- package/dist/schemas/responses.js.map +1 -0
- package/dist/svelte/actions.d.ts +70 -0
- package/dist/svelte/actions.d.ts.map +1 -0
- package/dist/svelte/actions.js +280 -0
- package/dist/svelte/clock.svelte.d.ts +6 -0
- package/dist/svelte/clock.svelte.d.ts.map +1 -0
- package/dist/svelte/clock.svelte.js +33 -0
- package/dist/svelte/components/CreateSessionDialog.svelte +470 -0
- package/dist/svelte/components/CreateSessionDialog.svelte.d.ts +57 -0
- package/dist/svelte/components/CreateSessionDialog.svelte.d.ts.map +1 -0
- package/dist/svelte/components/SessionCard.svelte +216 -0
- package/dist/svelte/components/SessionCard.svelte.d.ts +27 -0
- package/dist/svelte/components/SessionCard.svelte.d.ts.map +1 -0
- package/dist/svelte/components/SessionList.svelte +86 -0
- package/dist/svelte/components/SessionList.svelte.d.ts +23 -0
- package/dist/svelte/components/SessionList.svelte.d.ts.map +1 -0
- package/dist/svelte/components/SessionSeed.svelte +60 -0
- package/dist/svelte/components/SessionSeed.svelte.d.ts +9 -0
- package/dist/svelte/components/SessionSeed.svelte.d.ts.map +1 -0
- package/dist/svelte/components/TranscriptView.svelte +360 -0
- package/dist/svelte/components/TranscriptView.svelte.d.ts +26 -0
- package/dist/svelte/components/TranscriptView.svelte.d.ts.map +1 -0
- package/dist/svelte/create-session-form.d.ts +84 -0
- package/dist/svelte/create-session-form.d.ts.map +1 -0
- package/dist/svelte/create-session-form.js +107 -0
- package/dist/svelte/index.d.ts +20 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +18 -0
- package/dist/svelte/live-session.d.ts +156 -0
- package/dist/svelte/live-session.d.ts.map +1 -0
- package/dist/svelte/live-session.js +152 -0
- package/dist/svelte/loaders.d.ts +74 -0
- package/dist/svelte/loaders.d.ts.map +1 -0
- package/dist/svelte/loaders.js +124 -0
- package/dist/svelte/outcome.d.ts +46 -0
- package/dist/svelte/outcome.d.ts.map +1 -0
- package/dist/svelte/outcome.js +49 -0
- package/dist/svelte/relative-time.d.ts +32 -0
- package/dist/svelte/relative-time.d.ts.map +1 -0
- package/dist/svelte/relative-time.js +51 -0
- package/dist/svelte/session-list-item.d.ts +23 -0
- package/dist/svelte/session-list-item.d.ts.map +1 -0
- package/dist/svelte/session-list-item.js +1 -0
- package/dist/svelte/styles.css +8 -0
- package/dist/svelte/transcript-input.d.ts +45 -0
- package/dist/svelte/transcript-input.d.ts.map +1 -0
- package/dist/svelte/transcript-input.js +188 -0
- package/dist/tui/code-sessions-tui.plugin.d.ts +10 -0
- package/dist/tui/code-sessions-tui.plugin.d.ts.map +1 -0
- package/dist/tui/code-sessions-tui.plugin.js +29 -0
- package/dist/tui/code-sessions-tui.plugin.js.map +1 -0
- package/dist/tui/code-sessions.tui-app.descriptor.d.ts +7 -0
- package/dist/tui/code-sessions.tui-app.descriptor.d.ts.map +1 -0
- package/dist/tui/code-sessions.tui-app.descriptor.js +30 -0
- package/dist/tui/code-sessions.tui-app.descriptor.js.map +1 -0
- package/dist/tui/code-sessions.tui-app.impl.consumer.d.ts +14 -0
- package/dist/tui/code-sessions.tui-app.impl.consumer.d.ts.map +1 -0
- package/dist/tui/code-sessions.tui-app.impl.consumer.js +453 -0
- package/dist/tui/code-sessions.tui-app.impl.consumer.js.map +1 -0
- package/dist/tui/code-sessions.tui-client.d.ts +22 -0
- package/dist/tui/code-sessions.tui-client.d.ts.map +1 -0
- package/dist/tui/code-sessions.tui-client.js +95 -0
- package/dist/tui/code-sessions.tui-client.js.map +1 -0
- package/dist/tui/code-sessions.tui-open.descriptor.d.ts +7 -0
- package/dist/tui/code-sessions.tui-open.descriptor.d.ts.map +1 -0
- package/dist/tui/code-sessions.tui-open.descriptor.js +16 -0
- package/dist/tui/code-sessions.tui-open.descriptor.js.map +1 -0
- package/dist/tui/code-sessions.tui-open.impl.consumer.d.ts +7 -0
- package/dist/tui/code-sessions.tui-open.impl.consumer.d.ts.map +1 -0
- package/dist/tui/code-sessions.tui-open.impl.consumer.js +11 -0
- package/dist/tui/code-sessions.tui-open.impl.consumer.js.map +1 -0
- package/dist/tui/code-sessions.tui-state.descriptor.d.ts +16 -0
- package/dist/tui/code-sessions.tui-state.descriptor.d.ts.map +1 -0
- package/dist/tui/code-sessions.tui-state.descriptor.js +50 -0
- package/dist/tui/code-sessions.tui-state.descriptor.js.map +1 -0
- package/dist/tui/code-sessions.tui-state.impl.consumer.d.ts +30 -0
- package/dist/tui/code-sessions.tui-state.impl.consumer.d.ts.map +1 -0
- package/dist/tui/code-sessions.tui-state.impl.consumer.js +533 -0
- package/dist/tui/code-sessions.tui-state.impl.consumer.js.map +1 -0
- package/dist/tui/code-sessions.tui-state.key.d.ts +322 -0
- package/dist/tui/code-sessions.tui-state.key.d.ts.map +1 -0
- package/dist/tui/code-sessions.tui-state.key.js +104 -0
- package/dist/tui/code-sessions.tui-state.key.js.map +1 -0
- package/dist/tui/index.d.ts +9 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +8 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/workspace/index.d.ts +2 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +2 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/workspace-binding.d.ts +74 -0
- package/dist/workspace/workspace-binding.d.ts.map +1 -0
- package/dist/workspace/workspace-binding.impl.consumer.worker.d.ts +17 -0
- package/dist/workspace/workspace-binding.impl.consumer.worker.d.ts.map +1 -0
- package/dist/workspace/workspace-binding.impl.consumer.worker.js +134 -0
- package/dist/workspace/workspace-binding.impl.consumer.worker.js.map +1 -0
- package/dist/workspace/workspace-binding.js +72 -0
- package/dist/workspace/workspace-binding.js.map +1 -0
- package/package.json +238 -4
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compact relative-age formatting for code-session surfaces.
|
|
3
|
+
*
|
|
4
|
+
* Pure on purpose: `nowMs` is a parameter, never `Date.now()` read inside. The
|
|
5
|
+
* previous inline `formatAge` read the clock during render, so the label froze
|
|
6
|
+
* at first paint — a list tab left open reported "just now" for hours. Taking
|
|
7
|
+
* the clock as an argument makes the function testable AND lets the caller
|
|
8
|
+
* drive it from a ticking source (`sharedNow()`).
|
|
9
|
+
*
|
|
10
|
+
* `@vibesdotdev/kit`'s `formatRelativeTime` is deliberately NOT reused here: it
|
|
11
|
+
* renders the verbose form ("2 minutes ago") where these dense session rows
|
|
12
|
+
* need the compact form ("2m"), and it reads the clock internally, so it
|
|
13
|
+
* carries the same freeze.
|
|
14
|
+
*/
|
|
15
|
+
const MINUTE_MS = 60_000;
|
|
16
|
+
const HOUR_MS = 3_600_000;
|
|
17
|
+
const DAY_MS = 86_400_000;
|
|
18
|
+
/**
|
|
19
|
+
* Compact age label, e.g. `just now`, `12m ago`, `3h ago`, `5d ago`.
|
|
20
|
+
*
|
|
21
|
+
* An unparseable or future timestamp degrades to `just now` rather than
|
|
22
|
+
* rendering `NaNm ago` — a wrong-but-plausible label beats visible breakage in
|
|
23
|
+
* a metadata line, and the adjacent `<time datetime>` still carries the truth.
|
|
24
|
+
*/
|
|
25
|
+
export function formatRelativeAge(iso, nowMs = Date.now()) {
|
|
26
|
+
const then = new Date(iso).getTime();
|
|
27
|
+
if (Number.isNaN(then))
|
|
28
|
+
return 'just now';
|
|
29
|
+
const ageMs = nowMs - then;
|
|
30
|
+
if (ageMs < MINUTE_MS)
|
|
31
|
+
return 'just now';
|
|
32
|
+
if (ageMs < HOUR_MS)
|
|
33
|
+
return `${Math.floor(ageMs / MINUTE_MS)}m ago`;
|
|
34
|
+
if (ageMs < DAY_MS)
|
|
35
|
+
return `${Math.floor(ageMs / HOUR_MS)}h ago`;
|
|
36
|
+
return `${Math.floor(ageMs / DAY_MS)}d ago`;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Absolute, locale-formatted timestamp for the `title` attribute that sits
|
|
40
|
+
* beside every relative label. The relative form is the scannable one; this is
|
|
41
|
+
* the one a user checks when the relative form is not precise enough.
|
|
42
|
+
*
|
|
43
|
+
* Returns `null` for an unparseable timestamp so callers can omit the attribute
|
|
44
|
+
* entirely instead of rendering the string "Invalid Date" as a tooltip.
|
|
45
|
+
*/
|
|
46
|
+
export function formatAbsoluteTime(iso) {
|
|
47
|
+
const date = new Date(iso);
|
|
48
|
+
if (Number.isNaN(date.getTime()))
|
|
49
|
+
return null;
|
|
50
|
+
return date.toLocaleString();
|
|
51
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer-safe facts needed by the shared session list.
|
|
3
|
+
*
|
|
4
|
+
* Both the canonical trusted-web record and the narrower consumer catalog
|
|
5
|
+
* projection satisfy this presentation contract. The component does not need
|
|
6
|
+
* either owner's transport-only fields.
|
|
7
|
+
*/
|
|
8
|
+
import type { SessionHostTarget } from '@vibesdotdev/agent-execution/code-session';
|
|
9
|
+
export interface SessionListItem {
|
|
10
|
+
sessionId: string;
|
|
11
|
+
repositoryName: string | null;
|
|
12
|
+
ephemeral?: boolean;
|
|
13
|
+
hostTarget: SessionHostTarget;
|
|
14
|
+
status: 'initializing' | 'active' | 'error' | 'ended';
|
|
15
|
+
statusReason?: string;
|
|
16
|
+
previewUrl: string | null;
|
|
17
|
+
checkoutRef: string | null;
|
|
18
|
+
createdAt: string;
|
|
19
|
+
lastActivityAt: string;
|
|
20
|
+
capability: 'interactive' | 'transcript';
|
|
21
|
+
execution?: 'local' | 'platform';
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=session-list-item.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-list-item.d.ts","sourceRoot":"","sources":["../../src/svelte/session-list-item.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAEnF,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,MAAM,EAAE,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,aAAa,GAAG,YAAY,CAAC;IACzC,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CACjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Tailwind v4 source declaration for consumers — mirrors @vibesdotdev/kit's
|
|
3
|
+
* styles.css pattern. Apps that @import this file get this package's
|
|
4
|
+
* components scanned by their Tailwind build, so utility classes used only
|
|
5
|
+
* inside these components are emitted in the app's CSS bundle (Tailwind
|
|
6
|
+
* never scans node_modules). Paths resolve relative to this file.
|
|
7
|
+
*/
|
|
8
|
+
@source "./";
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure input logic for the transcript command line — tokenizing and history
|
|
3
|
+
* navigation. Kept out of the component so both are testable without a DOM.
|
|
4
|
+
*
|
|
5
|
+
* Both behaviours were missing from the surface entirely: the old inline
|
|
6
|
+
* tokenizer was a single regex that mis-split adjacent quoted segments, and
|
|
7
|
+
* there was no history at all — pressing ↑ in a terminal-shaped input did
|
|
8
|
+
* nothing, which reads as broken to anyone who has used a shell.
|
|
9
|
+
*/
|
|
10
|
+
export declare function tokenizeCommand(raw: string): string[];
|
|
11
|
+
/**
|
|
12
|
+
* Whether the line contains shell syntax that snapshot execution will NOT
|
|
13
|
+
* interpret. Callers warn instead of running it as literal argv, which is what
|
|
14
|
+
* made `ls | grep x` look silently broken.
|
|
15
|
+
*
|
|
16
|
+
* Only checks OUTSIDE quotes: `echo "a | b"` is a legitimate single argument.
|
|
17
|
+
*/
|
|
18
|
+
export declare function isShellSyntax(raw: string): boolean;
|
|
19
|
+
/** Cursor value meaning "not navigating — the input holds the user's own draft". */
|
|
20
|
+
export declare const HISTORY_DRAFT = -1;
|
|
21
|
+
export type HistoryDirection = 'older' | 'newer';
|
|
22
|
+
export interface HistoryNavigation {
|
|
23
|
+
/** New cursor. `HISTORY_DRAFT` when back at the user's own text. */
|
|
24
|
+
cursor: number;
|
|
25
|
+
/** Text the input should now show. */
|
|
26
|
+
value: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Move through command history like a shell prompt does.
|
|
30
|
+
*
|
|
31
|
+
* `history` is newest-last (submission order). `cursor` counts back from the
|
|
32
|
+
* newest entry: `HISTORY_DRAFT` = the live draft, `0` = most recent command,
|
|
33
|
+
* `history.length - 1` = oldest. Walking past either end is a no-op rather
|
|
34
|
+
* than a wrap, matching shell behaviour — wrapping loses your place.
|
|
35
|
+
*/
|
|
36
|
+
export declare function navigateHistory(history: readonly string[], cursor: number, direction: HistoryDirection, draft: string): HistoryNavigation;
|
|
37
|
+
/**
|
|
38
|
+
* Command history derived from the transcript, newest last.
|
|
39
|
+
*
|
|
40
|
+
* Consecutive duplicates collapse — re-running the same command three times
|
|
41
|
+
* should cost one ↑, not three. Non-consecutive repeats are kept, because the
|
|
42
|
+
* commands between them are what make the repeat meaningful.
|
|
43
|
+
*/
|
|
44
|
+
export declare function historyFromCommands(commands: readonly string[]): string[];
|
|
45
|
+
//# sourceMappingURL=transcript-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-input.d.ts","sourceRoot":"","sources":["../../src/svelte/transcript-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoBH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CA+DrD;AA2BD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAoBlD;AAED,oFAAoF;AACpF,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,iBAAiB;IACjC,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC9B,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,MAAM,GACX,iBAAiB,CAoBnB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CASzE"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure input logic for the transcript command line — tokenizing and history
|
|
3
|
+
* navigation. Kept out of the component so both are testable without a DOM.
|
|
4
|
+
*
|
|
5
|
+
* Both behaviours were missing from the surface entirely: the old inline
|
|
6
|
+
* tokenizer was a single regex that mis-split adjacent quoted segments, and
|
|
7
|
+
* there was no history at all — pressing ↑ in a terminal-shaped input did
|
|
8
|
+
* nothing, which reads as broken to anyone who has used a shell.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Split a command line into argv, honouring single quotes, double quotes and
|
|
12
|
+
* backslash escapes.
|
|
13
|
+
*
|
|
14
|
+
* The regex this replaces (`/(?:[^\s"']+|"[^"]*"|'[^']*')+/g` plus a
|
|
15
|
+
* strip-outer-quotes pass) got the common cases right and adjacent segments
|
|
16
|
+
* wrong: `echo a"b c"d` produced `['echo', 'ab c"d']` because stripping only
|
|
17
|
+
* leading/trailing quotes cannot handle a quote in the middle of a token.
|
|
18
|
+
*
|
|
19
|
+
* Scope is deliberate. This is snapshot execution — one argv array handed to
|
|
20
|
+
* the sandbox, never a shell — so pipes, redirection, chaining, globbing and
|
|
21
|
+
* variable expansion are NOT interpreted. `isShellSyntax` exists so the caller
|
|
22
|
+
* can SAY so, instead of silently passing `|` or `*` through as a literal
|
|
23
|
+
* argument and letting the failure look like a bug.
|
|
24
|
+
*/
|
|
25
|
+
/** Characters a backslash may escape inside double quotes, per POSIX. */
|
|
26
|
+
const DOUBLE_QUOTE_ESCAPABLE = new Set(['$', '`', '"', '\\', '\n']);
|
|
27
|
+
export function tokenizeCommand(raw) {
|
|
28
|
+
const tokens = [];
|
|
29
|
+
let current = '';
|
|
30
|
+
let hasCurrent = false;
|
|
31
|
+
let quote = null;
|
|
32
|
+
for (let i = 0; i < raw.length; i += 1) {
|
|
33
|
+
const char = raw[i];
|
|
34
|
+
// Backslash rules follow POSIX, which is NOT "escapes everything except
|
|
35
|
+
// in single quotes":
|
|
36
|
+
// - unquoted → escapes the next character (`path\ with\ spaces`)
|
|
37
|
+
// - single quotes → fully literal, backslash included
|
|
38
|
+
// - double quotes → literal UNLESS the next char is one of $ ` " \
|
|
39
|
+
//
|
|
40
|
+
// The last case matters concretely: treating backslash as a universal
|
|
41
|
+
// escape inside double quotes silently DELETED characters from Windows
|
|
42
|
+
// paths and regexes — `"C:\Users\me"` became `C:Usersme`.
|
|
43
|
+
if (char === '\\' && quote !== "'" && i + 1 < raw.length) {
|
|
44
|
+
const next = raw[i + 1];
|
|
45
|
+
if (quote === '"' && !DOUBLE_QUOTE_ESCAPABLE.has(next)) {
|
|
46
|
+
current += char;
|
|
47
|
+
hasCurrent = true;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
current += next;
|
|
51
|
+
hasCurrent = true;
|
|
52
|
+
i += 1;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (quote) {
|
|
56
|
+
if (char === quote) {
|
|
57
|
+
quote = null;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
current += char;
|
|
61
|
+
}
|
|
62
|
+
hasCurrent = true;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (char === '"' || char === "'") {
|
|
66
|
+
quote = char;
|
|
67
|
+
// An empty quoted string is still a token: `foo ""` is two arguments.
|
|
68
|
+
hasCurrent = true;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (/\s/.test(char)) {
|
|
72
|
+
if (hasCurrent) {
|
|
73
|
+
tokens.push(current);
|
|
74
|
+
current = '';
|
|
75
|
+
hasCurrent = false;
|
|
76
|
+
}
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
current += char;
|
|
80
|
+
hasCurrent = true;
|
|
81
|
+
}
|
|
82
|
+
if (hasCurrent)
|
|
83
|
+
tokens.push(current);
|
|
84
|
+
return tokens;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Shell syntax this surface cannot honour, because it runs argv, not a shell.
|
|
88
|
+
*
|
|
89
|
+
* Covers control operators AND expansion. Globbing was the costly omission:
|
|
90
|
+
* `ls *.ts` is close to the most likely thing anyone types into a
|
|
91
|
+
* terminal-shaped box, and without `*` here it ran as a literal argument and
|
|
92
|
+
* returned "No such file or directory" with no explanation — the same silent
|
|
93
|
+
* confusion the pipe case was added to prevent.
|
|
94
|
+
*/
|
|
95
|
+
const SHELL_METACHARACTERS = [
|
|
96
|
+
'&&',
|
|
97
|
+
'||',
|
|
98
|
+
'|',
|
|
99
|
+
'>',
|
|
100
|
+
'<',
|
|
101
|
+
';',
|
|
102
|
+
'$(',
|
|
103
|
+
'`',
|
|
104
|
+
'$',
|
|
105
|
+
'*',
|
|
106
|
+
'?',
|
|
107
|
+
'&',
|
|
108
|
+
'~'
|
|
109
|
+
];
|
|
110
|
+
/**
|
|
111
|
+
* Whether the line contains shell syntax that snapshot execution will NOT
|
|
112
|
+
* interpret. Callers warn instead of running it as literal argv, which is what
|
|
113
|
+
* made `ls | grep x` look silently broken.
|
|
114
|
+
*
|
|
115
|
+
* Only checks OUTSIDE quotes: `echo "a | b"` is a legitimate single argument.
|
|
116
|
+
*/
|
|
117
|
+
export function isShellSyntax(raw) {
|
|
118
|
+
let quote = null;
|
|
119
|
+
for (let i = 0; i < raw.length; i += 1) {
|
|
120
|
+
const char = raw[i];
|
|
121
|
+
if (char === '\\' && quote !== "'") {
|
|
122
|
+
i += 1;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (quote) {
|
|
126
|
+
if (char === quote)
|
|
127
|
+
quote = null;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (char === '"' || char === "'") {
|
|
131
|
+
quote = char;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const rest = raw.slice(i);
|
|
135
|
+
if (SHELL_METACHARACTERS.some((meta) => rest.startsWith(meta)))
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
/** Cursor value meaning "not navigating — the input holds the user's own draft". */
|
|
141
|
+
export const HISTORY_DRAFT = -1;
|
|
142
|
+
/**
|
|
143
|
+
* Move through command history like a shell prompt does.
|
|
144
|
+
*
|
|
145
|
+
* `history` is newest-last (submission order). `cursor` counts back from the
|
|
146
|
+
* newest entry: `HISTORY_DRAFT` = the live draft, `0` = most recent command,
|
|
147
|
+
* `history.length - 1` = oldest. Walking past either end is a no-op rather
|
|
148
|
+
* than a wrap, matching shell behaviour — wrapping loses your place.
|
|
149
|
+
*/
|
|
150
|
+
export function navigateHistory(history, cursor, direction, draft) {
|
|
151
|
+
if (history.length === 0)
|
|
152
|
+
return { cursor: HISTORY_DRAFT, value: draft };
|
|
153
|
+
// Clamp an out-of-range cursor before doing anything with it. A cursor
|
|
154
|
+
// survives across renders while `history` is derived from `entries`, so a
|
|
155
|
+
// consumer that clears the transcript or switches session with the component
|
|
156
|
+
// mounted leaves the cursor pointing past the end. Indexing that returned
|
|
157
|
+
// `undefined` through a non-null assertion, which put `undefined` into the
|
|
158
|
+
// input and crashed the next render on `commandInput.trim()`.
|
|
159
|
+
const maxCursor = history.length - 1;
|
|
160
|
+
const from = Math.min(Math.max(cursor, HISTORY_DRAFT), maxCursor);
|
|
161
|
+
if (direction === 'older') {
|
|
162
|
+
const next = Math.min(from + 1, maxCursor);
|
|
163
|
+
return { cursor: next, value: history[maxCursor - next] };
|
|
164
|
+
}
|
|
165
|
+
const next = from - 1;
|
|
166
|
+
if (next <= HISTORY_DRAFT)
|
|
167
|
+
return { cursor: HISTORY_DRAFT, value: draft };
|
|
168
|
+
return { cursor: next, value: history[maxCursor - next] };
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Command history derived from the transcript, newest last.
|
|
172
|
+
*
|
|
173
|
+
* Consecutive duplicates collapse — re-running the same command three times
|
|
174
|
+
* should cost one ↑, not three. Non-consecutive repeats are kept, because the
|
|
175
|
+
* commands between them are what make the repeat meaningful.
|
|
176
|
+
*/
|
|
177
|
+
export function historyFromCommands(commands) {
|
|
178
|
+
const out = [];
|
|
179
|
+
for (const command of commands) {
|
|
180
|
+
const trimmed = command.trim();
|
|
181
|
+
if (!trimmed)
|
|
182
|
+
continue;
|
|
183
|
+
if (out[out.length - 1] === trimmed)
|
|
184
|
+
continue;
|
|
185
|
+
out.push(trimmed);
|
|
186
|
+
}
|
|
187
|
+
return out;
|
|
188
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Sessions TUI Plugin
|
|
3
|
+
*
|
|
4
|
+
* Registers the descriptor-owned `/code-sessions` Studio route. Data flows
|
|
5
|
+
* through `@vibesdotdev/code-sessions`' canonical runtime/client; this package
|
|
6
|
+
* owns only the TUI projection.
|
|
7
|
+
*/
|
|
8
|
+
export declare const codeSessionsTuiPlugin: import("@vibesdotdev/kernel").RuntimePlugin;
|
|
9
|
+
export default codeSessionsTuiPlugin;
|
|
10
|
+
//# sourceMappingURL=code-sessions-tui.plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-sessions-tui.plugin.d.ts","sourceRoot":"","sources":["../../src/tui/code-sessions-tui.plugin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,eAAO,MAAM,qBAAqB,6CAkBhC,CAAC;AAEH,eAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Sessions TUI Plugin
|
|
3
|
+
*
|
|
4
|
+
* Registers the descriptor-owned `/code-sessions` Studio route. Data flows
|
|
5
|
+
* through `@vibesdotdev/code-sessions`' canonical runtime/client; this package
|
|
6
|
+
* owns only the TUI projection.
|
|
7
|
+
*/
|
|
8
|
+
import { createRuntimePlugin, loader } from '@vibesdotdev/kernel';
|
|
9
|
+
import codeSessionsAppDescriptor from "./code-sessions.tui-app.descriptor.js";
|
|
10
|
+
import codeSessionsOpenDescriptor from "./code-sessions.tui-open.descriptor.js";
|
|
11
|
+
import { codeSessionsStateDescriptor } from "./code-sessions.tui-state.descriptor.js";
|
|
12
|
+
const TUI_APP = { kind: 'tui/app' };
|
|
13
|
+
const TUI_COMMAND = { kind: 'tui/command' };
|
|
14
|
+
const TUI_STATE = { kind: 'tui/state' };
|
|
15
|
+
export const codeSessionsTuiPlugin = createRuntimePlugin({
|
|
16
|
+
id: 'code-sessions.tui',
|
|
17
|
+
name: 'Code Sessions TUI Surface',
|
|
18
|
+
description: 'Inspect platform code sessions, host capability, workspace, and preview state.',
|
|
19
|
+
dependencies: ['tui', 'code-sessions-api-client'],
|
|
20
|
+
descriptors: [{ id: 'code-sessions.tui', kind: 'runtime/client', name: 'Code Sessions TUI Actions' }, codeSessionsAppDescriptor, codeSessionsStateDescriptor, codeSessionsOpenDescriptor],
|
|
21
|
+
loaders: [
|
|
22
|
+
loader('code-sessions.tui', { kind: 'runtime/client' }, async () => ({ default: (await import("./code-sessions.tui-state.impl.consumer.js")).CodeSessionsTuiClient })),
|
|
23
|
+
loader('code-sessions.monitor', TUI_APP, () => import("./code-sessions.tui-app.impl.consumer.js")),
|
|
24
|
+
loader('code-sessions.sessions', TUI_STATE, () => import("./code-sessions.tui-state.impl.consumer.js")),
|
|
25
|
+
loader('code-sessions.open', TUI_COMMAND, () => import("./code-sessions.tui-open.impl.consumer.js"))
|
|
26
|
+
]
|
|
27
|
+
});
|
|
28
|
+
export default codeSessionsTuiPlugin;
|
|
29
|
+
//# sourceMappingURL=code-sessions-tui.plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-sessions-tui.plugin.js","sourceRoot":"","sources":["../../src/tui/code-sessions-tui.plugin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,yBAAyB,MAAM,uCAAuC,CAAC;AAC9E,OAAO,0BAA0B,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,2BAA2B,EAAE,MAAM,yCAAyC,CAAC;AAEtF,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,SAAS,EAAW,CAAC;AAC7C,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,aAAa,EAAW,CAAC;AACrD,MAAM,SAAS,GAAG,EAAE,IAAI,EAAE,WAAW,EAAW,CAAC;AAEjD,MAAM,CAAC,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;IACxD,EAAE,EAAE,mBAAmB;IACvB,IAAI,EAAE,2BAA2B;IACjC,WAAW,EAAE,gFAAgF;IAC7F,YAAY,EAAE,CAAC,KAAK,EAAE,0BAA0B,CAAC;IACjD,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,2BAA2B,EAAE,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,0BAA0B,CAAC;IACzL,OAAO,EAAE;QACR,MAAM,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,4CAA4C,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACtK,MAAM,CAAC,uBAAuB,EAAE,OAAO,EAAE,GAAG,EAAE,CAC7C,MAAM,CAAC,0CAA2C,CAAC,CACnD;QACD,MAAM,CAAC,wBAAwB,EAAE,SAAS,EAAE,GAAG,EAAE,CAChD,MAAM,CAAC,4CAA4C,CAAC,CACpD;QACD,MAAM,CAAC,oBAAoB,EAAE,WAAW,EAAE,GAAG,EAAE,CAC9C,MAAM,CAAC,2CAA2C,CAAC,CACnD;KACD;CACD,CAAC,CAAC;AAEH,eAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Sessions Monitor - tui/app descriptor.
|
|
3
|
+
*/
|
|
4
|
+
import type { TuiAppDescriptor } from '@vibesdotdev/tui/schemas/tui-app';
|
|
5
|
+
declare const descriptor: TuiAppDescriptor;
|
|
6
|
+
export default descriptor;
|
|
7
|
+
//# sourceMappingURL=code-sessions.tui-app.descriptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-sessions.tui-app.descriptor.d.ts","sourceRoot":"","sources":["../../src/tui/code-sessions.tui-app.descriptor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,QAAA,MAAM,UAAU,EAAE,gBAwBjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Sessions Monitor - tui/app descriptor.
|
|
3
|
+
*/
|
|
4
|
+
const descriptor = {
|
|
5
|
+
kind: 'tui/app',
|
|
6
|
+
id: 'code-sessions.monitor',
|
|
7
|
+
title: 'Code Sessions',
|
|
8
|
+
description: 'Work on this machine and directory by default, or pick another host and repository.',
|
|
9
|
+
icon: '⌗',
|
|
10
|
+
category: 'Work',
|
|
11
|
+
// Primary consumer surface: with the create flow this is part of the
|
|
12
|
+
// agentic-coding path, not a dev-only inspector (lane audit enforces it).
|
|
13
|
+
audience: 'primary',
|
|
14
|
+
order: 6,
|
|
15
|
+
route: '/code-sessions',
|
|
16
|
+
states: ['code-sessions.sessions'],
|
|
17
|
+
embeddable: true,
|
|
18
|
+
minSize: { width: 90, height: 24 },
|
|
19
|
+
workSurface: {
|
|
20
|
+
slots: ['terminal', 'transcript', 'preview', 'status'],
|
|
21
|
+
linkKinds: ['code-session'],
|
|
22
|
+
capabilitiesRequired: ['code-sessions.sessions'],
|
|
23
|
+
defaultPlacement: 'secondary'
|
|
24
|
+
},
|
|
25
|
+
surfaces: ['tui'],
|
|
26
|
+
hardware: ['consumer'],
|
|
27
|
+
enabled: true
|
|
28
|
+
};
|
|
29
|
+
export default descriptor;
|
|
30
|
+
//# sourceMappingURL=code-sessions.tui-app.descriptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-sessions.tui-app.descriptor.js","sourceRoot":"","sources":["../../src/tui/code-sessions.tui-app.descriptor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,GAAqB;IACpC,IAAI,EAAE,SAAS;IACf,EAAE,EAAE,uBAAuB;IAC3B,KAAK,EAAE,eAAe;IACtB,WAAW,EAAE,qFAAqF;IAClG,IAAI,EAAE,GAAG;IACT,QAAQ,EAAE,MAAM;IAChB,qEAAqE;IACrE,0EAA0E;IAC1E,QAAQ,EAAE,SAAS;IACnB,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,gBAAgB;IACvB,MAAM,EAAE,CAAC,wBAAwB,CAAC;IAClC,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IAClC,WAAW,EAAE;QACZ,KAAK,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC;QACtD,SAAS,EAAE,CAAC,cAAc,CAAC;QAC3B,oBAAoB,EAAE,CAAC,wBAAwB,CAAC;QAChD,gBAAgB,EAAE,WAAW;KAC7B;IACD,QAAQ,EAAE,CAAC,KAAK,CAAC;IACjB,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,OAAO,EAAE,IAAI;CACb,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Sessions route - tui/app implementation.
|
|
3
|
+
*
|
|
4
|
+
* Thin projection over `code-sessions.sessions`; the state implementation owns
|
|
5
|
+
* runtime-client resolution and transport errors. Spec:
|
|
6
|
+
* docs/architecture/tui-page-specs/code-sessions.md — list · create · inspect,
|
|
7
|
+
* actions appear with a selection, facts/hints ride the screen-status
|
|
8
|
+
* contract (never a free-printed footer), and the signed-out state is one
|
|
9
|
+
* sentence with a real Sign in action.
|
|
10
|
+
*/
|
|
11
|
+
import type { TuiAppImplementation } from '@vibesdotdev/tui/kinds/tui-app';
|
|
12
|
+
declare const impl: TuiAppImplementation;
|
|
13
|
+
export default impl;
|
|
14
|
+
//# sourceMappingURL=code-sessions.tui-app.impl.consumer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-sessions.tui-app.impl.consumer.d.ts","sourceRoot":"","sources":["../../src/tui/code-sessions.tui-app.impl.consumer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,OAAO,KAAK,EACX,oBAAoB,EAGpB,MAAM,gCAAgC,CAAC;AA42BxC,QAAA,MAAM,IAAI,EAAE,oBAAqD,CAAC;AAClE,eAAe,IAAI,CAAC"}
|