neeter 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +361 -0
- package/dist/react/AgentProvider.d.ts +15 -0
- package/dist/react/AgentProvider.js +30 -0
- package/dist/react/ApprovalButtons.d.ts +5 -0
- package/dist/react/ApprovalButtons.js +30 -0
- package/dist/react/ChatInput.d.ts +6 -0
- package/dist/react/ChatInput.js +41 -0
- package/dist/react/CollapsibleCard.d.ts +9 -0
- package/dist/react/CollapsibleCard.js +9 -0
- package/dist/react/MessageList.d.ts +3 -0
- package/dist/react/MessageList.js +32 -0
- package/dist/react/PendingPermissions.d.ts +3 -0
- package/dist/react/PendingPermissions.js +35 -0
- package/dist/react/StatusDot.d.ts +8 -0
- package/dist/react/StatusDot.js +15 -0
- package/dist/react/TextMessage.d.ts +5 -0
- package/dist/react/TextMessage.js +8 -0
- package/dist/react/ThinkingBlock.d.ts +5 -0
- package/dist/react/ThinkingBlock.js +38 -0
- package/dist/react/ThinkingIndicator.d.ts +3 -0
- package/dist/react/ThinkingIndicator.js +5 -0
- package/dist/react/ToolApprovalCard.d.ts +7 -0
- package/dist/react/ToolApprovalCard.js +11 -0
- package/dist/react/ToolCallCard.d.ts +5 -0
- package/dist/react/ToolCallCard.js +59 -0
- package/dist/react/UserQuestionCard.d.ts +6 -0
- package/dist/react/UserQuestionCard.js +120 -0
- package/dist/react/approval-matching.d.ts +13 -0
- package/dist/react/approval-matching.js +30 -0
- package/dist/react/cn.d.ts +2 -0
- package/dist/react/cn.js +5 -0
- package/dist/react/icons.d.ts +7 -0
- package/dist/react/icons.js +8 -0
- package/dist/react/index.d.ts +28 -0
- package/dist/react/index.js +28 -0
- package/dist/react/markdown-overrides.d.ts +2 -0
- package/dist/react/markdown-overrides.js +8 -0
- package/dist/react/registry.d.ts +4 -0
- package/dist/react/registry.js +10 -0
- package/dist/react/store.d.ts +34 -0
- package/dist/react/store.js +141 -0
- package/dist/react/use-agent.d.ts +12 -0
- package/dist/react/use-agent.js +119 -0
- package/dist/react/widgets/AskUserQuestionWidget.d.ts +1 -0
- package/dist/react/widgets/AskUserQuestionWidget.js +42 -0
- package/dist/react/widgets/BashWidget.d.ts +1 -0
- package/dist/react/widgets/BashWidget.js +33 -0
- package/dist/react/widgets/EditWidget.d.ts +1 -0
- package/dist/react/widgets/EditWidget.js +36 -0
- package/dist/react/widgets/GlobWidget.d.ts +1 -0
- package/dist/react/widgets/GlobWidget.js +31 -0
- package/dist/react/widgets/GrepWidget.d.ts +1 -0
- package/dist/react/widgets/GrepWidget.js +36 -0
- package/dist/react/widgets/NotebookEditWidget.d.ts +1 -0
- package/dist/react/widgets/NotebookEditWidget.js +47 -0
- package/dist/react/widgets/ReadWidget.d.ts +1 -0
- package/dist/react/widgets/ReadWidget.js +46 -0
- package/dist/react/widgets/TodoWriteWidget.d.ts +1 -0
- package/dist/react/widgets/TodoWriteWidget.js +40 -0
- package/dist/react/widgets/WebFetchWidget.d.ts +1 -0
- package/dist/react/widgets/WebFetchWidget.js +48 -0
- package/dist/react/widgets/WebSearchWidget.d.ts +1 -0
- package/dist/react/widgets/WebSearchWidget.js +85 -0
- package/dist/react/widgets/WriteWidget.d.ts +1 -0
- package/dist/react/widgets/WriteWidget.js +30 -0
- package/dist/server/index.d.ts +6 -0
- package/dist/server/index.js +5 -0
- package/dist/server/permission-gate.d.ts +12 -0
- package/dist/server/permission-gate.js +41 -0
- package/dist/server/push-channel.d.ts +8 -0
- package/dist/server/push-channel.js +40 -0
- package/dist/server/router.d.ts +8 -0
- package/dist/server/router.js +67 -0
- package/dist/server/session.d.ts +40 -0
- package/dist/server/session.js +117 -0
- package/dist/server/translator.d.ts +15 -0
- package/dist/server/translator.js +236 -0
- package/dist/types.d.ts +79 -0
- package/dist/types.js +1 -0
- package/package.json +72 -0
- package/src/theme.css +170 -0
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { ComponentType } from "react";
|
|
2
|
+
export interface SSEEvent {
|
|
3
|
+
event: string;
|
|
4
|
+
data: string;
|
|
5
|
+
}
|
|
6
|
+
export interface CustomEvent<T = unknown> {
|
|
7
|
+
name: string;
|
|
8
|
+
value: T;
|
|
9
|
+
}
|
|
10
|
+
export type ToolCallPhase = "pending" | "streaming_input" | "running" | "complete" | "error";
|
|
11
|
+
export interface ToolCallInfo {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
input: Record<string, unknown>;
|
|
15
|
+
partialInput?: string;
|
|
16
|
+
result?: string;
|
|
17
|
+
error?: string;
|
|
18
|
+
status: ToolCallPhase;
|
|
19
|
+
}
|
|
20
|
+
export interface ChatMessage {
|
|
21
|
+
id: string;
|
|
22
|
+
role: "user" | "assistant" | "system";
|
|
23
|
+
content: string;
|
|
24
|
+
thinking?: string;
|
|
25
|
+
toolCalls?: ToolCallInfo[];
|
|
26
|
+
}
|
|
27
|
+
export interface WidgetProps<TResult = unknown> {
|
|
28
|
+
phase: ToolCallPhase;
|
|
29
|
+
toolUseId: string;
|
|
30
|
+
input: Record<string, unknown>;
|
|
31
|
+
partialInput?: string;
|
|
32
|
+
result?: TResult;
|
|
33
|
+
error?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface WidgetRegistration<TResult = unknown> {
|
|
36
|
+
toolName: string;
|
|
37
|
+
label: string;
|
|
38
|
+
richLabel?: (result: TResult, input: Record<string, unknown>) => string | null;
|
|
39
|
+
inputRenderer?: ComponentType<{
|
|
40
|
+
input: Record<string, unknown>;
|
|
41
|
+
}>;
|
|
42
|
+
component: ComponentType<WidgetProps<TResult>>;
|
|
43
|
+
}
|
|
44
|
+
export interface ToolApprovalRequest {
|
|
45
|
+
kind: "tool_approval";
|
|
46
|
+
requestId: string;
|
|
47
|
+
toolName: string;
|
|
48
|
+
toolUseId?: string;
|
|
49
|
+
input: Record<string, unknown>;
|
|
50
|
+
description?: string;
|
|
51
|
+
}
|
|
52
|
+
export interface UserQuestionOption {
|
|
53
|
+
label: string;
|
|
54
|
+
description?: string;
|
|
55
|
+
}
|
|
56
|
+
export interface UserQuestion {
|
|
57
|
+
question: string;
|
|
58
|
+
header?: string;
|
|
59
|
+
options?: UserQuestionOption[];
|
|
60
|
+
multiSelect?: boolean;
|
|
61
|
+
}
|
|
62
|
+
export interface UserQuestionRequest {
|
|
63
|
+
kind: "user_question";
|
|
64
|
+
requestId: string;
|
|
65
|
+
questions: UserQuestion[];
|
|
66
|
+
}
|
|
67
|
+
export type PermissionRequest = ToolApprovalRequest | UserQuestionRequest;
|
|
68
|
+
export interface ToolApprovalResponse {
|
|
69
|
+
kind: "tool_approval";
|
|
70
|
+
requestId: string;
|
|
71
|
+
behavior: "allow" | "deny";
|
|
72
|
+
message?: string;
|
|
73
|
+
}
|
|
74
|
+
export interface UserQuestionResponse {
|
|
75
|
+
kind: "user_question";
|
|
76
|
+
requestId: string;
|
|
77
|
+
answers: Record<string, string>;
|
|
78
|
+
}
|
|
79
|
+
export type PermissionResponse = ToolApprovalResponse | UserQuestionResponse;
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "neeter",
|
|
3
|
+
"version": "0.6.0",
|
|
4
|
+
"description": "React + Hono toolkit for building chat UIs on top of the Claude Agent SDK",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Dan Leeper",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/quantumleeps/neeter.git"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/quantumleeps/neeter#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/quantumleeps/neeter/issues"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"claude",
|
|
17
|
+
"agent-sdk",
|
|
18
|
+
"react",
|
|
19
|
+
"hono",
|
|
20
|
+
"sse",
|
|
21
|
+
"chat-ui",
|
|
22
|
+
"anthropic"
|
|
23
|
+
],
|
|
24
|
+
"packageManager": "pnpm@10.22.0",
|
|
25
|
+
"sideEffects": false,
|
|
26
|
+
"type": "module",
|
|
27
|
+
"exports": {
|
|
28
|
+
"./server": {
|
|
29
|
+
"types": "./dist/server/index.d.ts",
|
|
30
|
+
"import": "./dist/server/index.js"
|
|
31
|
+
},
|
|
32
|
+
"./react": {
|
|
33
|
+
"types": "./dist/react/index.d.ts",
|
|
34
|
+
"import": "./dist/react/index.js"
|
|
35
|
+
},
|
|
36
|
+
"./theme.css": "./src/theme.css"
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist",
|
|
40
|
+
"src/theme.css"
|
|
41
|
+
],
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "tsc",
|
|
44
|
+
"check": "biome check src/",
|
|
45
|
+
"prepare": "lefthook install",
|
|
46
|
+
"test": "vitest run"
|
|
47
|
+
},
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"clsx": "^2.1.1",
|
|
50
|
+
"tailwind-merge": "^3.4.0"
|
|
51
|
+
},
|
|
52
|
+
"peerDependencies": {
|
|
53
|
+
"@anthropic-ai/claude-agent-sdk": ">=0.2.0",
|
|
54
|
+
"hono": ">=4.0.0",
|
|
55
|
+
"react": ">=18.0.0",
|
|
56
|
+
"react-markdown": ">=10.0.0",
|
|
57
|
+
"zustand": ">=5.0.0",
|
|
58
|
+
"immer": ">=10.0.0"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@anthropic-ai/claude-agent-sdk": "latest",
|
|
62
|
+
"@biomejs/biome": "^2.3.14",
|
|
63
|
+
"@types/react": "^19.2.7",
|
|
64
|
+
"hono": "^4.11.9",
|
|
65
|
+
"lefthook": "^2.1.1",
|
|
66
|
+
"immer": "^11.1.4",
|
|
67
|
+
"react": "^19.2.0",
|
|
68
|
+
"typescript": "~5.9.3",
|
|
69
|
+
"vitest": "^4.0.18",
|
|
70
|
+
"zustand": "^5.0.11"
|
|
71
|
+
}
|
|
72
|
+
}
|
package/src/theme.css
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* neeter/theme.css — default theme for neeter components.
|
|
3
|
+
*
|
|
4
|
+
* Provides the CSS variable bridge (via @theme inline) and a neutral color
|
|
5
|
+
* palette so neeter components render correctly out of the box.
|
|
6
|
+
*
|
|
7
|
+
* If your app already uses shadcn/ui you don't need this file — neeter
|
|
8
|
+
* components use only standard shadcn variables plus Tailwind's built-in
|
|
9
|
+
* color palette (amber, emerald, blue) for status indicators.
|
|
10
|
+
*
|
|
11
|
+
* Usage (non-shadcn apps):
|
|
12
|
+
* @import "neeter/theme.css";
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/* -- Source scanning ------------------------------------------------------- */
|
|
16
|
+
/* Tells Tailwind to scan neeter's component source for utility classes. */
|
|
17
|
+
|
|
18
|
+
@source "./react";
|
|
19
|
+
|
|
20
|
+
/* -- Tailwind v4 variable bridge ------------------------------------------ */
|
|
21
|
+
/* Maps CSS custom properties to Tailwind utility classes. */
|
|
22
|
+
/* Same mappings as shadcn/tailwind.css — if you have that, skip this file. */
|
|
23
|
+
|
|
24
|
+
@theme inline {
|
|
25
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
26
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
27
|
+
--radius-lg: var(--radius);
|
|
28
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
29
|
+
--color-background: var(--background);
|
|
30
|
+
--color-foreground: var(--foreground);
|
|
31
|
+
--color-card: var(--card);
|
|
32
|
+
--color-card-foreground: var(--card-foreground);
|
|
33
|
+
--color-popover: var(--popover);
|
|
34
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
35
|
+
--color-primary: var(--primary);
|
|
36
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
37
|
+
--color-secondary: var(--secondary);
|
|
38
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
39
|
+
--color-muted: var(--muted);
|
|
40
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
41
|
+
--color-accent: var(--accent);
|
|
42
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
43
|
+
--color-destructive: var(--destructive);
|
|
44
|
+
--color-warning: var(--warning);
|
|
45
|
+
--color-success: var(--success);
|
|
46
|
+
--color-info: var(--info);
|
|
47
|
+
--color-border: var(--border);
|
|
48
|
+
--color-input: var(--input);
|
|
49
|
+
--color-ring: var(--ring);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* -- Light mode (default) ------------------------------------------------- */
|
|
53
|
+
|
|
54
|
+
:root {
|
|
55
|
+
--radius: 0.625rem;
|
|
56
|
+
--background: oklch(1 0 0);
|
|
57
|
+
--foreground: oklch(0.145 0 0);
|
|
58
|
+
--card: oklch(1 0 0);
|
|
59
|
+
--card-foreground: oklch(0.145 0 0);
|
|
60
|
+
--popover: oklch(1 0 0);
|
|
61
|
+
--popover-foreground: oklch(0.145 0 0);
|
|
62
|
+
--primary: oklch(0.205 0 0);
|
|
63
|
+
--primary-foreground: oklch(0.985 0 0);
|
|
64
|
+
--secondary: oklch(0.97 0 0);
|
|
65
|
+
--secondary-foreground: oklch(0.205 0 0);
|
|
66
|
+
--muted: oklch(0.97 0 0);
|
|
67
|
+
--muted-foreground: oklch(0.556 0 0);
|
|
68
|
+
--accent: oklch(0.97 0 0);
|
|
69
|
+
--accent-foreground: oklch(0.205 0 0);
|
|
70
|
+
--destructive: oklch(0.577 0.245 27.325);
|
|
71
|
+
--warning: oklch(0.795 0.184 86.047);
|
|
72
|
+
--success: oklch(0.723 0.219 149.579);
|
|
73
|
+
--info: oklch(0.623 0.214 259.815);
|
|
74
|
+
--border: oklch(0.922 0 0);
|
|
75
|
+
--input: oklch(0.922 0 0);
|
|
76
|
+
--ring: oklch(0.708 0 0);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/* -- Dark mode (class-based) ---------------------------------------------- */
|
|
80
|
+
|
|
81
|
+
.dark {
|
|
82
|
+
--background: oklch(0.145 0 0);
|
|
83
|
+
--foreground: oklch(0.985 0 0);
|
|
84
|
+
--card: oklch(0.205 0 0);
|
|
85
|
+
--card-foreground: oklch(0.985 0 0);
|
|
86
|
+
--popover: oklch(0.205 0 0);
|
|
87
|
+
--popover-foreground: oklch(0.985 0 0);
|
|
88
|
+
--primary: oklch(0.922 0 0);
|
|
89
|
+
--primary-foreground: oklch(0.205 0 0);
|
|
90
|
+
--secondary: oklch(0.269 0 0);
|
|
91
|
+
--secondary-foreground: oklch(0.985 0 0);
|
|
92
|
+
--muted: oklch(0.269 0 0);
|
|
93
|
+
--muted-foreground: oklch(0.708 0 0);
|
|
94
|
+
--accent: oklch(0.269 0 0);
|
|
95
|
+
--accent-foreground: oklch(0.985 0 0);
|
|
96
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
97
|
+
--warning: oklch(0.852 0.199 91.936);
|
|
98
|
+
--success: oklch(0.792 0.209 151.711);
|
|
99
|
+
--info: oklch(0.707 0.165 254.624);
|
|
100
|
+
--border: oklch(1 0 0 / 10%);
|
|
101
|
+
--input: oklch(1 0 0 / 15%);
|
|
102
|
+
--ring: oklch(0.556 0 0);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* -- Dark mode (system preference) ---------------------------------------- */
|
|
106
|
+
/* Activates automatically unless .light is set on :root. */
|
|
107
|
+
|
|
108
|
+
@media (prefers-color-scheme: dark) {
|
|
109
|
+
:root:not(.light) {
|
|
110
|
+
--background: oklch(0.145 0 0);
|
|
111
|
+
--foreground: oklch(0.985 0 0);
|
|
112
|
+
--card: oklch(0.205 0 0);
|
|
113
|
+
--card-foreground: oklch(0.985 0 0);
|
|
114
|
+
--popover: oklch(0.205 0 0);
|
|
115
|
+
--popover-foreground: oklch(0.985 0 0);
|
|
116
|
+
--primary: oklch(0.922 0 0);
|
|
117
|
+
--primary-foreground: oklch(0.205 0 0);
|
|
118
|
+
--secondary: oklch(0.269 0 0);
|
|
119
|
+
--secondary-foreground: oklch(0.985 0 0);
|
|
120
|
+
--muted: oklch(0.269 0 0);
|
|
121
|
+
--muted-foreground: oklch(0.708 0 0);
|
|
122
|
+
--accent: oklch(0.269 0 0);
|
|
123
|
+
--accent-foreground: oklch(0.985 0 0);
|
|
124
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
125
|
+
--warning: oklch(0.852 0.199 91.936);
|
|
126
|
+
--success: oklch(0.792 0.209 151.711);
|
|
127
|
+
--info: oklch(0.707 0.165 254.624);
|
|
128
|
+
--border: oklch(1 0 0 / 10%);
|
|
129
|
+
--input: oklch(1 0 0 / 15%);
|
|
130
|
+
--ring: oklch(0.556 0 0);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/* -- Base resets ---------------------------------------------------------- */
|
|
135
|
+
|
|
136
|
+
*,
|
|
137
|
+
*::before,
|
|
138
|
+
*::after {
|
|
139
|
+
border-color: var(--border);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
body {
|
|
143
|
+
background-color: var(--background);
|
|
144
|
+
color: var(--foreground);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/* -- Scrollbar styling --------------------------------------------------- */
|
|
148
|
+
|
|
149
|
+
* {
|
|
150
|
+
scrollbar-color: var(--muted-foreground) transparent;
|
|
151
|
+
scrollbar-width: thin;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
::-webkit-scrollbar {
|
|
155
|
+
width: 6px;
|
|
156
|
+
height: 6px;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
::-webkit-scrollbar-track {
|
|
160
|
+
background: transparent;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
::-webkit-scrollbar-thumb {
|
|
164
|
+
background: var(--muted-foreground);
|
|
165
|
+
border-radius: 3px;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
::-webkit-scrollbar-thumb:hover {
|
|
169
|
+
background: var(--foreground);
|
|
170
|
+
}
|