@kilnai/react 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/api-client.d.ts +8 -0
  2. package/dist/api-client.d.ts.map +1 -0
  3. package/dist/api-client.js +31 -0
  4. package/dist/api-client.js.map +1 -0
  5. package/dist/build-user-message.d.ts +5 -0
  6. package/dist/build-user-message.d.ts.map +1 -0
  7. package/dist/build-user-message.js +12 -0
  8. package/dist/build-user-message.js.map +1 -0
  9. package/dist/index.d.ts +16 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +12 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/provider.d.ts +15 -0
  14. package/dist/provider.d.ts.map +1 -0
  15. package/dist/provider.js +16 -0
  16. package/dist/provider.js.map +1 -0
  17. package/dist/sse-client.d.ts +17 -0
  18. package/dist/sse-client.d.ts.map +1 -0
  19. package/dist/sse-client.js +62 -0
  20. package/dist/sse-client.js.map +1 -0
  21. package/dist/types.d.ts +86 -0
  22. package/dist/types.d.ts.map +1 -0
  23. package/dist/types.js +2 -0
  24. package/dist/types.js.map +1 -0
  25. package/dist/use-approval.d.ts +8 -0
  26. package/dist/use-approval.d.ts.map +1 -0
  27. package/dist/use-approval.js +35 -0
  28. package/dist/use-approval.js.map +1 -0
  29. package/dist/use-kiln-chat.d.ts +3 -0
  30. package/dist/use-kiln-chat.d.ts.map +1 -0
  31. package/dist/use-kiln-chat.js +49 -0
  32. package/dist/use-kiln-chat.js.map +1 -0
  33. package/dist/use-kiln-events.d.ts +3 -0
  34. package/dist/use-kiln-events.d.ts.map +1 -0
  35. package/dist/use-kiln-events.js +37 -0
  36. package/dist/use-kiln-events.js.map +1 -0
  37. package/dist/use-kiln-memory.d.ts +6 -0
  38. package/dist/use-kiln-memory.d.ts.map +1 -0
  39. package/dist/use-kiln-memory.js +47 -0
  40. package/dist/use-kiln-memory.js.map +1 -0
  41. package/dist/use-kiln-state.d.ts +7 -0
  42. package/dist/use-kiln-state.d.ts.map +1 -0
  43. package/dist/use-kiln-state.js +36 -0
  44. package/dist/use-kiln-state.js.map +1 -0
  45. package/dist/use-kiln-ws-chat.d.ts +3 -0
  46. package/dist/use-kiln-ws-chat.d.ts.map +1 -0
  47. package/dist/use-kiln-ws-chat.js +72 -0
  48. package/dist/use-kiln-ws-chat.js.map +1 -0
  49. package/package.json +38 -0
