@mlpal/yodex-ui 0.0.0-stage → 0.2.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 +41 -2
- package/dist/client/client.d.ts +119 -0
- package/dist/client/reducer.d.ts +16 -0
- package/dist/client/types.d.ts +137 -0
- package/dist/client/useYodexSession.d.ts +35 -0
- package/dist/components/AssistantMessage.d.ts +9 -0
- package/dist/components/Composer.d.ts +37 -0
- package/dist/components/DiffView.d.ts +9 -0
- package/dist/components/PermissionPrompt.d.ts +9 -0
- package/dist/components/PlanChecklist.d.ts +6 -0
- package/dist/components/QuestionForm.d.ts +19 -0
- package/dist/components/RunStatus.d.ts +17 -0
- package/dist/components/SessionList.d.ts +15 -0
- package/dist/components/ToolCall.d.ts +13 -0
- package/dist/components/Transcript.d.ts +12 -0
- package/dist/components/cn.d.ts +2 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +1598 -0
- package/dist/index.js.map +23 -0
- package/dist/styles.css +2 -0
- package/dist/theme.css +60 -0
- package/package.json +41 -4
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/client/client.ts", "../src/client/reducer.ts", "../src/client/useYodexSession.ts", "../src/components/Transcript.tsx", "../src/components/AssistantMessage.tsx", "../src/components/cn.ts", "../src/components/PlanChecklist.tsx", "../src/components/ToolCall.tsx", "../src/components/DiffView.tsx", "../src/components/PermissionPrompt.tsx", "../src/components/QuestionForm.tsx", "../src/components/RunStatus.tsx", "../src/components/SessionList.tsx", "../src/components/Composer.tsx"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { ClientMessage, ContentBlock, ServerMessage } from \"@mlpal/harness-protocol\";\nimport type { AskOutcome, ConnectionState, IncomingMessage } from \"./types\";\n\n/** The subset of the WebSocket API the client uses, so tests can inject a fake. */\nexport interface SocketLike {\n readyState: number;\n send(data: string): void;\n close(): void;\n onopen: ((ev: unknown) => void) | null;\n onclose: ((ev: unknown) => void) | null;\n onerror: ((ev: unknown) => void) | null;\n onmessage: ((ev: { data: unknown }) => void) | null;\n}\nexport type SocketFactory = (url: string) => SocketLike;\n\nexport interface RunOptions {\n sessionId?: string;\n model?: string;\n mode?: string;\n /** yodex/2: the HOP for this run (must be the server's own unless it claims \"hop_per_run\"),\n * the working directory under the workspace root, and attachments (\"attachments\"). */\n hop?: string;\n cwd?: string;\n blocks?: ContentBlock[];\n}\n\n/** Outgoing messages: the protocol's ClientMessage (yodex/2, additive over yodex/1). */\nexport type OutgoingMessage = ClientMessage;\n\nexport interface YodexClientOptions {\n /** ws:// or wss:// URL of `yodex serve`'s /ws endpoint. */\n url: string;\n /** Appended as ?token= when the proxy does not inject Authorization on the upgrade. */\n token?: string;\n onMessage: (m: IncomingMessage) => void;\n onState?: (s: ConnectionState) => void;\n socketFactory?: SocketFactory;\n /** Reconnect backoff bounds, ms. */\n backoffMs?: { min: number; max: number };\n requestTimeoutMs?: number;\n /** Injected for deterministic tests. */\n setTimer?: (fn: () => void, ms: number) => unknown;\n clearTimer?: (h: unknown) => void;\n random?: () => number;\n}\n\ninterface Pending {\n resolve: (m: ServerMessage) => void;\n reject: (e: Error) => void;\n timer: unknown;\n}\n\n/**\n * A yodex serve client: one socket per session view, reconnect with jittered exponential\n * backoff, and request-id correlation for the list_* / load_session round-trips. Everything\n * streamed (events, permission and question requests, done, error) goes to `onMessage`;\n * the reducer in ./reducer turns it into view state.\n */\nexport class YodexClient {\n private socket: SocketLike | null = null;\n private closedByUser = false;\n private attempt = 0;\n private reconnectHandle: unknown = null;\n private readonly pending = new Map<string, Pending>();\n private readonly opts: Required<Pick<YodexClientOptions, \"backoffMs\" | \"requestTimeoutMs\" | \"socketFactory\" | \"setTimer\" | \"clearTimer\" | \"random\">> & YodexClientOptions;\n private seq = 0;\n state: ConnectionState = \"closed\";\n\n constructor(options: YodexClientOptions) {\n this.opts = {\n backoffMs: { min: 500, max: 10_000 },\n requestTimeoutMs: 15_000,\n socketFactory: (url) => new WebSocket(url) as unknown as SocketLike,\n setTimer: (fn, ms) => setTimeout(fn, ms),\n clearTimer: (h) => clearTimeout(h as ReturnType<typeof setTimeout>),\n random: Math.random,\n ...options,\n };\n }\n\n get url(): string {\n const u = this.opts.url;\n if (!this.opts.token) return u;\n return `${u}${u.includes(\"?\") ? \"&\" : \"?\"}token=${encodeURIComponent(this.opts.token)}`;\n }\n\n connect(): void {\n this.closedByUser = false;\n this.open();\n }\n\n close(): void {\n this.closedByUser = true;\n if (this.reconnectHandle) this.opts.clearTimer(this.reconnectHandle);\n this.reconnectHandle = null;\n this.socket?.close();\n this.socket = null;\n this.failPending(new Error(\"client closed\"));\n this.setState(\"closed\");\n }\n\n private setState(s: ConnectionState): void {\n if (this.state === s) return;\n this.state = s;\n this.opts.onState?.(s);\n }\n\n private open(): void {\n this.setState(this.attempt === 0 ? \"connecting\" : \"reconnecting\");\n const ws = this.opts.socketFactory(this.url);\n this.socket = ws;\n ws.onopen = () => {\n this.attempt = 0;\n };\n ws.onmessage = (ev) => {\n let m: IncomingMessage;\n try {\n m = JSON.parse(String(ev.data)) as IncomingMessage;\n } catch {\n return;\n }\n if (m.type === \"ready\") this.setState(\"connected\");\n const rid = (m as { requestId?: string }).requestId;\n if (rid && this.pending.has(rid) && m.type !== \"done\") {\n const p = this.pending.get(rid)!;\n this.pending.delete(rid);\n this.opts.clearTimer(p.timer);\n p.resolve(m as ServerMessage);\n }\n this.opts.onMessage(m);\n };\n ws.onerror = () => {\n // onclose follows; the reconnect decision lives there.\n };\n ws.onclose = () => {\n if (this.socket !== ws) return;\n this.socket = null;\n this.failPending(new Error(\"connection lost\"));\n if (this.closedByUser) return;\n this.scheduleReconnect();\n };\n }\n\n private scheduleReconnect(): void {\n const { min, max } = this.opts.backoffMs;\n const base = Math.min(max, min * 2 ** this.attempt);\n const delay = Math.round(base * (0.5 + this.opts.random() * 0.5));\n this.attempt += 1;\n this.setState(\"reconnecting\");\n this.reconnectHandle = this.opts.setTimer(() => {\n this.reconnectHandle = null;\n if (!this.closedByUser) this.open();\n }, delay);\n }\n\n private failPending(e: Error): void {\n for (const p of this.pending.values()) {\n this.opts.clearTimer(p.timer);\n p.reject(e);\n }\n this.pending.clear();\n }\n\n get connected(): boolean {\n return this.state === \"connected\" && this.socket !== null;\n }\n\n send(m: OutgoingMessage): void {\n if (!this.socket || this.state !== \"connected\") throw new Error(\"not connected\");\n this.socket.send(JSON.stringify(m));\n }\n\n private requestId(): string {\n return `${Date.now().toString(36)}-${(++this.seq).toString(36)}`;\n }\n\n /** Send a request carrying a requestId and resolve with the server's correlated reply. */\n request<T extends ServerMessage[\"type\"]>(m: OutgoingMessage & { requestId: string }, _expect: T): Promise<Extract<ServerMessage, { type: T }>> {\n return new Promise((resolve, reject) => {\n const timer = this.opts.setTimer(() => {\n this.pending.delete(m.requestId);\n reject(new Error(`${m.type}: no reply within ${this.opts.requestTimeoutMs} ms`));\n }, this.opts.requestTimeoutMs);\n this.pending.set(m.requestId, { resolve: (r) => resolve(r as Extract<ServerMessage, { type: T }>), reject, timer });\n try {\n this.send(m);\n } catch (e) {\n this.pending.delete(m.requestId);\n this.opts.clearTimer(timer);\n reject(e as Error);\n }\n });\n }\n\n /** Start a turn. Returns the requestId the matching `done` will carry. */\n run(prompt: string, options: RunOptions = {}): string {\n const requestId = this.requestId();\n this.send({ type: \"run\", requestId, prompt, ...options });\n return requestId;\n }\n\n interrupt(): void {\n this.send({ type: \"interrupt\" });\n }\n\n sendPeer(sessionId: string, text: string): void {\n this.send({ type: \"send\", sessionId, text });\n }\n\n respondPermission(id: string, decision: \"allow\" | \"deny\", reason?: string): void {\n this.send({ type: \"permission_response\", id, decision, ...(reason ? { reason } : {}) });\n }\n\n respondQuestion(id: string, outcome: AskOutcome): void {\n this.send({ type: \"question_response\", id, outcome });\n }\n\n respondApproval(sessionId: string, decision: \"allow\" | \"deny\", reason?: string): void {\n this.send({ type: \"approval_response\", sessionId, decision, ...(reason ? { reason } : {}) });\n }\n\n listSessions() {\n return this.request({ type: \"list_sessions\", requestId: this.requestId() }, \"sessions\");\n }\n listModels() {\n return this.request({ type: \"list_models\", requestId: this.requestId() }, \"models\");\n }\n listSkills() {\n return this.request({ type: \"list_skills\", requestId: this.requestId() }, \"skills\");\n }\n loadSession(sessionId: string) {\n return this.request({ type: \"load_session\", requestId: this.requestId(), sessionId }, \"session_history\");\n }\n}\n",
|
|
6
|
+
"import type { EngineEvent, ResultEvent, Usage } from \"@mlpal/harness-protocol\";\nimport { addUsage, emptyUsage, HUMAN } from \"@mlpal/harness-protocol\";\nimport type { PlanItem, PlanStatus, SessionAction, SessionState, TranscriptItem } from \"./types\";\n\nexport function initialState(): SessionState {\n return {\n connection: \"connecting\",\n capabilities: [],\n items: [],\n running: false,\n usageTotal: emptyUsage(),\n pendingPermissions: [],\n sessions: [],\n models: [],\n skills: [],\n };\n}\n\nconst TASK_TOOLS = new Set([\"TaskCreate\", \"TaskUpdate\", \"TaskList\"]);\nlet seq = 0;\nconst nextId = (prefix: string) => `${prefix}-${++seq}`;\n\nfunction textOf(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .map((b) => (b && typeof b === \"object\" && (b as { type?: string }).type === \"text\" ? String((b as { text?: string }).text ?? \"\") : \"\"))\n .filter(Boolean)\n .join(\"\\n\");\n}\n\nfunction replaceOrAppendPlan(items: TranscriptItem[], plan: PlanItem[]): TranscriptItem[] {\n const idx = items.findIndex((i) => i.kind === \"plan\");\n const row: TranscriptItem = { kind: \"plan\", id: \"plan\", items: plan };\n if (idx === -1) return [...items, row];\n const out = items.slice();\n out[idx] = row;\n return out;\n}\n\nfunction currentPlan(items: TranscriptItem[]): PlanItem[] {\n const row = items.find((i) => i.kind === \"plan\");\n return row && row.kind === \"plan\" ? row.items : [];\n}\n\nfunction dropDraft(items: TranscriptItem[]): TranscriptItem[] {\n const last = items[items.length - 1];\n return last && last.kind === \"assistant\" && last.live ? items.slice(0, -1) : items;\n}\n\n/**\n * Apply one engine event. `live` distinguishes the running stream from a history replay:\n * a human turn on the live stream was already echoed locally by `local_user`, so it is\n * skipped there and rendered only from history.\n */\nexport function applyEvent(state: SessionState, ev: EngineEvent, live: boolean): SessionState {\n switch (ev.type) {\n case \"system\":\n return { ...state, sessionId: ev.sessionId, model: state.model ?? ev.model, cwd: ev.cwd };\n case \"user\": {\n if (live && ev.author.type === \"human\") return state;\n const text = textOf(ev.message.content);\n const blocks = Array.isArray(ev.message.content) ? ev.message.content.filter((b) => b.type !== \"text\") : undefined;\n return {\n ...state,\n items: [...dropDraft(state.items), { kind: \"user\", id: nextId(\"u\"), text, author: ev.author, ts: ev.ts, ...(blocks?.length ? { blocks } : {}) }],\n };\n }\n case \"text_delta\": {\n const items = state.items.slice();\n const last = items[items.length - 1];\n if (last && last.kind === \"assistant\" && last.live) items[items.length - 1] = { ...last, text: last.text + ev.text };\n else items.push({ kind: \"assistant\", id: nextId(\"a\"), text: ev.text, ts: new Date().toISOString(), live: true });\n return { ...state, items, activity: \"Responding\" };\n }\n case \"thinking_delta\":\n return state.activity === \"Thinking\" ? state : { ...state, activity: \"Thinking\" };\n case \"tool_use_start\":\n return { ...state, activity: ev.name };\n case \"reset\":\n return { ...state, items: dropDraft(state.items) };\n case \"assistant\": {\n let items = dropDraft(state.items);\n const text = textOf(ev.message.content);\n if (text.trim()) items = [...items, { kind: \"assistant\", id: nextId(\"a\"), text, ts: ev.ts, live: false }];\n let plan = currentPlan(items);\n let planChanged = false;\n if (Array.isArray(ev.message.content)) {\n for (const b of ev.message.content) {\n if (b.type !== \"tool_use\") continue;\n const input = (b.input ?? {}) as Record<string, unknown>;\n if (TASK_TOOLS.has(b.name)) {\n if (b.name === \"TaskCreate\") {\n plan = [...plan, { id: b.id, subject: String(input.subject ?? \"\"), ...(input.description ? { description: String(input.description) } : {}), status: (input.status as PlanStatus) ?? \"pending\" }];\n planChanged = true;\n } else if (b.name === \"TaskUpdate\") {\n const id = String(input.id ?? \"\");\n plan = plan.map((p) =>\n p.id === id\n ? { ...p, ...(input.status ? { status: input.status as PlanStatus } : {}), ...(input.subject ? { subject: String(input.subject) } : {}), ...(input.description ? { description: String(input.description) } : {}) }\n : p,\n );\n planChanged = true;\n }\n continue;\n }\n items = [...items, { kind: \"tool\", id: b.id, name: b.name, input, ts: ev.ts }];\n }\n }\n if (planChanged) items = replaceOrAppendPlan(items, plan);\n return { ...state, items, usageTotal: addUsage(state.usageTotal, ev.usage), activity: undefined };\n }\n case \"tool_result\": {\n const idx = state.items.findIndex((i) => i.kind === \"tool\" && i.id === ev.toolUseId);\n if (idx !== -1) {\n const items = state.items.slice();\n const t = items[idx] as Extract<TranscriptItem, { kind: \"tool\" }>;\n items[idx] = { ...t, result: { content: ev.content, isError: ev.isError, ...(ev.diff ? { diff: ev.diff } : {}), ...(ev.blocks ? { blocks: ev.blocks } : {}) } };\n return { ...state, items };\n }\n // A TaskCreate result names the tracker id its plan row goes by from now on.\n const m = /^#(\\d+) created:/.exec(ev.content);\n if (m && ev.toolName === \"TaskCreate\") {\n const plan = currentPlan(state.items).map((p) => (p.id === ev.toolUseId ? { ...p, id: m[1]! } : p));\n return { ...state, items: replaceOrAppendPlan(state.items, plan) };\n }\n return state;\n }\n case \"result\":\n return {\n ...state,\n running: false,\n activity: undefined,\n lastResult: ev,\n items: [...dropDraft(state.items), { kind: \"result\", id: nextId(\"r\"), result: ev }],\n };\n case \"error\":\n return { ...state, items: [...dropDraft(state.items), { kind: \"error\", id: nextId(\"e\"), message: ev.message, ts: ev.ts }] };\n case \"compact\":\n return { ...state, items: [...state.items, { kind: \"compact\", id: nextId(\"c\"), replacedMessages: ev.replacedMessages, ts: ev.ts }] };\n case \"rewind\":\n return state;\n }\n}\n\nexport function reduce(state: SessionState, action: SessionAction): SessionState {\n switch (action.type) {\n case \"connection\":\n return { ...state, connection: action.state };\n case \"clear\":\n return { ...initialState(), connection: state.connection, protocol: state.protocol, capabilities: state.capabilities, hop: state.hop, rootCwd: state.rootCwd, sessions: state.sessions, models: state.models, skills: state.skills };\n case \"error\":\n return { ...state, error: action.message };\n case \"local_user\":\n return {\n ...state,\n items: [...state.items, { kind: \"user\", id: nextId(\"u\"), text: action.text, author: HUMAN, ts: action.ts, ...(action.blocks?.length ? { blocks: action.blocks } : {}) }],\n };\n case \"run_started\":\n return { ...state, running: true, runStartedAt: action.at, activity: \"Thinking\", error: undefined, lastResult: undefined, pendingApproval: undefined, ...(action.sessionId ? { sessionId: action.sessionId } : {}) };\n case \"permission_answered\":\n return { ...state, pendingPermissions: state.pendingPermissions.filter((p) => p.id !== action.id) };\n case \"question_answered\":\n return state.pendingQuestion?.id === action.id ? { ...state, pendingQuestion: undefined } : state;\n case \"history\": {\n let s: SessionState = { ...state, items: [], sessionId: action.sessionId, usageTotal: emptyUsage(), lastResult: undefined };\n for (const m of action.messages) s = applyEvent(s, m as EngineEvent, false);\n return { ...s, running: state.running };\n }\n case \"server\": {\n const m = action.message;\n switch (m.type) {\n case \"ready\":\n return { ...state, connection: \"connected\", protocol: m.protocol, capabilities: m.capabilities ?? [], hop: m.hop, rootCwd: m.cwd };\n case \"event\":\n return applyEvent(state.sessionId ? state : { ...state, sessionId: m.sessionId }, m.event, true);\n case \"permission_request\":\n return { ...state, pendingPermissions: [...state.pendingPermissions, { id: m.id, sessionId: m.sessionId, toolName: m.toolName, input: m.input }] };\n case \"question_request\":\n return { ...state, pendingQuestion: { id: m.id, sessionId: m.sessionId, questions: m.questions } };\n case \"sessions\":\n return { ...state, sessions: m.sessions };\n case \"models\":\n return { ...state, models: m.models };\n case \"skills\":\n return { ...state, skills: m.skills };\n case \"session_history\": {\n const s = reduce(state, { type: \"history\", sessionId: m.sessionId, messages: m.messages });\n return {\n ...s,\n pendingQuestion: m.pendingQuestion ? { id: m.pendingQuestion.id, sessionId: m.sessionId, questions: m.pendingQuestion.questions } : undefined,\n pendingApproval: m.pendingApproval,\n liveElsewhere: m.live ?? false,\n };\n }\n case \"done\":\n return {\n ...state,\n running: false,\n activity: undefined,\n pendingPermissions: [],\n sessionId: m.sessionId,\n ...(m.pendingApproval ? { pendingApproval: m.pendingApproval } : {}),\n ...(m.usage && !state.lastResult ? { usageTotal: addUsage(state.usageTotal, m.usage) } : {}),\n };\n case \"error\":\n return { ...state, error: m.message, items: [...dropDraft(state.items), { kind: \"error\", id: nextId(\"e\"), message: m.message, ts: new Date().toISOString() }] };\n default:\n return state;\n }\n }\n }\n}\n\nexport function elapsedLabel(ms: number): string {\n const s = Math.max(0, Math.floor(ms / 1000));\n return s < 60 ? `${s}s` : `${Math.floor(s / 60)}m ${s % 60}s`;\n}\n\nexport function resultLabel(r: ResultEvent): { label: string; tone: \"ok\" | \"bad\" | \"warn\" | \"muted\" } {\n switch (r.subtype) {\n case \"success\":\n return { label: \"Done\", tone: \"ok\" };\n case \"cancelled\":\n return { label: \"Interrupted\", tone: \"muted\" };\n case \"needs_approval\":\n return { label: \"Needs your approval\", tone: \"warn\" };\n case \"max_turns\":\n return { label: \"Stopped at the turn limit\", tone: \"warn\" };\n case \"error\":\n return { label: r.reason ? `Failed: ${r.reason}` : \"Failed\", tone: \"bad\" };\n default:\n return { label: String((r as { subtype: string }).subtype).replace(/_/g, \" \"), tone: \"warn\" };\n }\n}\n\nexport function formatTokens(u: Usage): string {\n const k = (n: number) => (n >= 10_000 ? `${(n / 1000).toFixed(1)}k` : String(n));\n return `${k(u.input_tokens)}↑ ${k(u.output_tokens)}↓`;\n}\n",
|
|
7
|
+
"import { useCallback, useEffect, useMemo, useReducer, useRef } from \"react\";\nimport type { ContentBlock } from \"@mlpal/harness-protocol\";\nimport { type RunOptions, type SocketFactory, YodexClient } from \"./client\";\nimport { initialState, reduce } from \"./reducer\";\nimport type { AskOutcome, SessionState } from \"./types\";\n\nexport interface UseYodexSessionOptions {\n url: string;\n token?: string;\n /** Load this session's history on connect and run turns against it. */\n sessionId?: string;\n /** Default run options (model, mode, hop, cwd) applied to every turn. */\n run?: RunOptions;\n autoConnect?: boolean;\n socketFactory?: SocketFactory;\n}\n\nexport interface Attachment {\n name: string;\n mediaType: string;\n /** base64 payload, no data: prefix. */\n data: string;\n}\n\nexport interface YodexSession {\n state: SessionState;\n client: YodexClient;\n /** Send a turn. Attachments ride as image blocks once the server speaks yodex/2. */\n run: (text: string, attachments?: Attachment[], options?: RunOptions) => void;\n stop: () => void;\n allow: (permissionId: string) => void;\n deny: (permissionId: string, reason?: string) => void;\n answer: (questionId: string, outcome: AskOutcome) => void;\n approve: (decision: \"allow\" | \"deny\", reason?: string) => void;\n loadSession: (sessionId: string) => Promise<void>;\n refreshSessions: () => Promise<void>;\n refreshModels: () => Promise<void>;\n newSession: () => void;\n}\n\n/** One session view over one socket: connect, replay, stream, answer. */\nexport function useYodexSession(options: UseYodexSessionOptions): YodexSession {\n const [state, dispatch] = useReducer(reduce, undefined, initialState);\n const sessionIdRef = useRef<string | undefined>(options.sessionId);\n const client = useMemo(\n () =>\n new YodexClient({\n url: options.url,\n token: options.token,\n socketFactory: options.socketFactory,\n onState: (s) => dispatch({ type: \"connection\", state: s }),\n onMessage: (m) => {\n dispatch({ type: \"server\", message: m });\n if (m.type === \"ready\" && sessionIdRef.current) {\n client.loadSession(sessionIdRef.current).catch((e: Error) => dispatch({ type: \"error\", message: e.message }));\n }\n },\n }),\n // The socket outlives renders; a URL or token change means a new client.\n [options.url, options.token, options.socketFactory],\n );\n\n useEffect(() => {\n if (options.autoConnect === false) return;\n client.connect();\n return () => client.close();\n }, [client, options.autoConnect]);\n\n useEffect(() => {\n sessionIdRef.current = state.sessionId ?? options.sessionId;\n }, [state.sessionId, options.sessionId]);\n\n const guard = useCallback(\n (fn: () => void) => {\n try {\n fn();\n } catch (e) {\n dispatch({ type: \"error\", message: (e as Error).message });\n }\n },\n [],\n );\n\n const run = useCallback(\n (text: string, attachments: Attachment[] = [], runOptions: RunOptions = {}) => {\n const blocks: ContentBlock[] = attachments.map((a) => ({ type: \"image\", source: { type: \"base64\", media_type: a.mediaType, data: a.data } }));\n if (blocks.length && !state.capabilities.includes(\"attachments\")) {\n dispatch({ type: \"error\", message: \"This server does not accept image attachments; the message was not sent.\" });\n return;\n }\n guard(() => {\n const sessionId = sessionIdRef.current;\n dispatch({ type: \"local_user\", text, ts: new Date().toISOString(), blocks });\n dispatch({ type: \"run_started\", sessionId, at: Date.now() });\n client.run(text, { ...(sessionId ? { sessionId } : {}), ...options.run, ...runOptions, ...(blocks.length ? { blocks } : {}) });\n });\n },\n [client, guard, options.run, state.capabilities],\n );\n\n const stop = useCallback(() => guard(() => client.interrupt()), [client, guard]);\n const allow = useCallback(\n (id: string) =>\n guard(() => {\n client.respondPermission(id, \"allow\");\n dispatch({ type: \"permission_answered\", id });\n }),\n [client, guard],\n );\n const deny = useCallback(\n (id: string, reason?: string) =>\n guard(() => {\n client.respondPermission(id, \"deny\", reason);\n dispatch({ type: \"permission_answered\", id });\n }),\n [client, guard],\n );\n const answer = useCallback(\n (id: string, outcome: AskOutcome) =>\n guard(() => {\n client.respondQuestion(id, outcome);\n dispatch({ type: \"question_answered\", id });\n }),\n [client, guard],\n );\n const approve = useCallback(\n (decision: \"allow\" | \"deny\", reason?: string) =>\n guard(() => {\n const sessionId = sessionIdRef.current;\n if (!sessionId) throw new Error(\"no session to approve\");\n dispatch({ type: \"run_started\", sessionId, at: Date.now() });\n client.respondApproval(sessionId, decision, reason);\n }),\n [client, guard],\n );\n const loadSession = useCallback(\n async (sessionId: string) => {\n sessionIdRef.current = sessionId;\n dispatch({ type: \"clear\" });\n try {\n await client.loadSession(sessionId);\n } catch (e) {\n dispatch({ type: \"error\", message: (e as Error).message });\n }\n },\n [client],\n );\n const refreshSessions = useCallback(async () => {\n try {\n await client.listSessions();\n } catch (e) {\n dispatch({ type: \"error\", message: (e as Error).message });\n }\n }, [client]);\n const refreshModels = useCallback(async () => {\n try {\n await client.listModels();\n } catch (e) {\n dispatch({ type: \"error\", message: (e as Error).message });\n }\n }, [client]);\n const newSession = useCallback(() => {\n sessionIdRef.current = undefined;\n dispatch({ type: \"clear\" });\n }, []);\n\n return { state, client, run, stop, allow, deny, answer, approve, loadSession, refreshSessions, refreshModels, newSession };\n}\n",
|
|
8
|
+
"import { useEffect, useRef } from \"react\";\nimport type { TranscriptItem } from \"../client/types\";\nimport { AssistantMessage } from \"./AssistantMessage\";\nimport { cn } from \"./cn\";\nimport { PlanChecklist } from \"./PlanChecklist\";\nimport { ToolCall } from \"./ToolCall\";\nimport { resultLabel, formatTokens } from \"../client/reducer\";\n\nexport interface TranscriptProps {\n items: TranscriptItem[];\n /** Keep the view pinned to the bottom while new rows arrive, unless the reader scrolled up. */\n autoScroll?: boolean;\n onOpenFile?: (path: string) => void;\n /** Rendered after the last row: pending prompts, the status line. */\n footer?: React.ReactNode;\n emptyState?: React.ReactNode;\n className?: string;\n}\n\nexport function Transcript({ items, autoScroll = true, onOpenFile, footer, emptyState, className }: TranscriptProps) {\n const ref = useRef<HTMLDivElement>(null);\n const pinned = useRef(true);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const onScroll = () => {\n pinned.current = el.scrollHeight - el.scrollTop - el.clientHeight < 48;\n };\n el.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => el.removeEventListener(\"scroll\", onScroll);\n }, []);\n useEffect(() => {\n const el = ref.current;\n if (el && autoScroll && pinned.current) el.scrollTop = el.scrollHeight;\n });\n return (\n <div ref={ref} className={cn(\"yx-transcript flex-1 overflow-y-auto px-4 py-3\", className)} role=\"log\" aria-live=\"polite\">\n <div className=\"mx-auto flex w-full max-w-3xl flex-col gap-3\">\n {items.length === 0 && emptyState}\n {items.map((it) => {\n switch (it.kind) {\n case \"user\":\n return (\n <div key={it.id} className={cn(\"flex\", it.author.type === \"human\" ? \"justify-end\" : \"justify-start\")} data-author={it.author.type}>\n <div className={cn(\"max-w-[85%] whitespace-pre-wrap break-words rounded-2xl px-4 py-2 text-[15px] leading-6\", it.author.type === \"human\" ? \"rounded-br-md bg-primary text-primary-foreground\" : \"rounded-bl-md border border-border bg-card\")}>\n {it.author.type !== \"human\" && <div className=\"mb-1 text-[11px] text-muted-foreground\">{it.author.displayName ?? it.author.type}</div>}\n {it.blocks?.some((b) => b.type === \"image\") && <div className=\"mb-1 text-[11px] opacity-80\">[image]</div>}\n {it.text}\n </div>\n </div>\n );\n case \"assistant\":\n return <AssistantMessage key={it.id} text={it.text} live={it.live} />;\n case \"tool\":\n return <ToolCall key={it.id} item={it} onOpenFile={onOpenFile} />;\n case \"plan\":\n return <PlanChecklist key=\"plan\" items={it.items} />;\n case \"result\": {\n const { label, tone } = resultLabel(it.result);\n return (\n <div key={it.id} className={cn(\"flex items-center gap-2 text-[12px] text-muted-foreground\", tone === \"bad\" && \"text-destructive\")} data-subtype={it.result.subtype}>\n <span>{label}</span>\n <span>·</span>\n <span className=\"font-mono tabular-nums\">\n {it.result.numTurns} step{it.result.numTurns === 1 ? \"\" : \"s\"} · {formatTokens(it.result.usage)}\n </span>\n </div>\n );\n }\n case \"error\":\n return (\n <div key={it.id} role=\"alert\" className=\"rounded-md border border-destructive/40 bg-destructive/5 px-3 py-2 text-[13px] text-destructive\">\n {it.message}\n </div>\n );\n case \"compact\":\n return (\n <div key={it.id} className=\"text-center text-[11px] text-muted-foreground\">\n — context compacted ({it.replacedMessages} earlier messages summarised) —\n </div>\n );\n }\n })}\n {footer}\n </div>\n </div>\n );\n}\n",
|
|
9
|
+
"import Markdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport { cn } from \"./cn\";\n\nconst plugins = [remarkGfm];\n\n/**\n * Assistant prose as sanitised markdown: GFM tables and task lists, raw HTML skipped, links\n * opened in a new tab. `live` marks a still-streaming turn.\n */\nexport function AssistantMessage({ text, live, className }: { text: string; live?: boolean; className?: string }) {\n return (\n <div className={cn(\"yx-assistant prose prose-sm max-w-none break-words text-foreground\", live && \"yx-live\", className)} data-live={live ? \"true\" : undefined}>\n <Markdown\n remarkPlugins={plugins}\n skipHtml\n components={{\n a: ({ node: _n, ...props }) => <a {...props} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-info underline underline-offset-2\" />,\n pre: ({ node: _n, ...props }) => <pre {...props} className=\"overflow-x-auto rounded-md border border-border bg-card p-3 font-mono text-[12.5px] leading-5\" />,\n code: ({ node: _n, className: cls, ...props }) =>\n cls ? <code {...props} className={cls} /> : <code {...props} className=\"rounded bg-muted px-1 py-0.5 font-mono text-[0.9em]\" />,\n table: ({ node: _n, ...props }) => (\n <div className=\"overflow-x-auto\">\n <table {...props} className=\"my-2 w-full border-collapse text-sm\" />\n </div>\n ),\n th: ({ node: _n, ...props }) => <th {...props} className=\"border border-border bg-muted px-2 py-1 text-left font-medium\" />,\n td: ({ node: _n, ...props }) => <td {...props} className=\"border border-border px-2 py-1 align-top\" />,\n }}\n >\n {text}\n </Markdown>\n </div>\n );\n}\n",
|
|
10
|
+
"import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n",
|
|
11
|
+
"import { Check, Circle, Loader2 } from \"lucide-react\";\nimport type { PlanItem } from \"../client/types\";\nimport { cn } from \"./cn\";\n\n/** The agent's task list (TaskCreate / TaskUpdate), re-rendered in place as it changes. */\nexport function PlanChecklist({ items, className }: { items: PlanItem[]; className?: string }) {\n if (!items.length) return null;\n const done = items.filter((t) => t.status === \"completed\").length;\n return (\n <div className={cn(\"yx-plan rounded-md border border-border bg-card p-3 text-sm\", className)} aria-label=\"plan\">\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"font-medium\">Plan</span>\n <span className=\"font-mono text-[12px] tabular-nums text-muted-foreground\">\n {done} / {items.length}\n </span>\n </div>\n <ol className=\"space-y-1\">\n {items.map((t) => (\n <li key={t.id} className={cn(\"flex items-start gap-2\", t.status === \"completed\" && \"text-muted-foreground line-through\")} data-status={t.status}>\n {t.status === \"completed\" ? <Check className=\"mt-0.5 h-4 w-4 shrink-0 text-success\" aria-label=\"completed\" /> : t.status === \"in_progress\" ? <Loader2 className=\"mt-0.5 h-4 w-4 shrink-0 animate-spin text-info\" aria-label=\"in progress\" /> : <Circle className=\"mt-0.5 h-4 w-4 shrink-0 text-muted-foreground\" aria-label=\"pending\" />}\n <span>{t.subject}</span>\n </li>\n ))}\n </ol>\n </div>\n );\n}\n",
|
|
12
|
+
"import { useState } from \"react\";\nimport { AlertCircle, Check, ChevronRight, FileDiff, Loader2, Terminal, Wrench } from \"lucide-react\";\nimport type { TranscriptItem } from \"../client/types\";\nimport { cn } from \"./cn\";\nimport { DiffView, diffCounts } from \"./DiffView\";\n\ntype ToolItem = Extract<TranscriptItem, { kind: \"tool\" }>;\n\n/** The one argument worth showing in the header: a command, a path, a pattern, a prompt. */\nexport function toolSummary(name: string, input: Record<string, unknown>): string {\n const pick = (...keys: string[]) => {\n for (const k of keys) {\n const v = input[k];\n if (typeof v === \"string\" && v.trim()) return v.trim();\n }\n return \"\";\n };\n switch (name) {\n case \"Bash\":\n return pick(\"command\");\n case \"Read\":\n case \"Write\":\n case \"Edit\":\n case \"List\":\n return pick(\"file_path\", \"path\");\n case \"Grep\":\n case \"Glob\":\n return pick(\"pattern\");\n case \"Task\":\n case \"Agent\":\n return pick(\"description\", \"prompt\");\n case \"WebFetch\":\n return pick(\"url\");\n case \"WebSearch\":\n return pick(\"query\");\n case \"Skill\":\n return pick(\"name\", \"skill\");\n default:\n return pick(\"command\", \"path\", \"file_path\", \"pattern\", \"query\", \"description\", \"name\") || \"\";\n }\n}\n\nfunction clip(s: string, n = 160): string {\n return s.length > n ? `${s.slice(0, n - 1)}…` : s;\n}\n\nconst MAX_OUTPUT = 4000;\n\n/** One tool call with its result, collapsed to a single row by default. */\nexport function ToolCall({ item, defaultOpen = false, onOpenFile }: { item: ToolItem; defaultOpen?: boolean; onOpenFile?: (path: string) => void }) {\n const [open, setOpen] = useState(defaultOpen);\n const summary = toolSummary(item.name, item.input);\n const r = item.result;\n const status = !r ? \"running\" : r.isError ? \"error\" : \"ok\";\n const counts = r?.diff ? diffCounts(r.diff) : null;\n const path = typeof item.input.file_path === \"string\" ? item.input.file_path : typeof item.input.path === \"string\" ? item.input.path : undefined;\n const Icon = r?.diff ? FileDiff : item.name === \"Bash\" ? Terminal : Wrench;\n return (\n <div className={cn(\"yx-tool rounded-md border border-border bg-card text-sm\", status === \"error\" && \"border-destructive/40\")} data-tool={item.name} data-status={status}>\n <button\n type=\"button\"\n onClick={() => setOpen((o) => !o)}\n aria-expanded={open}\n className=\"flex min-h-11 w-full items-center gap-2 px-3 py-2 text-left hover:bg-muted/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <ChevronRight className={cn(\"h-4 w-4 shrink-0 text-muted-foreground transition-transform\", open && \"rotate-90\")} aria-hidden />\n <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" aria-hidden />\n <span className=\"font-medium\">{item.name}</span>\n {summary && <span className=\"min-w-0 flex-1 truncate font-mono text-[12.5px] text-muted-foreground\">{clip(summary)}</span>}\n {counts && (\n <span className=\"shrink-0 font-mono text-[12px] tabular-nums\">\n <span className=\"text-success\">+{counts.added}</span> <span className=\"text-destructive\">−{counts.removed}</span>\n </span>\n )}\n {status === \"running\" && <Loader2 className=\"h-4 w-4 shrink-0 animate-spin text-muted-foreground\" aria-label=\"running\" />}\n {status === \"ok\" && <Check className=\"h-4 w-4 shrink-0 text-success\" aria-label=\"ok\" />}\n {status === \"error\" && <AlertCircle className=\"h-4 w-4 shrink-0 text-destructive\" aria-label=\"error\" />}\n </button>\n {open && (\n <div className=\"border-t border-border px-3 py-2\">\n <div className=\"mb-1 text-[11px] uppercase tracking-wide text-muted-foreground\">input</div>\n <pre className=\"overflow-x-auto whitespace-pre-wrap break-words font-mono text-[12px] leading-5\">{summary && Object.keys(item.input).length === 1 ? summary : JSON.stringify(item.input, null, 2)}</pre>\n {r && (\n <>\n <div className=\"mb-1 mt-2 flex items-center gap-2 text-[11px] uppercase tracking-wide text-muted-foreground\">\n <span>{r.isError ? \"error\" : \"result\"}</span>\n {path && onOpenFile && (\n <button type=\"button\" onClick={() => onOpenFile(path)} className=\"ml-auto min-h-8 rounded px-2 text-info hover:bg-muted\">\n open file\n </button>\n )}\n </div>\n {r.diff ? (\n <DiffView diff={r.diff} />\n ) : (\n <pre className={cn(\"max-h-80 overflow-auto whitespace-pre-wrap break-words font-mono text-[12px] leading-5\", r.isError && \"text-destructive\")}>\n {r.content.length > MAX_OUTPUT ? `${r.content.slice(0, MAX_OUTPUT)}\\n… (${r.content.length - MAX_OUTPUT} more characters)` : r.content || \"(no output)\"}\n </pre>\n )}\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n",
|
|
13
|
+
"import { cn } from \"./cn\";\n\nexport function diffCounts(diff: string): { added: number; removed: number } {\n let added = 0;\n let removed = 0;\n for (const line of diff.split(\"\\n\")) {\n if (line.startsWith(\"+++\") || line.startsWith(\"---\")) continue;\n if (line.startsWith(\"+\")) added += 1;\n else if (line.startsWith(\"-\")) removed += 1;\n }\n return { added, removed };\n}\n\n/** A unified diff, line by line. Render-only: the engine computed it, the model never sees it. */\nexport function DiffView({ diff, className }: { diff: string; className?: string }) {\n const lines = diff.split(\"\\n\");\n return (\n <pre className={cn(\"yx-diff overflow-x-auto rounded-md border border-border bg-card font-mono text-[12px] leading-5\", className)} aria-label=\"diff\">\n {lines.map((line, i) => {\n const kind = line.startsWith(\"+++\") || line.startsWith(\"---\") ? \"file\" : line.startsWith(\"@@\") ? \"hunk\" : line.startsWith(\"+\") ? \"add\" : line.startsWith(\"-\") ? \"del\" : \"ctx\";\n return (\n <div\n key={i}\n className={cn(\n \"whitespace-pre px-3\",\n kind === \"add\" && \"bg-success/10 text-success\",\n kind === \"del\" && \"bg-destructive/10 text-destructive\",\n kind === \"hunk\" && \"text-info\",\n kind === \"file\" && \"text-muted-foreground\",\n )}\n >\n {line || \" \"}\n </div>\n );\n })}\n </pre>\n );\n}\n",
|
|
14
|
+
"import { useEffect } from \"react\";\nimport { ShieldAlert } from \"lucide-react\";\nimport type { PendingPermission } from \"../client/types\";\nimport { cn } from \"./cn\";\n\nexport function permissionSummary(p: PendingPermission): string {\n const v = p.input.command ?? p.input.file_path ?? p.input.path ?? p.input.url;\n if (typeof v === \"string\") return v;\n const s = JSON.stringify(p.input);\n return s.length > 240 ? `${s.slice(0, 239)}…` : s;\n}\n\n/** The engine asks before a tool runs. Allow / Deny, with `a` / `d` as keys while focused. */\nexport function PermissionPrompt({ request, onAllow, onDeny, className }: { request: PendingPermission; onAllow: (id: string) => void; onDeny: (id: string, reason?: string) => void; className?: string }) {\n useEffect(() => {\n const key = (e: KeyboardEvent) => {\n const t = e.target as HTMLElement | null;\n if (t && (t.tagName === \"TEXTAREA\" || t.tagName === \"INPUT\" || t.isContentEditable)) return;\n if (e.key === \"a\") onAllow(request.id);\n else if (e.key === \"d\") onDeny(request.id);\n };\n document.addEventListener(\"keydown\", key);\n return () => document.removeEventListener(\"keydown\", key);\n }, [request.id, onAllow, onDeny]);\n return (\n <div role=\"alertdialog\" aria-labelledby={`perm-${request.id}`} className={cn(\"yx-permission rounded-md border border-warning/50 bg-card p-3 text-sm\", className)}>\n <div id={`perm-${request.id}`} className=\"mb-2 flex items-center gap-2 font-medium\">\n <ShieldAlert className=\"h-4 w-4 text-warning\" aria-hidden />\n Run <span className=\"font-mono\">{request.toolName}</span>?\n </div>\n <pre className=\"mb-3 overflow-x-auto whitespace-pre-wrap break-words rounded bg-muted p-2 font-mono text-[12.5px] leading-5\">{permissionSummary(request)}</pre>\n <div className=\"flex gap-2\">\n <button type=\"button\" onClick={() => onAllow(request.id)} className=\"min-h-11 flex-1 rounded-md bg-primary px-4 font-medium text-primary-foreground hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\">\n Allow <kbd className=\"ml-1 rounded bg-primary-foreground/20 px-1 text-[11px]\">a</kbd>\n </button>\n <button type=\"button\" onClick={() => onDeny(request.id)} className=\"min-h-11 flex-1 rounded-md border border-border bg-background px-4 font-medium hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\">\n Deny <kbd className=\"ml-1 rounded bg-muted px-1 text-[11px]\">d</kbd>\n </button>\n </div>\n </div>\n );\n}\n",
|
|
15
|
+
"import { useState } from \"react\";\nimport { HelpCircle, X } from \"lucide-react\";\nimport type { AskOutcome, AskQuestion, PendingQuestion } from \"../client/types\";\nimport { cn } from \"./cn\";\n\n/** What the person has picked or typed so far, per question index. */\nexport interface QuestionDraft {\n selected: string[][];\n notes: string[];\n}\n\nexport function emptyDraft(questions: AskQuestion[]): QuestionDraft {\n return { selected: questions.map(() => []), notes: questions.map(() => \"\") };\n}\n\n/** The ask.ts outcome: labels and free text per question; a closed form is `declined`. */\nexport function buildOutcome(questions: AskQuestion[], draft: QuestionDraft, declined = false): AskOutcome {\n if (declined) return { declined: true, answers: [] };\n return {\n declined: false,\n answers: questions.map((q, i) => {\n const picked = draft.selected[i] ?? [];\n const note = (draft.notes[i] ?? \"\").trim();\n const answers = picked.length ? picked : note ? [note] : [];\n return { question: q.question, answers, ...(picked.length && note ? { note } : {}) };\n }),\n };\n}\n\nfunction chip(q: AskQuestion, i: number): string {\n const h = (q.header ?? \"\").trim();\n return h || `Q${i + 1}`;\n}\n\n/**\n * AskUserQuestion as a form: one tab per question, single or multi select with optional\n * previews, free text, Submit or close-to-decline. The outcome shape mirrors harness ask.ts.\n */\nexport function QuestionForm({ request, onSubmit, onDecline, className }: { request: PendingQuestion; onSubmit: (id: string, outcome: AskOutcome) => void; onDecline: (id: string) => void; className?: string }) {\n const qs = request.questions;\n const [tab, setTab] = useState(0);\n const [draft, setDraft] = useState<QuestionDraft>(() => emptyDraft(qs));\n const q = qs[tab];\n if (!q) return null;\n const picked = draft.selected[tab] ?? [];\n const toggle = (label: string) => {\n setDraft((d) => {\n const selected = d.selected.slice();\n const cur = selected[tab] ?? [];\n selected[tab] = q.multiSelect ? (cur.includes(label) ? cur.filter((l) => l !== label) : [...cur, label]) : cur[0] === label ? [] : [label];\n return { ...d, selected };\n });\n };\n const setNote = (v: string) =>\n setDraft((d) => {\n const notes = d.notes.slice();\n notes[tab] = v;\n return { ...d, notes };\n });\n const answered = qs.map((_, i) => (draft.selected[i]?.length ?? 0) > 0 || (draft.notes[i] ?? \"\").trim().length > 0);\n const previewOf = (q.options ?? []).find((o) => picked[0] === o.label)?.preview;\n return (\n <div role=\"dialog\" aria-label=\"The agent has a question\" className={cn(\"yx-question rounded-md border border-info/50 bg-card text-sm\", className)}>\n <div className=\"flex items-center gap-2 border-b border-border px-3 py-2\">\n <HelpCircle className=\"h-4 w-4 text-info\" aria-hidden />\n <span className=\"font-medium\">The agent needs your input</span>\n <button type=\"button\" onClick={() => onDecline(request.id)} aria-label=\"Close and keep talking\" className=\"ml-auto flex h-11 w-11 items-center justify-center rounded-md text-muted-foreground hover:bg-muted\">\n <X className=\"h-4 w-4\" aria-hidden />\n </button>\n </div>\n {qs.length > 1 && (\n <div role=\"tablist\" className=\"flex gap-1 overflow-x-auto border-b border-border px-2 py-1\">\n {qs.map((qq, i) => (\n <button key={i} role=\"tab\" type=\"button\" aria-selected={i === tab} onClick={() => setTab(i)} className={cn(\"min-h-9 shrink-0 rounded-md px-3 text-[12px]\", i === tab ? \"bg-primary text-primary-foreground\" : \"bg-muted text-muted-foreground hover:bg-muted/70\", answered[i] && i !== tab && \"ring-1 ring-success\")}>\n {chip(qq, i)}\n </button>\n ))}\n </div>\n )}\n <div className=\"space-y-3 p-3\">\n <p className=\"font-medium\">{q.question}</p>\n {(q.options ?? []).length > 0 && (\n <div role={q.multiSelect ? \"group\" : \"radiogroup\"} className=\"space-y-2\">\n {(q.options ?? []).map((o) => {\n const on = picked.includes(o.label);\n return (\n <button key={o.label} type=\"button\" role={q.multiSelect ? \"checkbox\" : \"radio\"} aria-checked={on} onClick={() => toggle(o.label)} className={cn(\"flex min-h-11 w-full items-start gap-3 rounded-md border px-3 py-2 text-left hover:bg-muted/60\", on ? \"border-primary bg-muted\" : \"border-border\")}>\n <span className={cn(\"mt-1 h-4 w-4 shrink-0 border\", q.multiSelect ? \"rounded\" : \"rounded-full\", on ? \"border-primary bg-primary\" : \"border-muted-foreground\")} aria-hidden />\n <span className=\"min-w-0\">\n <span className=\"block font-medium\">{o.label}</span>\n {o.description && <span className=\"block text-muted-foreground\">{o.description}</span>}\n </span>\n </button>\n );\n })}\n </div>\n )}\n {previewOf && <pre className=\"overflow-x-auto rounded-md border border-border bg-muted p-2 font-mono text-[12px] leading-5\">{previewOf}</pre>}\n <label className=\"block\">\n <span className=\"mb-1 block text-[12px] text-muted-foreground\">{(q.options ?? []).length ? \"Add a note (optional)\" : \"Your answer\"}</span>\n <textarea value={draft.notes[tab] ?? \"\"} onChange={(e) => setNote(e.target.value)} rows={2} className=\"w-full rounded-md border border-border bg-input-background px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\" />\n </label>\n <div className=\"flex gap-2\">\n {tab < qs.length - 1 ? (\n <button type=\"button\" onClick={() => setTab(tab + 1)} className=\"min-h-11 flex-1 rounded-md border border-border px-4 font-medium hover:bg-muted\">\n Next\n </button>\n ) : null}\n <button type=\"button\" onClick={() => onSubmit(request.id, buildOutcome(qs, draft))} disabled={!answered.some(Boolean)} className=\"min-h-11 flex-1 rounded-md bg-primary px-4 font-medium text-primary-foreground hover:opacity-90 disabled:opacity-50\">\n Submit\n </button>\n </div>\n </div>\n </div>\n );\n}\n",
|
|
16
|
+
"import { useEffect, useState } from \"react\";\nimport { AlertTriangle, Check, Loader2, Square } from \"lucide-react\";\nimport type { ResultEvent, Usage } from \"@mlpal/harness-protocol\";\nimport type { ConnectionState } from \"../client/types\";\nimport { elapsedLabel, formatTokens, resultLabel } from \"../client/reducer\";\nimport { cn } from \"./cn\";\n\nexport interface RunStatusProps {\n running: boolean;\n startedAt?: number;\n activity?: string;\n lastResult?: ResultEvent;\n usageTotal?: Usage;\n connection?: ConnectionState;\n onStop?: () => void;\n onApprove?: (decision: \"allow\" | \"deny\") => void;\n className?: string;\n /** Injected clock for deterministic rendering. */\n now?: () => number;\n}\n\n/** One row: what the agent is doing with elapsed time while running; the result line after. */\nexport function RunStatus({ running, startedAt, activity, lastResult, usageTotal, connection, onStop, onApprove, className, now = Date.now }: RunStatusProps) {\n const [, tick] = useState(0);\n useEffect(() => {\n if (!running) return;\n const h = setInterval(() => tick((n) => n + 1), 1000);\n return () => clearInterval(h);\n }, [running]);\n if (connection && connection !== \"connected\") {\n return (\n <div className={cn(\"yx-status flex min-h-9 items-center gap-2 text-[12.5px] text-muted-foreground\", className)} role=\"status\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" aria-hidden />\n {connection === \"closed\" ? \"Disconnected\" : connection === \"reconnecting\" ? \"Reconnecting…\" : \"Connecting…\"}\n </div>\n );\n }\n if (running) {\n return (\n <div className={cn(\"yx-status flex min-h-9 items-center gap-2 text-[12.5px] text-muted-foreground\", className)} role=\"status\" aria-live=\"polite\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-accent\" aria-hidden />\n <span>{activity ?? \"Working\"}</span>\n {startedAt !== undefined && <span className=\"font-mono tabular-nums\">· {elapsedLabel(now() - startedAt)}</span>}\n {onStop && (\n <button type=\"button\" onClick={onStop} className=\"ml-auto flex min-h-9 items-center gap-1 rounded-md px-2 hover:bg-muted\" aria-label=\"Stop\">\n <Square className=\"h-3.5 w-3.5\" aria-hidden /> Stop\n </button>\n )}\n </div>\n );\n }\n if (!lastResult) return null;\n const { label, tone } = resultLabel(lastResult);\n const needsApproval = lastResult.subtype === \"needs_approval\";\n return (\n <div className={cn(\"yx-status flex min-h-9 flex-wrap items-center gap-2 text-[12.5px]\", className)} role=\"status\" data-subtype={lastResult.subtype}>\n {tone === \"ok\" ? <Check className=\"h-3.5 w-3.5 text-success\" aria-hidden /> : tone === \"bad\" ? <AlertTriangle className=\"h-3.5 w-3.5 text-destructive\" aria-hidden /> : <AlertTriangle className={cn(\"h-3.5 w-3.5\", tone === \"warn\" ? \"text-warning\" : \"text-muted-foreground\")} aria-hidden />}\n <span className={cn(tone === \"ok\" && \"text-success\", tone === \"bad\" && \"text-destructive\", tone === \"warn\" && \"text-warning\", tone === \"muted\" && \"text-muted-foreground\")}>{label}</span>\n <span className=\"text-muted-foreground\">·</span>\n <span className=\"font-mono tabular-nums text-muted-foreground\">\n {lastResult.numTurns} step{lastResult.numTurns === 1 ? \"\" : \"s\"} · {formatTokens(usageTotal ?? lastResult.usage)}\n </span>\n {needsApproval && lastResult.pendingApproval && (\n <div className=\"basis-full rounded-md border border-warning/50 bg-card p-2\">\n <div className=\"mb-1 text-[12px] text-muted-foreground\">{lastResult.pendingApproval.reason}</div>\n <pre className=\"mb-2 overflow-x-auto whitespace-pre-wrap break-words font-mono text-[12px]\">{lastResult.pendingApproval.command}</pre>\n {onApprove && (\n <div className=\"flex gap-2\">\n <button type=\"button\" onClick={() => onApprove(\"allow\")} className=\"min-h-11 flex-1 rounded-md bg-primary px-3 font-medium text-primary-foreground\">\n Approve and continue\n </button>\n <button type=\"button\" onClick={() => onApprove(\"deny\")} className=\"min-h-11 flex-1 rounded-md border border-border px-3 font-medium hover:bg-muted\">\n Don't run it\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n",
|
|
17
|
+
"import { Plus } from \"lucide-react\";\nimport type { SessionSummary } from \"@mlpal/harness-protocol\";\nimport { cn } from \"./cn\";\n\n/** A SessionSummary; the yodex/2 fields (hop, relCwd, projectName, …) are present when the\n * server claims \"sessions_v2\". */\nexport type SessionRow = SessionSummary;\n\nexport function groupSessions(rows: SessionRow[]): Array<{ project: string; rows: SessionRow[] }> {\n const groups = new Map<string, SessionRow[]>();\n for (const r of rows) {\n const key = r.projectName ?? \"\";\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(r);\n }\n return [...groups.entries()].map(([project, rows]) => ({ project, rows }));\n}\n\nfunction when(iso: string): string {\n const t = Date.parse(iso);\n if (Number.isNaN(t)) return \"\";\n const d = new Date(t);\n return `${d.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" })} ${d.toLocaleTimeString(undefined, { hour: \"2-digit\", minute: \"2-digit\" })}`;\n}\n\nexport function SessionList({ sessions, selectedId, onSelect, onNew, className }: { sessions: SessionRow[]; selectedId?: string; onSelect: (sessionId: string) => void; onNew?: () => void; className?: string }) {\n const groups = groupSessions(sessions);\n return (\n <nav className={cn(\"yx-sessions text-sm\", className)} aria-label=\"Sessions\">\n {onNew && (\n <button type=\"button\" onClick={onNew} className=\"mb-2 flex min-h-11 w-full items-center gap-2 rounded-md border border-dashed border-border px-3 text-left hover:bg-muted\">\n <Plus className=\"h-4 w-4\" aria-hidden /> New session\n </button>\n )}\n {sessions.length === 0 && <p className=\"px-3 py-2 text-muted-foreground\">No sessions yet.</p>}\n {groups.map((g) => (\n <div key={g.project} className=\"mb-2\">\n {g.project && <div className=\"px-3 py-1 text-[11px] uppercase tracking-wide text-muted-foreground\">{g.project}</div>}\n <ul>\n {g.rows.map((s) => {\n const on = s.sessionId === selectedId;\n const title = s.name || s.title || s.lastMessagePreview || s.sessionId.slice(0, 8);\n return (\n <li key={s.sessionId}>\n <button type=\"button\" onClick={() => onSelect(s.sessionId)} aria-current={on ? \"true\" : undefined} className={cn(\"flex min-h-11 w-full flex-col gap-0.5 rounded-md px-3 py-2 text-left hover:bg-muted\", on && \"bg-muted\")} data-status={s.status}>\n <span className=\"flex items-center gap-2\">\n {/* live = a run is streaming right now (sessions_v2); the record's status otherwise. */}\n <span\n className={cn(\"h-2 w-2 shrink-0 rounded-full\", s.live ? \"animate-pulse bg-accent\" : s.status === \"active\" ? \"bg-success\" : s.status === \"listening\" ? \"bg-info\" : s.status === \"error\" ? \"bg-destructive\" : \"bg-muted-foreground/40\")}\n aria-label={s.live ? \"working\" : s.status}\n data-live={s.live ? \"true\" : undefined}\n />\n <span className=\"min-w-0 flex-1 truncate font-medium\">{title}</span>\n {s.pendingQuestion && <span className=\"shrink-0 rounded-full bg-warning px-1.5 text-[10px] font-medium text-warning-foreground\">question</span>}\n </span>\n <span className=\"flex gap-2 truncate text-[11.5px] text-muted-foreground\">\n {s.hop && <span className=\"truncate\">{s.hop}</span>}\n {s.relCwd && <span className=\"truncate\">{s.relCwd}</span>}\n <span className=\"ml-auto shrink-0 tabular-nums\">{when(s.updatedAt)}</span>\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n </nav>\n );\n}\n",
|
|
18
|
+
"import { type ClipboardEvent, type DragEvent, type KeyboardEvent, useCallback, useEffect, useRef, useState } from \"react\";\nimport { ArrowUp, ImagePlus, Square, X } from \"lucide-react\";\nimport { cn } from \"./cn\";\n\nexport interface ComposerAttachment {\n name: string;\n mediaType: string;\n /** base64 payload, no data: prefix. */\n data: string;\n /** object URL for the thumbnail; revoked when removed. */\n previewUrl?: string;\n}\n\nexport interface HopOption {\n value: string;\n label: string;\n description?: string;\n}\n\nexport interface ComposerProps {\n onSubmit: (text: string, attachments: ComposerAttachment[]) => void;\n /** While a run is live the send button becomes Stop. */\n running?: boolean;\n onStop?: () => void;\n disabled?: boolean;\n /** Shown as a placeholder reason while disabled, e.g. \"Workspace is waking up\". */\n disabledReason?: string;\n placeholder?: string;\n hopOptions?: HopOption[];\n hop?: string;\n onHopChange?: (hop: string) => void;\n /** A slot beside the HOP picker (model picker, mode pill). */\n leading?: React.ReactNode;\n maxAttachmentBytes?: number;\n className?: string;\n autoFocus?: boolean;\n}\n\nconst ACCEPT = [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"];\n\nasync function fileToAttachment(f: File): Promise<ComposerAttachment> {\n const buf = new Uint8Array(await f.arrayBuffer());\n let bin = \"\";\n for (let i = 0; i < buf.length; i += 0x8000) bin += String.fromCharCode(...buf.subarray(i, i + 0x8000));\n return { name: f.name || \"image\", mediaType: f.type, data: btoa(bin), previewUrl: URL.createObjectURL(f) };\n}\n\n/**\n * The input: a growing textarea, Enter sends and Shift+Enter breaks a line, images paste or\n * drop in as attachments, a HOP picker slot, Stop while running, and an outside-controlled\n * disabled state for a sleeping workspace.\n */\nexport function Composer({ onSubmit, running, onStop, disabled, disabledReason, placeholder = \"Ask yodex to do something…\", hopOptions, hop, onHopChange, leading, maxAttachmentBytes = 8 * 1024 * 1024, className, autoFocus }: ComposerProps) {\n const [text, setText] = useState(\"\");\n const [attachments, setAttachments] = useState<ComposerAttachment[]>([]);\n const [note, setNote] = useState<string | null>(null);\n const ref = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n el.style.height = \"0px\";\n el.style.height = `${Math.min(el.scrollHeight, 240)}px`;\n }, [text]);\n\n const addFiles = useCallback(\n async (files: FileList | File[]) => {\n const list = [...files].filter((f) => ACCEPT.includes(f.type));\n if (!list.length) return;\n const big = list.find((f) => f.size > maxAttachmentBytes);\n if (big) {\n setNote(`${big.name} is larger than ${Math.round(maxAttachmentBytes / 1024 / 1024)} MB`);\n return;\n }\n const next = await Promise.all(list.map(fileToAttachment));\n setAttachments((a) => [...a, ...next]);\n setNote(null);\n },\n [maxAttachmentBytes],\n );\n\n const remove = (i: number) =>\n setAttachments((a) => {\n const gone = a[i];\n if (gone?.previewUrl) URL.revokeObjectURL(gone.previewUrl);\n return a.filter((_, j) => j !== i);\n });\n\n const canSend = !disabled && !running && (text.trim().length > 0 || attachments.length > 0);\n const submit = () => {\n if (!canSend) return;\n onSubmit(text.trim(), attachments);\n setText(\"\");\n for (const a of attachments) if (a.previewUrl) URL.revokeObjectURL(a.previewUrl);\n setAttachments([]);\n };\n\n const onKey = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault();\n submit();\n }\n };\n const onPaste = (e: ClipboardEvent<HTMLTextAreaElement>) => {\n const files = [...e.clipboardData.files];\n if (files.length) {\n e.preventDefault();\n void addFiles(files);\n }\n };\n const onDrop = (e: DragEvent<HTMLDivElement>) => {\n if (e.dataTransfer.files.length) {\n e.preventDefault();\n void addFiles(e.dataTransfer.files);\n }\n };\n\n return (\n <div className={cn(\"yx-composer rounded-lg border border-border bg-card shadow-sm\", disabled && \"opacity-70\", className)} onDrop={onDrop} onDragOver={(e) => e.preventDefault()} data-disabled={disabled ? \"true\" : undefined}>\n {attachments.length > 0 && (\n <ul className=\"flex flex-wrap gap-2 px-3 pt-3\" aria-label=\"attachments\">\n {attachments.map((a, i) => (\n <li key={`${a.name}-${i}`} className=\"relative\">\n {a.previewUrl ? <img src={a.previewUrl} alt={a.name} className=\"h-14 w-14 rounded-md border border-border object-cover\" /> : <span className=\"block h-14 w-14 rounded-md border border-border bg-muted\" />}\n <button type=\"button\" onClick={() => remove(i)} aria-label={`Remove ${a.name}`} className=\"absolute -right-2 -top-2 flex h-6 w-6 items-center justify-center rounded-full border border-border bg-background\">\n <X className=\"h-3 w-3\" aria-hidden />\n </button>\n </li>\n ))}\n </ul>\n )}\n <textarea\n ref={ref}\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={onKey}\n onPaste={onPaste}\n disabled={disabled}\n autoFocus={autoFocus}\n rows={1}\n placeholder={disabled && disabledReason ? disabledReason : placeholder}\n aria-label=\"Message\"\n className=\"block w-full resize-none bg-transparent px-3 py-3 text-[15px] leading-6 placeholder:text-muted-foreground focus-visible:outline-none\"\n />\n <div className=\"flex items-center gap-1 px-2 pb-2\">\n {leading}\n {hopOptions && hopOptions.length > 0 && (\n <select value={hop ?? \"\"} onChange={(e) => onHopChange?.(e.target.value)} disabled={disabled} aria-label=\"HOP\" className=\"min-h-9 max-w-[45%] rounded-md border border-border bg-background px-2 text-[12.5px]\">\n {hopOptions.map((o) => (\n <option key={o.value} value={o.value} title={o.description}>\n {o.label}\n </option>\n ))}\n </select>\n )}\n <label className={cn(\"flex h-11 w-11 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:bg-muted\", disabled && \"pointer-events-none\")} aria-label=\"Attach image\">\n <ImagePlus className=\"h-4 w-4\" aria-hidden />\n <input type=\"file\" accept={ACCEPT.join(\",\")} multiple className=\"sr-only\" disabled={disabled} onChange={(e) => e.target.files && void addFiles(e.target.files)} />\n </label>\n {note && <span className=\"truncate text-[12px] text-destructive\">{note}</span>}\n <span className=\"flex-1\" />\n {running ? (\n <button type=\"button\" onClick={onStop} aria-label=\"Stop\" className=\"flex h-11 w-11 items-center justify-center rounded-md bg-destructive text-destructive-foreground\">\n <Square className=\"h-4 w-4\" aria-hidden />\n </button>\n ) : (\n <button type=\"button\" onClick={submit} disabled={!canSend} aria-label=\"Send\" className=\"flex h-11 w-11 items-center justify-center rounded-md bg-primary text-primary-foreground disabled:opacity-40\">\n <ArrowUp className=\"h-4 w-4\" aria-hidden />\n </button>\n )}\n </div>\n </div>\n );\n}\n"
|
|
19
|
+
],
|
|
20
|
+
"mappings": "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",
|
|
21
|
+
"debugId": "20955FCF1BAF8E9564756E2164756E21",
|
|
22
|
+
"names": []
|
|
23
|
+
}
|
package/dist/styles.css
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--container-3xl:48rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-medium:500;--tracking-wide:.025em;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}}@layer utilities{.pointer-events-none{pointer-events:none}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.relative{position:relative}.-top-2{top:calc(var(--spacing) * -2)}.-right-2{right:calc(var(--spacing) * -2)}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.ml-1{margin-left:var(--spacing)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.table{display:table}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-6{height:calc(var(--spacing) * 6)}.h-11{height:calc(var(--spacing) * 11)}.h-14{height:calc(var(--spacing) * 14)}.h-full{height:100%}.max-h-80{max-height:calc(var(--spacing) * 80)}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-9{min-height:calc(var(--spacing) * 9)}.min-h-11{min-height:calc(var(--spacing) * 11)}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-6{width:calc(var(--spacing) * 6)}.w-11{width:calc(var(--spacing) * 11)}.w-14{width:calc(var(--spacing) * 14)}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-\[45\%\]{max-width:45%}.max-w-\[85\%\]{max-width:85%}.max-w-none{max-width:none}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.basis-full{flex-basis:100%}.border-collapse{border-collapse:collapse}.rotate-90{rotate:90deg}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:calc(var(--radius) + 2px)}.rounded-md{border-radius:var(--radius)}.rounded-br-md{border-bottom-right-radius:var(--radius)}.rounded-bl-md{border-bottom-left-radius:var(--radius)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-border{border-color:var(--border)}.border-destructive\/40{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.border-destructive\/40{border-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.border-info\/50{border-color:var(--info)}@supports (color:color-mix(in lab, red, red)){.border-info\/50{border-color:color-mix(in oklab, var(--info) 50%, transparent)}}.border-muted-foreground{border-color:var(--muted-foreground)}.border-primary{border-color:var(--primary)}.border-warning\/50{border-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.border-warning\/50{border-color:color-mix(in oklab, var(--warning) 50%, transparent)}}.bg-accent{background-color:var(--accent)}.bg-background{background-color:var(--background)}.bg-card{background-color:var(--card)}.bg-destructive,.bg-destructive\/5{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/5{background-color:color-mix(in oklab, var(--destructive) 5%, transparent)}}.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/10{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.bg-info{background-color:var(--info)}.bg-input-background{background-color:var(--input-background)}.bg-muted{background-color:var(--muted)}.bg-muted-foreground\/40{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\/40{background-color:color-mix(in oklab, var(--muted-foreground) 40%, transparent)}}.bg-primary{background-color:var(--primary)}.bg-primary-foreground\/20{background-color:var(--primary-foreground)}@supports (color:color-mix(in lab, red, red)){.bg-primary-foreground\/20{background-color:color-mix(in oklab, var(--primary-foreground) 20%, transparent)}}.bg-success,.bg-success\/10{background-color:var(--success)}@supports (color:color-mix(in lab, red, red)){.bg-success\/10{background-color:color-mix(in oklab, var(--success) 10%, transparent)}}.bg-transparent{background-color:#0000}.bg-warning{background-color:var(--warning)}.object-cover{object-fit:cover}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.text-center{text-align:center}.text-left{text-align:left}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-\[0\.9em\]{font-size:.9em}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent{color:var(--accent)}.text-destructive{color:var(--destructive)}.text-destructive-foreground{color:var(--destructive-foreground)}.text-foreground{color:var(--foreground)}.text-info{color:var(--info)}.text-muted-foreground{color:var(--muted-foreground)}.text-primary-foreground{color:var(--primary-foreground)}.text-success{color:var(--success)}.text-warning{color:var(--warning)}.text-warning-foreground{color:var(--warning-foreground)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-success{--tw-ring-color:var(--success)}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}@media (hover:hover){.hover\:bg-muted:hover,.hover\:bg-muted\/60:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/60:hover{background-color:color-mix(in oklab, var(--muted) 60%, transparent)}}.hover\:bg-muted\/70:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/70:hover{background-color:color-mix(in oklab, var(--muted) 70%, transparent)}}.hover\:opacity-90:hover{opacity:.9}}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--ring)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}}.yx-assistant :is(p,ul,ol,pre,table,blockquote,h1,h2,h3,h4){margin:.5em 0}.yx-assistant :is(h1,h2,h3,h4){font-weight:600;line-height:1.3}.yx-assistant h1{font-size:1.25em}.yx-assistant h2{font-size:1.15em}.yx-assistant h3{font-size:1.05em}.yx-assistant ul{padding-left:1.25em;list-style:outside}.yx-assistant ol{padding-left:1.25em;list-style:decimal}.yx-assistant li{margin:.2em 0}.yx-assistant blockquote{border-left:2px solid var(--border);color:var(--muted-foreground);padding-left:.75em}.yx-assistant hr{border:0;border-top:1px solid var(--border);margin:.75em 0}.yx-assistant input[type=checkbox]{margin-right:.4em}.yx-live:after{content:"▍";color:var(--accent);animation:1s steps(2,end) infinite yx-blink}@keyframes yx-blink{50%{opacity:0}}@media (prefers-reduced-motion:reduce){.yx-live:after,.animate-spin{animation:none}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
|
package/dist/theme.css
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/* @mlpal/yodex-ui default tokens: the MLpal "Obsidian Intelligence" palette (figma-frontend
|
|
2
|
+
src/styles/globals.css). A host that already defines these variables can skip this file;
|
|
3
|
+
the components read only the variables below, never literal colours. */
|
|
4
|
+
:root {
|
|
5
|
+
--background: #FAFAF8;
|
|
6
|
+
--foreground: #0B0B09;
|
|
7
|
+
--card: #FFFFFF;
|
|
8
|
+
--card-foreground: #0B0B09;
|
|
9
|
+
--popover: #FFFFFF;
|
|
10
|
+
--popover-foreground: #0B0B09;
|
|
11
|
+
--primary: #0B0B09;
|
|
12
|
+
--primary-foreground: #FAFAF8;
|
|
13
|
+
--secondary: #F2F2EF;
|
|
14
|
+
--secondary-foreground: #171714;
|
|
15
|
+
--muted: #F2F2EF;
|
|
16
|
+
--muted-foreground: #55554F;
|
|
17
|
+
--accent: #F59E0B;
|
|
18
|
+
--accent-foreground: #451A03;
|
|
19
|
+
--destructive: #E11D48;
|
|
20
|
+
--destructive-foreground: #FFFFFF;
|
|
21
|
+
--border: #E4E4E0;
|
|
22
|
+
--input: #E4E4E0;
|
|
23
|
+
--input-background: #F2F2EF;
|
|
24
|
+
--ring: #F59E0B;
|
|
25
|
+
--radius: 0.5rem;
|
|
26
|
+
--success: #059669;
|
|
27
|
+
--success-foreground: #FFFFFF;
|
|
28
|
+
--warning: #F59E0B;
|
|
29
|
+
--warning-foreground: #451A03;
|
|
30
|
+
--info: #4F46E5;
|
|
31
|
+
--info-foreground: #FFFFFF;
|
|
32
|
+
}
|
|
33
|
+
.dark {
|
|
34
|
+
--background: #1C1C1A;
|
|
35
|
+
--foreground: #ECECEA;
|
|
36
|
+
--card: #242422;
|
|
37
|
+
--card-foreground: #ECECEA;
|
|
38
|
+
--popover: #242422;
|
|
39
|
+
--popover-foreground: #ECECEA;
|
|
40
|
+
--primary: #F59E0B;
|
|
41
|
+
--primary-foreground: #0B0B09;
|
|
42
|
+
--secondary: #2C2C2A;
|
|
43
|
+
--secondary-foreground: #ECECEA;
|
|
44
|
+
--muted: #2C2C2A;
|
|
45
|
+
--muted-foreground: #9C9C97;
|
|
46
|
+
--accent: #FBBF24;
|
|
47
|
+
--accent-foreground: #451A03;
|
|
48
|
+
--destructive: #FB7185;
|
|
49
|
+
--destructive-foreground: #501313;
|
|
50
|
+
--border: #3A3A36;
|
|
51
|
+
--input: #3A3A36;
|
|
52
|
+
--input-background: #2C2C2A;
|
|
53
|
+
--ring: #FBBF24;
|
|
54
|
+
--success: #34D399;
|
|
55
|
+
--success-foreground: #0B0B09;
|
|
56
|
+
--warning: #FBBF24;
|
|
57
|
+
--warning-foreground: #451A03;
|
|
58
|
+
--info: #A5B4FC;
|
|
59
|
+
--info-foreground: #0B0B09;
|
|
60
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,43 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mlpal/yodex-ui",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "React components and a session hook for yodex frontends: transcript, tool calls, permissions, questions, run status, sessions, composer, over the yodex serve wire protocol.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./styles.css": "./dist/styles.css",
|
|
14
|
+
"./theme.css": "./dist/theme.css",
|
|
15
|
+
"./package.json": "./package.json"
|
|
16
|
+
},
|
|
17
|
+
"main": "./dist/index.js",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"README.md"
|
|
22
|
+
],
|
|
23
|
+
"peerDependencies": {
|
|
24
|
+
"react": "^18.2.0",
|
|
25
|
+
"react-dom": "^18.2.0"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@mlpal/harness-protocol": "^0.10.0",
|
|
29
|
+
"clsx": "^2.1.1",
|
|
30
|
+
"lucide-react": "^0.487.0",
|
|
31
|
+
"react-markdown": "^10.1.0",
|
|
32
|
+
"remark-gfm": "^4.0.1",
|
|
33
|
+
"tailwind-merge": "^3.3.1"
|
|
34
|
+
},
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/mlpalOld/yodex-core.git",
|
|
38
|
+
"directory": "packages/ui"
|
|
39
|
+
},
|
|
40
|
+
"publishConfig": {
|
|
41
|
+
"access": "public"
|
|
42
|
+
}
|
|
43
|
+
}
|