@qilin-agent/client-ui-message-feedback 0.0.0-stage → 3.1.3

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/lib/index.js ADDED
@@ -0,0 +1,11 @@
1
+ //#region lib/types/index.js
2
+ /**
3
+ * Message feedback surface plugin, node half. Pure UI plugin: the empty apply
4
+ * exists so the plugin appears in the host cordis.yml / Loader; the browser
5
+ * half ships via exports["./client"], discovered through the package.json
6
+ * qilin.client declaration.
7
+ */
8
+ /** Host plugin body — no host-side behavior for this surface plugin. */
9
+ function apply() {}
10
+ //#endregion
11
+ export { apply };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The feedback dialog and its acknowledgement and failure toasts, rendered as one entry
3
+ * of `conversation.input.overlay` so each Session owns exactly one of each.
4
+ * The Modal and the Toast both portal to `document.body`; the overlay slot
5
+ * only supplies the per-session controller and the composer card the toast
6
+ * centers over.
7
+ * @module @qilin-agent/client-ui-message-feedback/client/FeedbackDialog
8
+ */
9
+ import type { FeedbackDialogProps } from './slots.ts';
10
+ /**
11
+ * Render one Session's feedback dialog and toast.
12
+ * @param props - the dialog hook, the draft verbs, and the locale seat.
13
+ * @returns the modal while a target is open and either toast while it is showing.
14
+ */
15
+ export declare function FeedbackDialog({ useDialog, edit, submit, dismiss, dismissFailure, dismissToast, t, }: FeedbackDialogProps): import("react").JSX.Element;
16
+ //# sourceMappingURL=FeedbackDialog.d.ts.map
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Per-message feedback controls: the Like/Dislike pair inside the assistant
3
+ * message's IconActions row, between copy and branch. Either rating opens the
4
+ * Session's feedback dialog, whose submission records that judgment with its
5
+ * category and text. Clicking the recorded rating retracts it. A recorded rating
6
+ * shows the filled glyph so the signal survives a pointer leaving the row.
7
+ * @module @qilin-agent/client-ui-message-feedback/client/MessageFeedbackActions
8
+ */
9
+ import type { MessageFeedbackActionProps } from './slots.ts';
10
+ /**
11
+ * One message's feedback controls.
12
+ * @param props - the owner's message identity, the injected verbs, and the
13
+ * shared feedback hook.
14
+ * @returns the rating buttons with any failure notice beside them.
15
+ */
16
+ export declare function MessageFeedbackActions({ messageId, ensure, current, retract, openDialog, useFeedback, t, }: MessageFeedbackActionProps): import("react").JSX.Element;
17
+ //# sourceMappingURL=MessageFeedbackActions.d.ts.map
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Browser-local object layer over one Session's durable message-feedback
3
+ * sidecar. The Host owns per-item compare-and-set: every mutation carries the
4
+ * version this controller last observed, and a `version-conflict` reply carries
5
+ * the authoritative item, so a lost race reconciles from the reply itself
6
+ * instead of refetching the whole Session.
7
+ * @module @qilin-agent/client-ui-message-feedback/client/controller
8
+ */
9
+ import type { HostObservable } from '@qilin-agent/client-ui-slots';
10
+ import type { ClientRemote, MessageId } from '@qilin-agent/api-remotes/client';
11
+ import type { SessionId } from '@qilin-agent/session/types';
12
+ import type { FeedbackRecord } from '@qilin-agent/command-feedback/types';
13
+ import type { MessageFeedbackItem, MessageFeedbackRating } from '@qilin-agent/message-feedback/types';
14
+ /** Load state of the one list read that seeds every per-message control. */
15
+ export type MessageFeedbackStatus = 'cold' | 'loading' | 'ready' | 'error';
16
+ /** Immutable view published to every per-message control in one Session. */
17
+ export interface MessageFeedbackView {
18
+ status: MessageFeedbackStatus;
19
+ /** Current item per message, keyed by the addressed message id. */
20
+ items: ReadonlyMap<MessageId, MessageFeedbackItem>;
21
+ /** Reason the last load failed, cleared by the next successful load. */
22
+ error: string | null;
23
+ }
24
+ /** Rejected branch shared by every settled action. */
25
+ export interface MessageFeedbackActionFailure {
26
+ ok: false;
27
+ error: {
28
+ code: string;
29
+ message: string;
30
+ };
31
+ }
32
+ /** Settled action shape rendered by the message-level controls. */
33
+ export type MessageFeedbackActionResult = {
34
+ ok: true;
35
+ } | MessageFeedbackActionFailure;
36
+ /**
37
+ * Human-readable text for one business failure code.
38
+ * @param code - the Host's business failure code.
39
+ * @returns the developer-facing description carried in the failure branch.
40
+ */
41
+ export declare function describe(code: string): string;
42
+ /**
43
+ * Per-session feedback object layer. One instance backs every per-message
44
+ * control in that Session, so a single list read seeds them all.
45
+ */
46
+ export declare class MessageFeedbackController implements HostObservable<MessageFeedbackView> {
47
+ private readonly remote;
48
+ private readonly sessionId;
49
+ private view;
50
+ private readonly listeners;
51
+ private loadPromise;
52
+ private operationTail;
53
+ private disposed;
54
+ /**
55
+ * @param remote - the messageFeedback Remote namespace.
56
+ * @param sessionId - Session owning every addressed assistant message.
57
+ */
58
+ constructor(remote: ClientRemote['messageFeedback'], sessionId: SessionId);
59
+ /** Return the cached immutable view. */
60
+ getSnapshot: () => MessageFeedbackView;
61
+ /** Subscribe to view replacement. */
62
+ subscribe: (listener: () => void) => (() => void);
63
+ /**
64
+ * Load once; a failed load stays retryable.
65
+ * @returns the settled load result, shared by concurrent callers.
66
+ */
67
+ ensure(): Promise<MessageFeedbackActionResult>;
68
+ /**
69
+ * Re-read the authoritative list, collapsing concurrent callers onto one
70
+ * in-flight read.
71
+ *
72
+ * This is the unserialized read used to seed a cold controller, where no
73
+ * mutation can be in flight yet. A reconnect must use {@link resync} instead:
74
+ * an unserialized list response can otherwise arrive after a newer mutation's
75
+ * reply and overwrite the version that mutation just committed.
76
+ * @returns the settled reload result.
77
+ */
78
+ refresh(): Promise<MessageFeedbackActionResult>;
79
+ /**
80
+ * Re-read the list behind this Session's queued mutations, so a reconnect
81
+ * cannot resurrect a version an in-flight mutation already replaced.
82
+ * @returns the settled reload result.
83
+ */
84
+ resync(): Promise<MessageFeedbackActionResult>;
85
+ /**
86
+ * Create or replace feedback for one message, comparing against the version
87
+ * this controller last observed. The item stores exactly `entry`: an entry
88
+ * without a note or category replaces whatever the stored item carried.
89
+ * @param messageId - target assistant message.
90
+ * @param rating - desired judgment.
91
+ * @param entry - explanation and category to store with the judgment.
92
+ * @returns the settled mutation result.
93
+ */
94
+ rate(messageId: MessageId, rating: MessageFeedbackRating, entry?: FeedbackRecord): Promise<MessageFeedbackActionResult>;
95
+ /**
96
+ * Retract one message's matching committed rating. The serialized operation
97
+ * rechecks the current item and becomes a no-op if another operation already
98
+ * changed or removed it, so a stale retraction can never record a bare rating.
99
+ * @param messageId - target assistant message.
100
+ * @param rating - judgment the human asked to retract.
101
+ * @returns the settled mutation result.
102
+ */
103
+ retract(messageId: MessageId, rating: MessageFeedbackRating): Promise<MessageFeedbackActionResult>;
104
+ /** Commit one put against the observed version and reconcile a conflict. */
105
+ private putCommitted;
106
+ /** Commit one delete against the observed version and reconcile a conflict. */
107
+ private deleteCommitted;
108
+ /** Drop subscribers and refuse further work when the owning fiber unloads. */
109
+ dispose(): void;
110
+ /** Fetch the whole sidecar and publish it as the seeded view. */
111
+ private load;
112
+ /**
113
+ * Serialize one mutation behind this Session's prior mutation so queued
114
+ * operations always compare against the committed version.
115
+ */
116
+ private mutate;
117
+ /**
118
+ * Replace one message's entry, keeping every other entry's identity. Only a
119
+ * `mutate` operation reaches this, and `mutate` refuses admission once the
120
+ * controller is disposed, so no disposal guard belongs here; `publish` is
121
+ * the single place that stops notifying after listeners are dropped.
122
+ */
123
+ private commit;
124
+ /** Replace the view and contain subscriber failures at the observable boundary. */
125
+ private publish;
126
+ }
127
+ //# sourceMappingURL=controller.d.ts.map
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Headless state of one Session's feedback dialog and its acknowledgement and
3
+ * failure toasts. One form serves two targets: the Session itself (a bare `/feedback`)
4
+ * and one assistant message (Like or Dislike). The overlay view renders from
5
+ * the store and raises the acknowledgement after a successful submission.
6
+ * @module @qilin-agent/client-ui-message-feedback/client/dialog
7
+ */
8
+ import { type SnapshotStore } from '@qilin-agent/client-store';
9
+ import type { MessageId } from '@qilin-agent/api-remotes/client';
10
+ import type { FeedbackCategory, FeedbackRecord } from '@qilin-agent/command-feedback/types';
11
+ import type { MessageFeedbackRating } from '@qilin-agent/message-feedback/types';
12
+ import type { MessageFeedbackActionResult } from './controller.ts';
13
+ /** What one open dialog submits to. */
14
+ export type FeedbackDialogTarget = {
15
+ readonly kind: 'session';
16
+ } | {
17
+ readonly kind: 'message';
18
+ readonly messageId: MessageId;
19
+ readonly rating: MessageFeedbackRating;
20
+ };
21
+ /** Dialog and toast state the overlay view renders from. */
22
+ export interface FeedbackDialogState {
23
+ /** Target the dialog is open for; null while closed. */
24
+ readonly target: FeedbackDialogTarget | null;
25
+ readonly category: FeedbackCategory | null;
26
+ readonly text: string;
27
+ /** A submission is in flight; the form ignores edits and submits until it settles. */
28
+ readonly submitting: boolean;
29
+ /** Failure code of the last submission from this open; null when none. */
30
+ readonly failure: string | null;
31
+ /** Sequence of the acknowledgement toast on screen; 0 while none. */
32
+ readonly toast: number;
33
+ }
34
+ /**
35
+ * Record one submission against its target.
36
+ * @param target - the open target.
37
+ * @param entry - the trimmed text and the category, each present only when given.
38
+ */
39
+ export type FeedbackSubmit = (target: FeedbackDialogTarget, entry: FeedbackRecord) => Promise<MessageFeedbackActionResult>;
40
+ /** Per-session dialog controller; one instance backs the overlay entry and every message control. */
41
+ export declare class FeedbackDialogController {
42
+ private readonly submit;
43
+ /** Dialog state store (the overlay entry subscribes here). */
44
+ readonly state: SnapshotStore<FeedbackDialogState>;
45
+ /** Bumped by every open, dismiss, and dispose so a late settlement can tell its draft is gone. */
46
+ private generation;
47
+ private toastSeq;
48
+ /**
49
+ * @param submit - records one submission; the owner routes it by target.
50
+ */
51
+ constructor(submit: FeedbackSubmit);
52
+ /**
53
+ * Open the dialog with an empty draft, replacing any open draft.
54
+ * @param target - what the submission records against.
55
+ */
56
+ open(target: FeedbackDialogTarget): void;
57
+ /** Close the dialog and discard the draft; a toast on screen stays. */
58
+ dismiss(): void;
59
+ /**
60
+ * Replace part of the draft while it is editable.
61
+ * @param draft - the category (null clears it) or the text as typed.
62
+ */
63
+ edit(draft: Partial<Pick<FeedbackDialogState, 'category' | 'text'>>): void;
64
+ /**
65
+ * Submit the draft; an empty draft is a valid submission. Success closes the
66
+ * dialog and raises the acknowledgement toast; a failure keeps the dialog
67
+ * open and publishes its code for the failure toast.
68
+ * @returns after the submission settles.
69
+ */
70
+ submitDraft(): Promise<void>;
71
+ /** Clear the current failure toast without closing its draft. */
72
+ dismissFailure(): void;
73
+ /** Show the acknowledgement toast; a toast already on screen restarts. */
74
+ private acknowledge;
75
+ /**
76
+ * Retire one toast after its fade; a newer toast is left alone.
77
+ * @param seq - the toast sequence the view finished showing.
78
+ */
79
+ dismissToast(seq: number): void;
80
+ /** Scope-teardown disposer: drop the draft and the toast, orphan in-flight work. */
81
+ dispose(): void;
82
+ }
83
+ //# sourceMappingURL=dialog.d.ts.map
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Feedback surface plugin, browser half: the Like/Dislike entry in the
3
+ * conversation.chat.assistant-actions strip, the feedback dialog and its
4
+ * acknowledgement and failure toasts in conversation.input.overlay, and the `/feedback`
5
+ * decoration that opens the dialog from the composer menu or a bare typed
6
+ * command. One FeedbackSurface per Session backs every entry in that Session.
7
+ * @module @qilin-agent/client-ui-message-feedback/client
8
+ */
9
+ import type { Context as ClientContext } from '@qilin-agent/kylin';
10
+ export type { MessageFeedbackActionFailure, MessageFeedbackActionResult, MessageFeedbackStatus, MessageFeedbackView, } from './controller.ts';
11
+ export type { FeedbackDialogState, FeedbackDialogTarget, FeedbackSubmit } from './dialog.ts';
12
+ export type { FeedbackDialogInjected, FeedbackDialogProps, MessageFeedbackActionProps, MessageFeedbackInjected, } from './slots.ts';
13
+ export type { MessageFeedbackKey } from './locales.ts';
14
+ /** Required services: the slot registry, the two Remote namespaces, and the copy. */
15
+ export declare const inject: string[];
16
+ /**
17
+ * Client plugin body: the per-message feedback entry, the Session's dialog
18
+ * entry, the `/feedback` decoration, and their per-session surfaces.
19
+ * @param ctx - client root context.
20
+ */
21
+ export declare function apply(ctx: ClientContext): void;
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,56 @@
1
+ /** `feedback` namespace dictionaries. */
2
+ /** Simplified Chinese dictionary (the key-set source of truth). */
3
+ export declare const zh: {
4
+ 'action.like': string;
5
+ 'action.likeActive': string;
6
+ 'action.dislike': string;
7
+ 'action.dislikeActive': string;
8
+ 'dialog.title': string;
9
+ 'dialog.categories': string;
10
+ 'dialog.detail': string;
11
+ 'dialog.hint': string;
12
+ 'category.task-result': string;
13
+ 'category.instruction-following': string;
14
+ 'category.product-interaction': string;
15
+ 'category.service-stability': string;
16
+ 'category.resource-cost': string;
17
+ 'category.security-privacy-permission': string;
18
+ 'category.other': string;
19
+ 'toast.recorded': string;
20
+ 'error.conflict': string;
21
+ 'error.load': string;
22
+ 'error.generic': string;
23
+ 'error.noteTooLarge': string;
24
+ };
25
+ /** The feedback namespace key union. */
26
+ export type MessageFeedbackKey = keyof typeof zh;
27
+ declare module '@qilin-agent/client-ui-slots' {
28
+ interface LocaleNamespaceMap {
29
+ /** The feedback surface's copy: the message controls, the dialog, and the acknowledgement. */
30
+ feedback: MessageFeedbackKey;
31
+ }
32
+ }
33
+ /** English dictionary, checked complete against the zh key set. */
34
+ export declare const en: {
35
+ 'action.like': string;
36
+ 'action.likeActive': string;
37
+ 'action.dislike': string;
38
+ 'action.dislikeActive': string;
39
+ 'dialog.title': string;
40
+ 'dialog.categories': string;
41
+ 'dialog.detail': string;
42
+ 'dialog.hint': string;
43
+ 'category.task-result': string;
44
+ 'category.instruction-following': string;
45
+ 'category.product-interaction': string;
46
+ 'category.service-stability': string;
47
+ 'category.resource-cost': string;
48
+ 'category.security-privacy-permission': string;
49
+ 'category.other': string;
50
+ 'toast.recorded': string;
51
+ 'error.conflict': string;
52
+ 'error.load': string;
53
+ 'error.generic': string;
54
+ 'error.noteTooLarge': string;
55
+ };
56
+ //# sourceMappingURL=locales.d.ts.map
@@ -0,0 +1,70 @@
1
+ /**
2
+ * The injected faces of this package's two entries. The
3
+ * 'conversation.chat.assistant-actions' and 'conversation.input.overlay'
4
+ * slots are declared and typed by ui-chat and ui-conversation; this package
5
+ * only contributes entries, so no SlotMap merge lives here. Live state
6
+ * arrives through the `hooks` compartment (the framework standard kit binds
7
+ * `feedback` into `useFeedback` and `dialog` into `useDialog`).
8
+ * @module @qilin-agent/client-ui-message-feedback/client/slots
9
+ */
10
+ import type { HostObservable, InjectFace, PropsLocale, PropsRuntime } from '@qilin-agent/client-ui-slots';
11
+ import type { MessageId } from '@qilin-agent/api-remotes/client';
12
+ import type { MessageFeedbackItem, MessageFeedbackRating } from '@qilin-agent/message-feedback/types';
13
+ import type { MessageFeedbackActionResult, MessageFeedbackView } from './controller.ts';
14
+ import type { FeedbackDialogState } from './dialog.ts';
15
+ /** Injected business face of one assistant-message feedback entry. */
16
+ export interface MessageFeedbackInjected {
17
+ hooks: {
18
+ /** The owning Session's feedback view, shared by every message control. */
19
+ feedback: HostObservable<MessageFeedbackView>;
20
+ };
21
+ /** Load the Session's feedback once, on first interaction. */
22
+ ensure: () => Promise<MessageFeedbackActionResult>;
23
+ /**
24
+ * The committed item as this Session's controller last observed it.
25
+ * @param messageId - target assistant message.
26
+ */
27
+ current: (messageId: MessageId) => MessageFeedbackItem | undefined;
28
+ /**
29
+ * Retract the requested judgment only while the committed rating still
30
+ * matches; a concurrent change makes the serialized operation a no-op.
31
+ * @param messageId - target assistant message.
32
+ * @param rating - judgment the human asked to retract.
33
+ */
34
+ retract: (messageId: MessageId, rating: MessageFeedbackRating) => Promise<MessageFeedbackActionResult>;
35
+ /**
36
+ * Open the Session's feedback dialog for one message and judgment; its
37
+ * submission records that rating with the dialog's category and text.
38
+ * @param messageId - target assistant message.
39
+ * @param rating - judgment to record on submission.
40
+ */
41
+ openDialog: (messageId: MessageId, rating: MessageFeedbackRating) => void;
42
+ }
43
+ /** Full props of one assistant-message feedback entry. */
44
+ export type MessageFeedbackActionProps = PropsRuntime<'conversation.chat.assistant-actions'> & InjectFace<MessageFeedbackInjected> & PropsLocale<'feedback'>;
45
+ /** Injected business face of the Session's feedback dialog entry. */
46
+ export interface FeedbackDialogInjected {
47
+ hooks: {
48
+ /** The Session's dialog and toast state. */
49
+ dialog: HostObservable<FeedbackDialogState>;
50
+ };
51
+ /**
52
+ * Replace part of the draft: the category (null clears it) or the text.
53
+ * @param draft - the members to replace.
54
+ */
55
+ edit: (draft: Partial<Pick<FeedbackDialogState, 'category' | 'text'>>) => void;
56
+ /** Submit the draft to the open target. */
57
+ submit: () => Promise<void>;
58
+ /** Close the dialog and discard the draft. */
59
+ dismiss: () => void;
60
+ /** Retire the current submission-failure toast without closing its draft. */
61
+ dismissFailure: () => void;
62
+ /**
63
+ * Retire the toast the view finished showing.
64
+ * @param seq - the toast sequence.
65
+ */
66
+ dismissToast: (seq: number) => void;
67
+ }
68
+ /** Full props of the feedback dialog overlay entry. */
69
+ export type FeedbackDialogProps = InjectFace<FeedbackDialogInjected> & PropsLocale<'feedback'>;
70
+ //# sourceMappingURL=slots.d.ts.map
@@ -0,0 +1,30 @@
1
+ /**
2
+ * One Session's feedback surface: the message-feedback object layer and the
3
+ * dialog controller, plus the routing between them. A message target puts a
4
+ * selected judgment through the message controller; the Session target records
5
+ * through the `sessionFeedback` Remote.
6
+ * @module @qilin-agent/client-ui-message-feedback/client/surface
7
+ */
8
+ import type { Context as ClientContext } from '@qilin-agent/kylin';
9
+ import type { SessionId } from '@qilin-agent/session/types';
10
+ import { MessageFeedbackController } from './controller.ts';
11
+ import { FeedbackDialogController } from './dialog.ts';
12
+ /** The per-session pair behind every entry of one Session. */
13
+ export declare class FeedbackSurface {
14
+ private readonly ctx;
15
+ private readonly sessionId;
16
+ /** The Session's message-feedback object layer, shared by every message control. */
17
+ readonly feedback: MessageFeedbackController;
18
+ /** The Session's dialog and toast state, shared by the overlay entry and the message controls. */
19
+ readonly dialog: FeedbackDialogController;
20
+ /**
21
+ * @param ctx - the browser plugin context carrying both feedback Remotes.
22
+ * @param sessionId - Session owning the transcript and the remark.
23
+ */
24
+ constructor(ctx: ClientContext, sessionId: SessionId);
25
+ /** Record one Session-level remark through the sessionFeedback Remote. */
26
+ private recordSession;
27
+ /** Drop both controllers when the owning fiber unloads. */
28
+ dispose(): void;
29
+ }
30
+ //# sourceMappingURL=surface.d.ts.map
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Message feedback surface plugin, node half. Pure UI plugin: the empty apply
3
+ * exists so the plugin appears in the host cordis.yml / Loader; the browser
4
+ * half ships via exports["./client"], discovered through the package.json
5
+ * qilin.client declaration.
6
+ */
7
+ /** Host plugin body — no host-side behavior for this surface plugin. */
8
+ export declare function apply(): void;
9
+ //# sourceMappingURL=index.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,81 @@
1
1
  {
2
2
  "name": "@qilin-agent/client-ui-message-feedback",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "description": "The Web feedback surface: per-message Like/Dislike in the assistant-message action strip and the feedback dialog behind both ratings and /feedback, backed by the messageFeedback and sessionFeedback Host Remotes",
4
+ "version": "3.1.3",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/kkutysllb/QiLin.git",
11
+ "directory": "packages/client/ui-message-feedback"
12
+ },
13
+ "engines": {
14
+ "node": "^22.19.0 || >=24.0.0"
15
+ },
16
+ "type": "module",
17
+ "main": "lib/index.js",
18
+ "types": "lib/types/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./lib/types/index.d.ts",
22
+ "default": "./lib/index.js"
23
+ },
24
+ "./client": {
25
+ "types": "./lib/types/client/index.d.ts",
26
+ "default": "./lib/client.js"
27
+ },
28
+ "./src/*": "./src/*",
29
+ "./package.json": "./package.json"
30
+ },
31
+ "qilin": {
32
+ "client": {
33
+ "inject": [
34
+ "@qilin-agent/api-remotes",
35
+ "@qilin-agent/client-locale",
36
+ "@qilin-agent/client-ui-conversation",
37
+ "@qilin-agent/client-ui-renderer",
38
+ "@qilin-agent/client-ui-commands"
39
+ ],
40
+ "platform": "web"
41
+ }
42
+ },
43
+ "license": "MIT",
44
+ "peerDependencies": {
45
+ "@qilin-agent/kylin": "~4.0.3"
46
+ },
47
+ "devDependencies": {
48
+ "@testing-library/react": "^16.1.0",
49
+ "@types/react": "~18.3.1",
50
+ "@types/react-dom": "~18.3.0",
51
+ "react": "^18.2.0",
52
+ "react-dom": "^18.2.0",
53
+ "@qilin-agent/client-locale": "3.1.3",
54
+ "@qilin-agent/client-test-runtime": "3.1.3",
55
+ "@qilin-agent/client-ui-primitives": "3.1.3",
56
+ "@qilin-agent/api-remotes": "3.1.3",
57
+ "@qilin-agent/client-ui-conversation": "3.1.3",
58
+ "@qilin-agent/client-connection": "3.1.3",
59
+ "@qilin-agent/client-ui-slots": "3.1.3",
60
+ "@qilin-agent/message-feedback": "3.1.3",
61
+ "@qilin-agent/remote-mock": "3.1.3",
62
+ "@qilin-agent/session": "3.1.3",
63
+ "@qilin-agent/client-ui-renderer": "3.1.3",
64
+ "@qilin-agent/kylin": "~4.0.3",
65
+ "@qilin-agent/typert-protocol": "3.1.3",
66
+ "@qilin-agent/client-ui-chat": "3.1.3",
67
+ "@qilin-agent/client-ui-session": "3.1.3",
68
+ "@qilin-agent/client-ui-commands": "3.1.3",
69
+ "@qilin-agent/command-feedback": "3.1.3",
70
+ "@qilin-agent/client-store": "3.1.3"
71
+ },
72
+ "files": [
73
+ "lib/index.js",
74
+ "lib/client.js",
75
+ "lib/types/**/*.d.ts"
76
+ ],
77
+ "scripts": {
78
+ "bundle": "tsdown",
79
+ "watch": "tsdown --watch"
80
+ }
6
81
  }