@@ -0,0 +1,8 @@
1
+ export declare class ApiClient {
2
+ private readonly baseUrl;
3
+ constructor(baseUrl: string);
4
+ get<T>(path: string): Promise<T>;
5
+ post<T>(path: string, body?: unknown): Promise<T>;
6
+ delete(path: string): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,MAAM;IAEtC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAQhC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAYjD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAM1C"}
@@ -0,0 +1,31 @@
1
+ export class ApiClient {
2
+ baseUrl;
3
+ constructor(baseUrl) {
4
+ this.baseUrl = baseUrl;
5
+ }
6
+ async get(path) {
7
+ const res = await fetch(`${this.baseUrl}${path}`);
8
+ if (!res.ok) {
9
+ throw new Error(`GET ${path} failed: ${res.status} ${res.statusText}`);
10
+ }
11
+ return res.json();
12
+ }
13
+ async post(path, body) {
14
+ const res = await fetch(`${this.baseUrl}${path}`, {
15
+ method: "POST",
16
+ headers: body !== undefined ? { "Content-Type": "application/json" } : {},
17
+ body: body !== undefined ? JSON.stringify(body) : undefined,
18
+ });
19
+ if (!res.ok) {
20
+ throw new Error(`POST ${path} failed: ${res.status} ${res.statusText}`);
21
+ }
22
+ return res.json();
23
+ }
24
+ async delete(path) {
25
+ const res = await fetch(`${this.baseUrl}${path}`, { method: "DELETE" });
26
+ if (!res.ok) {
27
+ throw new Error(`DELETE ${path} failed: ${res.status} ${res.statusText}`);
28
+ }
29
+ }
30
+ }
31
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAS;IACS;IAA7B,YAA6B,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;IAAG,CAAC;IAEhD,KAAK,CAAC,GAAG,CAAI,IAAY;QACvB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,YAAY,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,IAAI,CAAI,IAAY,EAAE,IAAc;QACxC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YAChD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE;YACzE,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,YAAY,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,YAAY,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import type { ContentPart } from "@kilnai/core";
2
+ import type { ChatMessage } from "./types.js";
3
+ /** Build a ChatMessage from user input (string or multimodal ContentPart[]). */
4
+ export declare function buildUserMessage(content: string | ContentPart[], id: string): ChatMessage;
5
+ //# sourceMappingURL=build-user-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-user-message.d.ts","sourceRoot":"","sources":["../src/build-user-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,WAAW,CASzF"}
@@ -0,0 +1,12 @@
1
+ /** Build a ChatMessage from user input (string or multimodal ContentPart[]). */
2
+ export function buildUserMessage(content, id) {
3
+ const isText = typeof content === "string";
4
+ return {
5
+ id,
6
+ role: "user",
7
+ content: isText ? content : "",
8
+ parts: isText ? undefined : content,
9
+ timestamp: Date.now(),
10
+ };
11
+ }
12
+ //# sourceMappingURL=build-user-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-user-message.js","sourceRoot":"","sources":["../src/build-user-message.ts"],"names":[],"mappings":"AAGA,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAAC,OAA+B,EAAE,EAAU;IAC1E,MAAM,MAAM,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC;IAC3C,OAAO;QACL,EAAE;QACF,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAC9B,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;QACnC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ export { KilnProvider } from "./provider.js";
2
+ /** @internal Exposes raw ApiClient -- intended for dev tooling (e.g. Studio), not public consumers. */
3
+ export { useKilnContext } from "./provider.js";
4
+ export type { KilnProviderProps } from "./provider.js";
5
+ export { useApproval } from "./use-approval.js";
6
+ export type { UseApprovalReturn } from "./use-approval.js";
7
+ export { useKilnChat } from "./use-kiln-chat.js";
8
+ export { useKilnWsChat } from "./use-kiln-ws-chat.js";
9
+ export { useKilnEvents } from "./use-kiln-events.js";
10
+ export { useKilnMemory } from "./use-kiln-memory.js";
11
+ export { useKilnState } from "./use-kiln-state.js";
12
+ export { ApiClient } from "./api-client.js";
13
+ export { SseClient } from "./sse-client.js";
14
+ export type { SseCallbacks } from "./sse-client.js";
15
+ export type { KilnConfig, ChatMessage, ChatOptions, UseChatReturn, UseEventsReturn, UseMemoryReturn, UseStateReturn, MemoryEntry, CreateMemoryInput, KilnEventData, WsChatRequest, WsChatFrame, } from "./types.js";
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,uGAAuG;AACvG,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,YAAY,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,eAAe,EACf,eAAe,EACf,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,WAAW,GACZ,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ export { KilnProvider } from "./provider.js";
2
+ /** @internal Exposes raw ApiClient -- intended for dev tooling (e.g. Studio), not public consumers. */
3
+ export { useKilnContext } from "./provider.js";
4
+ export { useApproval } from "./use-approval.js";
5
+ export { useKilnChat } from "./use-kiln-chat.js";
6
+ export { useKilnWsChat } from "./use-kiln-ws-chat.js";
7
+ export { useKilnEvents } from "./use-kiln-events.js";
8
+ export { useKilnMemory } from "./use-kiln-memory.js";
9
+ export { useKilnState } from "./use-kiln-state.js";
10
+ export { ApiClient } from "./api-client.js";
11
+ export { SseClient } from "./sse-client.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,uGAAuG;AACvG,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type ReactNode } from "react";
2
+ import { ApiClient } from "./api-client.js";
3
+ import type { KilnConfig } from "./types.js";
4
+ interface KilnContextValue {
5
+ readonly config: KilnConfig;
6
+ readonly client: ApiClient;
7
+ }
8
+ export interface KilnProviderProps {
9
+ readonly config: KilnConfig;
10
+ readonly children: ReactNode;
11
+ }
12
+ export declare function KilnProvider({ config, children }: KilnProviderProps): ReactNode;
13
+ export declare function useKilnContext(): KilnContextValue;
14
+ export {};
15
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,UAAU,gBAAgB;IACxB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;CAC5B;AAID,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,iBAAiB,GAAG,SAAS,CAO/E;AAED,wBAAgB,cAAc,IAAI,gBAAgB,CAMjD"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useMemo } from "react";
3
+ import { ApiClient } from "./api-client.js";
4
+ const KilnContext = createContext(null);
5
+ export function KilnProvider({ config, children }) {
6
+ const value = useMemo(() => ({ config, client: new ApiClient(config.baseUrl) }), [config.baseUrl, config.appName, config.userId, config.reconnectDelayMs]);
7
+ return _jsx(KilnContext, { value: value, children: children });
8
+ }
9
+ export function useKilnContext() {
10
+ const ctx = useContext(KilnContext);
11
+ if (!ctx) {
12
+ throw new Error("useKilnContext must be used within a KilnProvider");
13
+ }
14
+ return ctx;
15
+ }
16
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAkB,MAAM,OAAO,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQ5C,MAAM,WAAW,GAAG,aAAa,CAA0B,IAAI,CAAC,CAAC;AAOjE,MAAM,UAAU,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAqB;IAClE,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EACzD,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,gBAAgB,CAAC,CACzE,CAAC;IAEF,OAAO,KAAC,WAAW,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAe,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { KilnEventData } from "./types.js";
2
+ export interface SseCallbacks {
3
+ onEvent(event: KilnEventData): void;
4
+ onConnect(): void;
5
+ onDisconnect(): void;
6
+ }
7
+ export declare class SseClient {
8
+ private readonly url;
9
+ private readonly callbacks;
10
+ private source;
11
+ private reconnectTimer;
12
+ private readonly reconnectDelay;
13
+ constructor(url: string, callbacks: SseCallbacks, reconnectDelayMs?: number);
14
+ connect(): void;
15
+ disconnect(): void;
16
+ }
17
+ //# sourceMappingURL=sse-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-client.d.ts","sourceRoot":"","sources":["../src/sse-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAchD,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,SAAS,IAAI,IAAI,CAAC;IAClB,YAAY,IAAI,IAAI,CAAC;CACtB;AAID,qBAAa,SAAS;IAMlB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAN5B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAGrB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,YAAY,EACxC,gBAAgB,CAAC,EAAE,MAAM;IAK3B,OAAO,IAAI,IAAI;IA8Bf,UAAU,IAAI,IAAI;CAWnB"}
@@ -0,0 +1,62 @@
1
+ // All named event types emitted by the /dev/events SSE endpoint.
2
+ // Must stay in sync with EventType in @kilnai/core events/index.ts.
3
+ const SSE_EVENT_TYPES = [
4
+ "phase_changed", "task_started", "task_completed", "tool_called", "tool_result",
5
+ "thinking", "verification_result", "cost_update", "memory_saved", "memory_recalled",
6
+ "memory_sync", "approval_requested", "approval_received", "worker_assigned", "error",
7
+ "trace_span", "handoff_requested", "handoff_completed", "interrupt_requested", "interrupt_resumed",
8
+ "injection_scanned", "guardian_reviewed", "audit_entry", "tenant_isolation_violation", "security_alert",
9
+ "webhook_received", "trigger_fired", "trigger_failed", "schedule_fired",
10
+ "pii_detected", "content_classified", "policy_evaluated",
11
+ ];
12
+ const DEFAULT_RECONNECT_DELAY_MS = 3000;
13
+ export class SseClient {
14
+ url;
15
+ callbacks;
16
+ source = null;
17
+ reconnectTimer = null;
18
+ reconnectDelay;
19
+ constructor(url, callbacks, reconnectDelayMs) {
20
+ this.url = url;
21
+ this.callbacks = callbacks;
22
+ this.reconnectDelay = reconnectDelayMs ?? DEFAULT_RECONNECT_DELAY_MS;
23
+ }
24
+ connect() {
25
+ if (this.source)
26
+ return;
27
+ this.source = new EventSource(this.url);
28
+ this.source.onopen = () => {
29
+ this.callbacks.onConnect();
30
+ };
31
+ // Named events (event: <type>\ndata: ...) require addEventListener.
32
+ // onmessage only fires for unnamed events (bare data: lines).
33
+ const handleEvent = (e) => {
34
+ try {
35
+ const data = JSON.parse(e.data);
36
+ this.callbacks.onEvent(data);
37
+ }
38
+ catch {
39
+ // Ignore malformed events
40
+ }
41
+ };
42
+ for (const type of SSE_EVENT_TYPES) {
43
+ this.source.addEventListener(type, handleEvent);
44
+ }
45
+ this.source.onerror = () => {
46
+ this.disconnect();
47
+ this.reconnectTimer = setTimeout(() => this.connect(), this.reconnectDelay);
48
+ };
49
+ }
50
+ disconnect() {
51
+ if (this.reconnectTimer) {
52
+ clearTimeout(this.reconnectTimer);
53
+ this.reconnectTimer = null;
54
+ }
55
+ if (this.source) {
56
+ this.source.close();
57
+ this.source = null;
58
+ this.callbacks.onDisconnect();
59
+ }
60
+ }
61
+ }
62
+ //# sourceMappingURL=sse-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-client.js","sourceRoot":"","sources":["../src/sse-client.ts"],"names":[],"mappings":"AAEA,iEAAiE;AACjE,oEAAoE;AACpE,MAAM,eAAe,GAAG;IACtB,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa;IAC/E,UAAU,EAAE,qBAAqB,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB;IACnF,aAAa,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,OAAO;IACpF,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,mBAAmB;IAClG,mBAAmB,EAAE,mBAAmB,EAAE,aAAa,EAAE,4BAA4B,EAAE,gBAAgB;IACvG,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB;IACvE,cAAc,EAAE,oBAAoB,EAAE,kBAAkB;CAChD,CAAC;AAQX,MAAM,0BAA0B,GAAG,IAAI,CAAC;AAExC,MAAM,OAAO,SAAS;IAMD;IACA;IANX,MAAM,GAAuB,IAAI,CAAC;IAClC,cAAc,GAAyC,IAAI,CAAC;IACnD,cAAc,CAAS;IAExC,YACmB,GAAW,EACX,SAAuB,EACxC,gBAAyB;QAFR,QAAG,GAAH,GAAG,CAAQ;QACX,cAAS,GAAT,SAAS,CAAc;QAGxC,IAAI,CAAC,cAAc,GAAG,gBAAgB,IAAI,0BAA0B,CAAC;IACvE,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QAExB,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE;YACxB,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QAC7B,CAAC,CAAC;QAEF,oEAAoE;QACpE,8DAA8D;QAC9D,MAAM,WAAW,GAAG,CAAC,CAAe,EAAE,EAAE;YACtC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAc,CAAkB,CAAC;gBAC3D,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;YAC5B,CAAC;QACH,CAAC,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE;YACzB,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9E,CAAC,CAAC;IACJ,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,86 @@
1
+ import type { ContentPart } from "@kilnai/core";
2
+ export interface KilnConfig {
3
+ readonly baseUrl: string;
4
+ readonly appName?: string;
5
+ readonly userId?: string;
6
+ /** SSE reconnect delay in milliseconds (default: 3000) */
7
+ readonly reconnectDelayMs?: number;
8
+ }
9
+ export interface ChatMessage {
10
+ readonly id: string;
11
+ readonly role: "user" | "assistant";
12
+ readonly content: string;
13
+ readonly parts?: readonly ContentPart[];
14
+ readonly timestamp: number;
15
+ }
16
+ export interface ChatOptions {
17
+ readonly appName?: string;
18
+ readonly sessionId?: string;
19
+ }
20
+ export interface UseChatReturn {
21
+ readonly messages: readonly ChatMessage[];
22
+ send(content: string | ContentPart[]): Promise<void>;
23
+ readonly isLoading: boolean;
24
+ readonly error: Error | null;
25
+ clearMessages(): void;
26
+ }
27
+ export interface UseEventsReturn {
28
+ readonly events: readonly KilnEventData[];
29
+ readonly connected: boolean;
30
+ clear(): void;
31
+ }
32
+ export interface UseMemoryReturn {
33
+ readonly entries: readonly MemoryEntry[];
34
+ readonly isLoading: boolean;
35
+ readonly error: Error | null;
36
+ refresh(): Promise<void>;
37
+ create(entry: CreateMemoryInput): Promise<void>;
38
+ remove(id: string): Promise<void>;
39
+ }
40
+ export interface UseStateReturn {
41
+ readonly state: Record<string, unknown>;
42
+ readonly cost: Record<string, unknown>;
43
+ readonly apps: readonly string[];
44
+ readonly isLoading: boolean;
45
+ readonly error: Error | null;
46
+ refresh(): Promise<void>;
47
+ }
48
+ export interface MemoryEntry {
49
+ readonly id: string;
50
+ readonly scope: string;
51
+ readonly content: string;
52
+ readonly tags?: readonly string[];
53
+ readonly metadata?: Record<string, unknown>;
54
+ }
55
+ export interface CreateMemoryInput {
56
+ readonly scope: string;
57
+ readonly content: string;
58
+ readonly tags?: readonly string[];
59
+ readonly metadata?: Record<string, unknown>;
60
+ }
61
+ export interface KilnEventData {
62
+ readonly type: string;
63
+ readonly timestamp: string;
64
+ readonly data: Record<string, unknown>;
65
+ }
66
+ /** WebSocket chat request frame (client -> server) */
67
+ export interface WsChatRequest {
68
+ readonly type: "message";
69
+ readonly content: string;
70
+ readonly parts?: readonly ContentPart[];
71
+ }
72
+ /** WebSocket chat response frame (server -> client) */
73
+ export type WsChatFrame = {
74
+ readonly type: "chunk";
75
+ readonly content: string;
76
+ } | {
77
+ readonly type: "done";
78
+ readonly content: string;
79
+ readonly parts?: readonly ContentPart[];
80
+ readonly inputTokens: number;
81
+ readonly outputTokens: number;
82
+ } | {
83
+ readonly type: "error";
84
+ readonly message: string;
85
+ };
86
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ export interface UseApprovalReturn {
2
+ readonly approve: (sessionId?: string) => Promise<void>;
3
+ readonly reject: (reason: string, sessionId?: string) => Promise<void>;
4
+ readonly isLoading: boolean;
5
+ readonly error: Error | null;
6
+ }
7
+ export declare function useApproval(): UseApprovalReturn;
8
+ //# sourceMappingURL=use-approval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-approval.d.ts","sourceRoot":"","sources":["../src/use-approval.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CAC9B;AAED,wBAAgB,WAAW,IAAI,iBAAiB,CAoC/C"}
@@ -0,0 +1,35 @@
1
+ import { useCallback, useState } from "react";
2
+ import { useKilnContext } from "./provider.js";
3
+ export function useApproval() {
4
+ const { client } = useKilnContext();
5
+ const [isLoading, setIsLoading] = useState(false);
6
+ const [error, setError] = useState(null);
7
+ const approve = useCallback(async (sessionId) => {
8
+ setIsLoading(true);
9
+ setError(null);
10
+ try {
11
+ await client.post("/dev/approve", sessionId !== undefined ? { sessionId } : {});
12
+ }
13
+ catch (e) {
14
+ setError(e instanceof Error ? e : new Error(String(e)));
15
+ }
16
+ finally {
17
+ setIsLoading(false);
18
+ }
19
+ }, [client]);
20
+ const reject = useCallback(async (reason, sessionId) => {
21
+ setIsLoading(true);
22
+ setError(null);
23
+ try {
24
+ await client.post("/dev/reject", { reason, ...(sessionId !== undefined && { sessionId }) });
25
+ }
26
+ catch (e) {
27
+ setError(e instanceof Error ? e : new Error(String(e)));
28
+ }
29
+ finally {
30
+ setIsLoading(false);
31
+ }
32
+ }, [client]);
33
+ return { approve, reject, isLoading, error };
34
+ }
35
+ //# sourceMappingURL=use-approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-approval.js","sourceRoot":"","sources":["../src/use-approval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAS/C,MAAM,UAAU,WAAW;IACzB,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IACpC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,WAAW,CACzB,KAAK,EAAE,SAAkB,EAAE,EAAE;QAC3B,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAe,cAAc,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChG,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EACD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,MAAM,MAAM,GAAG,WAAW,CACxB,KAAK,EAAE,MAAc,EAAE,SAAkB,EAAE,EAAE;QAC3C,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAe,aAAa,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5G,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EACD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ChatOptions, UseChatReturn } from "./types.js";
2
+ export declare function useKilnChat(options?: ChatOptions): UseChatReturn;
3
+ //# sourceMappingURL=use-kiln-chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-kiln-chat.d.ts","sourceRoot":"","sources":["../src/use-kiln-chat.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAe,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1E,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,aAAa,CAsDhE"}
@@ -0,0 +1,49 @@
1
+ import { useCallback, useRef, useState } from "react";
2
+ import { useKilnContext } from "./provider.js";
3
+ import { buildUserMessage } from "./build-user-message.js";
4
+ export function useKilnChat(options) {
5
+ const { client, config } = useKilnContext();
6
+ const [messages, setMessages] = useState([]);
7
+ const [isLoading, setIsLoading] = useState(false);
8
+ const [error, setError] = useState(null);
9
+ const idCounter = useRef(0);
10
+ const appName = options?.appName ?? config.appName ?? "default";
11
+ const send = useCallback(async (content) => {
12
+ const userMsg = buildUserMessage(content, String(++idCounter.current));
13
+ setMessages((prev) => [...prev, userMsg]);
14
+ setIsLoading(true);
15
+ setError(null);
16
+ try {
17
+ const body = {
18
+ message: userMsg.content,
19
+ appName,
20
+ userId: config.userId,
21
+ sessionId: options?.sessionId,
22
+ };
23
+ if (userMsg.parts) {
24
+ body.parts = userMsg.parts;
25
+ }
26
+ const res = await client.post(`/apps/${appName}/message`, body);
27
+ const assistantMsg = {
28
+ id: String(++idCounter.current),
29
+ role: "assistant",
30
+ content: res.response,
31
+ timestamp: Date.now(),
32
+ };
33
+ setMessages((prev) => [...prev, assistantMsg]);
34
+ }
35
+ catch (e) {
36
+ const err = e instanceof Error ? e : new Error(String(e));
37
+ setError(err);
38
+ }
39
+ finally {
40
+ setIsLoading(false);
41
+ }
42
+ }, [client, appName, config.userId, options?.sessionId]);
43
+ const clearMessages = useCallback(() => {
44
+ setMessages([]);
45
+ setError(null);
46
+ }, []);
47
+ return { messages, send, isLoading, error, clearMessages };
48
+ }
49
+ //# sourceMappingURL=use-kiln-chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-kiln-chat.js","sourceRoot":"","sources":["../src/use-kiln-chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,MAAM,UAAU,WAAW,CAAC,OAAqB;IAC/C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IAC5C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAgB,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAE5B,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC;IAEhE,MAAM,IAAI,GAAG,WAAW,CACtB,KAAK,EAAE,OAA+B,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAEvE,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1C,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,IAAI,CAAC;YACH,MAAM,IAAI,GAA4B;gBACpC,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO;gBACP,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,SAAS,EAAE,OAAO,EAAE,SAAS;aAC9B,CAAC;YACF,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YAC7B,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAuB,SAAS,OAAO,UAAU,EAAE,IAAI,CAAC,CAAC;YAEtF,MAAM,YAAY,GAAgB;gBAChC,EAAE,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC;gBAC/B,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,GAAG,CAAC,QAAQ;gBACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YAEF,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EACD,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CACrD,CAAC;IAEF,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;QACrC,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { UseEventsReturn } from "./types.js";
2
+ export declare function useKilnEvents(): UseEventsReturn;
3
+ //# sourceMappingURL=use-kiln-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-kiln-events.d.ts","sourceRoot":"","sources":["../src/use-kiln-events.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,eAAe,EAAE,MAAM,YAAY,CAAC;AAIjE,wBAAgB,aAAa,IAAI,eAAe,CAwC/C"}
@@ -0,0 +1,37 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ import { useKilnContext } from "./provider.js";
3
+ import { SseClient } from "./sse-client.js";
4
+ const MAX_EVENTS = 500;
5
+ export function useKilnEvents() {
6
+ const { config } = useKilnContext();
7
+ const [events, setEvents] = useState([]);
8
+ const [connected, setConnected] = useState(false);
9
+ const clientRef = useRef(null);
10
+ useEffect(() => {
11
+ const sse = new SseClient(`${config.baseUrl}/dev/events`, {
12
+ onEvent(event) {
13
+ setEvents((prev) => {
14
+ const next = [...prev, event];
15
+ return next.length > MAX_EVENTS ? next.slice(-MAX_EVENTS) : next;
16
+ });
17
+ },
18
+ onConnect() {
19
+ setConnected(true);
20
+ },
21
+ onDisconnect() {
22
+ setConnected(false);
23
+ },
24
+ }, config.reconnectDelayMs);
25
+ clientRef.current = sse;
26
+ sse.connect();
27
+ return () => {
28
+ sse.disconnect();
29
+ clientRef.current = null;
30
+ };
31
+ }, [config.baseUrl, config.reconnectDelayMs]);
32
+ const clear = useCallback(() => {
33
+ setEvents([]);
34
+ }, []);
35
+ return { events, connected, clear };
36
+ }
37
+ //# sourceMappingURL=use-kiln-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-kiln-events.js","sourceRoot":"","sources":["../src/use-kiln-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,MAAM,UAAU,aAAa;IAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IACpC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAkB,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAEjD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,GAAG,GAAG,IAAI,SAAS,CACvB,GAAG,MAAM,CAAC,OAAO,aAAa,EAC9B;YACE,OAAO,CAAC,KAAK;gBACX,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;oBACjB,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;oBAC9B,OAAO,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACnE,CAAC,CAAC,CAAC;YACL,CAAC;YACD,SAAS;gBACP,YAAY,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;YACD,YAAY;gBACV,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;SACF,EACD,MAAM,CAAC,gBAAgB,CACxB,CAAC;QAEF,SAAS,CAAC,OAAO,GAAG,GAAG,CAAC;QACxB,GAAG,CAAC,OAAO,EAAE,CAAC;QAEd,OAAO,GAAG,EAAE;YACV,GAAG,CAAC,UAAU,EAAE,CAAC;YACjB,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QAC3B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { UseMemoryReturn } from "./types.js";
2
+ /**
3
+ * Read, create, and delete memory entries via the gateway memory API.
4
+ */
5
+ export declare function useKilnMemory(scope: string): UseMemoryReturn;
6
+ //# sourceMappingURL=use-kiln-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-kiln-memory.d.ts","sourceRoot":"","sources":["../src/use-kiln-memory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAkC,eAAe,EAAE,MAAM,YAAY,CAAC;AAElF;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CA8C5D"}
@@ -0,0 +1,47 @@
1
+ import { useCallback, useState } from "react";
2
+ import { useKilnContext } from "./provider.js";
3
+ /**
4
+ * Read, create, and delete memory entries via the gateway memory API.
5
+ */
6
+ export function useKilnMemory(scope) {
7
+ const { client } = useKilnContext();
8
+ const [entries, setEntries] = useState([]);
9
+ const [isLoading, setIsLoading] = useState(false);
10
+ const [error, setError] = useState(null);
11
+ const refresh = useCallback(async () => {
12
+ setIsLoading(true);
13
+ setError(null);
14
+ try {
15
+ const data = await client.get(`/api/memory/${scope}`);
16
+ setEntries(data);
17
+ }
18
+ catch (e) {
19
+ setError(e instanceof Error ? e : new Error(String(e)));
20
+ }
21
+ finally {
22
+ setIsLoading(false);
23
+ }
24
+ }, [client, scope]);
25
+ const create = useCallback(async (entry) => {
26
+ setError(null);
27
+ try {
28
+ await client.post("/api/memory", { ...entry, scope });
29
+ await refresh();
30
+ }
31
+ catch (e) {
32
+ setError(e instanceof Error ? e : new Error(String(e)));
33
+ }
34
+ }, [client, scope, refresh]);
35
+ const remove = useCallback(async (id) => {
36
+ setError(null);
37
+ try {
38
+ await client.delete(`/api/memory/${id}`);
39
+ await refresh();
40
+ }
41
+ catch (e) {
42
+ setError(e instanceof Error ? e : new Error(String(e)));
43
+ }
44
+ }, [client, refresh]);
45
+ return { entries, isLoading, error, refresh, create, remove };
46
+ }
47
+ //# sourceMappingURL=use-kiln-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-kiln-memory.js","sourceRoot":"","sources":["../src/use-kiln-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IACpC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAgB,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAgB,eAAe,KAAK,EAAE,CAAC,CAAC;YACrE,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAEpB,MAAM,MAAM,GAAG,WAAW,CACxB,KAAK,EAAE,KAAwB,EAAE,EAAE;QACjC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACtD,MAAM,OAAO,EAAE,CAAC;QAClB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,EACD,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CACzB,CAAC;IAEF,MAAM,MAAM,GAAG,WAAW,CACxB,KAAK,EAAE,EAAU,EAAE,EAAE;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;YACzC,MAAM,OAAO,EAAE,CAAC;QAClB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,EACD,CAAC,MAAM,EAAE,OAAO,CAAC,CAClB,CAAC;IAEF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAChE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { UseStateReturn } from "./types.js";
2
+ /**
3
+ * Hook to fetch dev-mode gateway state (state, cost, loaded apps).
4
+ * Only works when connected to a dev-mode gateway (`/dev/*` routes).
5
+ */
6
+ export declare function useKilnState(): UseStateReturn;
7
+ //# sourceMappingURL=use-kiln-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-kiln-state.d.ts","sourceRoot":"","sources":["../src/use-kiln-state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,YAAY,IAAI,cAAc,CA4B7C"}
@@ -0,0 +1,36 @@
1
+ import { useCallback, useState } from "react";
2
+ import { useKilnContext } from "./provider.js";
3
+ /**
4
+ * Hook to fetch dev-mode gateway state (state, cost, loaded apps).
5
+ * Only works when connected to a dev-mode gateway (`/dev/*` routes).
6
+ */
7
+ export function useKilnState() {
8
+ const { client } = useKilnContext();
9
+ const [state, setState] = useState({});
10
+ const [cost, setCost] = useState({});
11
+ const [apps, setApps] = useState([]);
12
+ const [isLoading, setIsLoading] = useState(false);
13
+ const [error, setError] = useState(null);
14
+ const refresh = useCallback(async () => {
15
+ setIsLoading(true);
16
+ setError(null);
17
+ try {
18
+ const [stateData, costData, appsData] = await Promise.all([
19
+ client.get("/dev/state"),
20
+ client.get("/dev/cost"),
21
+ client.get("/dev/apps"),
22
+ ]);
23
+ setState(stateData);
24
+ setCost(costData);
25
+ setApps(appsData);
26
+ }
27
+ catch (e) {
28
+ setError(e instanceof Error ? e : new Error(String(e)));
29
+ }
30
+ finally {
31
+ setIsLoading(false);
32
+ }
33
+ }, [client]);
34
+ return { state, cost, apps, isLoading, error, refresh };
35
+ }
36
+ //# sourceMappingURL=use-kiln-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-kiln-state.js","sourceRoot":"","sources":["../src/use-kiln-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IACpC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAA0B,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAA0B,EAAE,CAAC,CAAC;IAC9D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACxD,MAAM,CAAC,GAAG,CAA0B,YAAY,CAAC;gBACjD,MAAM,CAAC,GAAG,CAA0B,WAAW,CAAC;gBAChD,MAAM,CAAC,GAAG,CAAW,WAAW,CAAC;aAClC,CAAC,CAAC;YACH,QAAQ,CAAC,SAAS,CAAC,CAAC;YACpB,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClB,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ChatOptions, UseChatReturn } from "./types.js";
2
+ export declare function useKilnWsChat(options?: ChatOptions): UseChatReturn;
3
+ //# sourceMappingURL=use-kiln-ws-chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-kiln-ws-chat.d.ts","sourceRoot":"","sources":["../src/use-kiln-ws-chat.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAe,WAAW,EAAE,aAAa,EAAe,MAAM,YAAY,CAAC;AAEvF,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,aAAa,CAiFlE"}
@@ -0,0 +1,72 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ import { useKilnContext } from "./provider.js";
3
+ import { buildUserMessage } from "./build-user-message.js";
4
+ export function useKilnWsChat(options) {
5
+ const { config } = useKilnContext();
6
+ const [messages, setMessages] = useState([]);
7
+ const [isLoading, setIsLoading] = useState(false);
8
+ const [error, setError] = useState(null);
9
+ const wsRef = useRef(null);
10
+ const idCounter = useRef(0);
11
+ const stableUserId = useRef(config.userId ?? crypto.randomUUID());
12
+ const appName = options?.appName ?? config.appName ?? "default";
13
+ // Update stable ref if config.userId changes (but keep the generated one stable)
14
+ if (config.userId && config.userId !== stableUserId.current) {
15
+ stableUserId.current = config.userId;
16
+ }
17
+ useEffect(() => {
18
+ const protocol = config.baseUrl.startsWith("https") ? "wss" : "ws";
19
+ const host = config.baseUrl.replace(/^https?:\/\//, "");
20
+ const url = `${protocol}://${host}/apps/${appName}/ws?userId=${encodeURIComponent(stableUserId.current)}`;
21
+ const ws = new WebSocket(url);
22
+ wsRef.current = ws;
23
+ ws.onmessage = (event) => {
24
+ try {
25
+ const frame = JSON.parse(event.data);
26
+ if (frame.type === "done") {
27
+ setMessages((prev) => [...prev, {
28
+ id: String(++idCounter.current),
29
+ role: "assistant",
30
+ content: frame.content,
31
+ parts: frame.parts,
32
+ timestamp: Date.now(),
33
+ }]);
34
+ setIsLoading(false);
35
+ }
36
+ else if (frame.type === "error") {
37
+ setError(new Error(frame.message));
38
+ setIsLoading(false);
39
+ }
40
+ }
41
+ catch {
42
+ // Discard malformed frames
43
+ }
44
+ };
45
+ ws.onerror = () => setError(new Error("WebSocket connection failed"));
46
+ ws.onclose = () => { wsRef.current = null; };
47
+ return () => { ws.close(); wsRef.current = null; };
48
+ }, [config.baseUrl, appName]);
49
+ // deps: [] is correct -- wsRef and idCounter are stable refs
50
+ const send = useCallback(async (content) => {
51
+ const ws = wsRef.current;
52
+ if (!ws || ws.readyState !== WebSocket.OPEN) {
53
+ setError(new Error("WebSocket not connected"));
54
+ return;
55
+ }
56
+ const userMsg = buildUserMessage(content, String(++idCounter.current));
57
+ setMessages((prev) => [...prev, userMsg]);
58
+ setIsLoading(true);
59
+ setError(null);
60
+ ws.send(JSON.stringify({
61
+ type: "message",
62
+ content: userMsg.content,
63
+ ...(userMsg.parts ? { parts: userMsg.parts } : {}),
64
+ }));
65
+ }, []);
66
+ const clearMessages = useCallback(() => {
67
+ setMessages([]);
68
+ setError(null);
69
+ }, []);
70
+ return { messages, send, isLoading, error, clearMessages };
71
+ }
72
+ //# sourceMappingURL=use-kiln-ws-chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-kiln-ws-chat.js","sourceRoot":"","sources":["../src/use-kiln-ws-chat.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@kilnai/react",
3
+ "version": "0.1.1",
4
+ "description": "React hooks SDK for building apps on @kilnai/core",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.js"
10
+ }
11
+ },
12
+ "types": "./dist/index.d.ts",
13
+ "files": [
14
+ "dist",
15
+ "README.md"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "typecheck": "tsc --noEmit",
20
+ "test": "vitest run"
21
+ },
22
+ "license": "MIT",
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "peerDependencies": {
27
+ "@kilnai/core": "0.1.0",
28
+ "react": "^19.0.0"
29
+ },
30
+ "devDependencies": {
31
+ "@testing-library/react": "^16.1.0",
32
+ "@types/react": "^19.0.0",
33
+ "jsdom": "^25.0.0",
34
+ "react": "^19.0.0",
35
+ "react-dom": "^19.0.0",
36
+ "vitest": "^4.0.18"
37
+ }
38
+ }