joonecli 0.2.3 → 0.2.5

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 (58) hide show
  1. package/README.md +20 -2
  2. package/dist/cli/index.js +12 -62
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/desktop/cliEntry.d.ts +1 -0
  5. package/dist/desktop/cliEntry.js +18 -0
  6. package/dist/desktop/cliEntry.js.map +1 -0
  7. package/dist/desktop/devServer.d.ts +1 -0
  8. package/dist/desktop/devServer.js +12 -0
  9. package/dist/desktop/devServer.js.map +1 -0
  10. package/dist/desktop/ipc.d.ts +14 -0
  11. package/dist/desktop/ipc.js +46 -0
  12. package/dist/desktop/ipc.js.map +1 -0
  13. package/dist/desktop/npmCli.d.ts +1 -0
  14. package/dist/desktop/npmCli.js +18 -0
  15. package/dist/desktop/npmCli.js.map +1 -0
  16. package/dist/desktop/providerCatalog.d.ts +11 -0
  17. package/dist/desktop/providerCatalog.js +64 -0
  18. package/dist/desktop/providerCatalog.js.map +1 -0
  19. package/dist/desktop/pruneReleaseAssets.d.ts +10 -0
  20. package/dist/desktop/pruneReleaseAssets.js +48 -0
  21. package/dist/desktop/pruneReleaseAssets.js.map +1 -0
  22. package/dist/desktop/publishReleaseAssets.d.ts +12 -0
  23. package/dist/desktop/publishReleaseAssets.js +49 -0
  24. package/dist/desktop/publishReleaseAssets.js.map +1 -0
  25. package/dist/desktop/releaseMetadata.d.ts +12 -0
  26. package/dist/desktop/releaseMetadata.js +54 -0
  27. package/dist/desktop/releaseMetadata.js.map +1 -0
  28. package/dist/desktop/server.d.ts +22 -0
  29. package/dist/desktop/server.js +100 -0
  30. package/dist/desktop/server.js.map +1 -0
  31. package/dist/desktop/smokeTestBundles.d.ts +10 -0
  32. package/dist/desktop/smokeTestBundles.js +108 -0
  33. package/dist/desktop/smokeTestBundles.js.map +1 -0
  34. package/dist/desktop/validateBundles.d.ts +8 -0
  35. package/dist/desktop/validateBundles.js +52 -0
  36. package/dist/desktop/validateBundles.js.map +1 -0
  37. package/dist/desktop/webDev.d.ts +1 -0
  38. package/dist/desktop/webDev.js +32 -0
  39. package/dist/desktop/webDev.js.map +1 -0
  40. package/dist/runtime/service.d.ts +44 -0
  41. package/dist/runtime/service.js +416 -0
  42. package/dist/runtime/service.js.map +1 -0
  43. package/dist/runtime/types.d.ts +110 -0
  44. package/dist/runtime/types.js +2 -0
  45. package/dist/runtime/types.js.map +1 -0
  46. package/dist/ui/App.d.ts +4 -2
  47. package/dist/ui/App.js +178 -33
  48. package/dist/ui/App.js.map +1 -1
  49. package/dist/ui/components/HITLPrompt.d.ts +1 -0
  50. package/dist/ui/components/HITLPrompt.js +3 -3
  51. package/dist/ui/components/HITLPrompt.js.map +1 -1
  52. package/dist/ui/components/ToolCallPanel.d.ts +0 -5
  53. package/dist/ui/components/ToolCallPanel.js +33 -11
  54. package/dist/ui/components/ToolCallPanel.js.map +1 -1
  55. package/dist/ui/components/WorkflowTodoPanel.d.ts +13 -0
  56. package/dist/ui/components/WorkflowTodoPanel.js +35 -0
  57. package/dist/ui/components/WorkflowTodoPanel.js.map +1 -0
  58. package/package.json +12 -1
@@ -0,0 +1,416 @@
1
+ import { HumanMessage } from "@langchain/core/messages";
2
+ import { loadConfig, saveConfig } from "../cli/config.js";
3
+ import { SessionResumer } from "../core/sessionResumer.js";
4
+ import { SessionStore } from "../core/sessionStore.js";
5
+ import { HITLBridge, } from "../hitl/bridge.js";
6
+ export class JooneRuntimeService {
7
+ configPath;
8
+ cwd;
9
+ sessionStore = new SessionStore();
10
+ sessions = new Map();
11
+ listeners = new Map();
12
+ harnessFactory;
13
+ constructor(options) {
14
+ this.configPath = options.configPath;
15
+ this.cwd = options.cwd ?? process.cwd();
16
+ this.harnessFactory =
17
+ options.harnessFactory ?? createDefaultRuntimeHarnessFactory();
18
+ const bridge = HITLBridge.getInstance();
19
+ bridge.on("question", (question) => {
20
+ for (const sessionId of this.sessions.keys()) {
21
+ this.emit(sessionId, {
22
+ type: "hitl:question",
23
+ sessionId,
24
+ id: question.id,
25
+ question: question.question,
26
+ options: question.options,
27
+ });
28
+ }
29
+ });
30
+ bridge.on("permission", (permission) => {
31
+ for (const sessionId of this.sessions.keys()) {
32
+ this.emit(sessionId, {
33
+ type: "hitl:permission",
34
+ sessionId,
35
+ id: permission.id,
36
+ toolName: permission.toolName,
37
+ args: permission.args,
38
+ });
39
+ }
40
+ });
41
+ }
42
+ async loadConfig() {
43
+ return loadConfig(this.configPath);
44
+ }
45
+ async saveConfig(config) {
46
+ saveConfig(this.configPath, config);
47
+ }
48
+ async listSessions() {
49
+ const headers = await this.sessionStore.listSessions();
50
+ return Promise.all(headers.map((header) => this.buildPersistedSnapshot(header)));
51
+ }
52
+ async prepareSession(options) {
53
+ const config = options?.config ?? (await this.loadConfig());
54
+ const sessionId = options?.sessionId ?? `session-${Date.now()}`;
55
+ let existing = this.sessions.get(sessionId);
56
+ if (!existing) {
57
+ const state = options?.sessionId
58
+ ? await this.loadResumedState(options.sessionId)
59
+ : this.createInitialState();
60
+ existing = {
61
+ sessionId,
62
+ config,
63
+ state,
64
+ status: "idle",
65
+ };
66
+ this.sessions.set(sessionId, existing);
67
+ }
68
+ else {
69
+ existing.config = config;
70
+ }
71
+ return {
72
+ sessionId,
73
+ provider: existing.config.provider,
74
+ model: existing.config.model,
75
+ initialState: existing.state,
76
+ createHarness: async () => this.ensureHarness(existing),
77
+ };
78
+ }
79
+ async startSession(options) {
80
+ const prepared = await this.prepareSession(options);
81
+ const record = this.getRecord(prepared.sessionId);
82
+ await this.ensureHarness(record);
83
+ return this.buildSnapshot(record);
84
+ }
85
+ async resumeSession(sessionId) {
86
+ return this.startSession({ sessionId });
87
+ }
88
+ subscribe(sessionId, listener) {
89
+ let listeners = this.listeners.get(sessionId);
90
+ if (!listeners) {
91
+ listeners = new Set();
92
+ this.listeners.set(sessionId, listeners);
93
+ }
94
+ listeners.add(listener);
95
+ const record = this.sessions.get(sessionId);
96
+ if (record) {
97
+ listener(this.buildStartedEvent(record));
98
+ listener({
99
+ type: "session:status",
100
+ sessionId,
101
+ status: record.status,
102
+ });
103
+ }
104
+ return () => {
105
+ listeners?.delete(listener);
106
+ if (listeners && listeners.size === 0) {
107
+ this.listeners.delete(sessionId);
108
+ }
109
+ };
110
+ }
111
+ syncSessionState(sessionId, state) {
112
+ const record = this.getRecord(sessionId);
113
+ record.state = state;
114
+ }
115
+ async submitMessage(sessionId, text) {
116
+ const record = this.getRecord(sessionId);
117
+ const harness = await this.ensureHarness(record);
118
+ record.status = "processing";
119
+ this.emit(sessionId, {
120
+ type: "session:status",
121
+ sessionId,
122
+ status: "processing",
123
+ });
124
+ const updatedState = {
125
+ ...record.state,
126
+ conversationHistory: [
127
+ ...record.state.conversationHistory,
128
+ new HumanMessage(text),
129
+ ],
130
+ };
131
+ record.state = updatedState;
132
+ let nextHistory = updatedState.conversationHistory;
133
+ try {
134
+ for await (const event of harness.run(updatedState)) {
135
+ if (event.event === "on_chat_model_stream" && event.data?.chunk?.content) {
136
+ this.emit(sessionId, {
137
+ type: "agent:token",
138
+ sessionId,
139
+ token: event.data.chunk.content,
140
+ });
141
+ }
142
+ else if (event.event === "on_tool_start") {
143
+ this.emit(sessionId, {
144
+ type: "tool:start",
145
+ sessionId,
146
+ toolName: event.name,
147
+ args: event.data?.input ?? {},
148
+ });
149
+ }
150
+ else if (event.event === "on_tool_end") {
151
+ this.emit(sessionId, {
152
+ type: "tool:end",
153
+ sessionId,
154
+ toolName: event.name,
155
+ result: stringifyToolResult(event.data?.output),
156
+ });
157
+ }
158
+ else if (event.event === "on_chain_end" &&
159
+ event.name === "LangGraph" &&
160
+ event.data?.output?.messages) {
161
+ nextHistory = event.data.output.messages;
162
+ }
163
+ }
164
+ record.state = {
165
+ ...updatedState,
166
+ conversationHistory: nextHistory,
167
+ };
168
+ await this.sessionStore.saveSession(sessionId, record.state, record.config.provider, record.config.model);
169
+ this.emit(sessionId, {
170
+ type: "session:state",
171
+ sessionId,
172
+ state: serializeState(record.state),
173
+ metrics: harness.tracerSummary,
174
+ });
175
+ this.emit(sessionId, { type: "session:completed", sessionId });
176
+ record.status = "idle";
177
+ this.emit(sessionId, {
178
+ type: "session:status",
179
+ sessionId,
180
+ status: "idle",
181
+ });
182
+ }
183
+ catch (error) {
184
+ record.status = "idle";
185
+ this.emit(sessionId, {
186
+ type: "session:error",
187
+ sessionId,
188
+ message: error.message,
189
+ });
190
+ this.emit(sessionId, {
191
+ type: "session:status",
192
+ sessionId,
193
+ status: "idle",
194
+ });
195
+ throw error;
196
+ }
197
+ return this.buildSnapshot(record);
198
+ }
199
+ async cancelSession(sessionId) {
200
+ const record = this.getRecord(sessionId);
201
+ record.status = "idle";
202
+ this.emit(sessionId, {
203
+ type: "session:status",
204
+ sessionId,
205
+ status: "idle",
206
+ });
207
+ }
208
+ async closeSession(sessionId) {
209
+ const record = this.getRecord(sessionId);
210
+ await this.sessionStore.saveSession(sessionId, record.state, record.config.provider, record.config.model);
211
+ if (record.harness) {
212
+ await record.harness.save();
213
+ await record.harness.destroy();
214
+ }
215
+ record.status = "closed";
216
+ this.emit(sessionId, {
217
+ type: "session:status",
218
+ sessionId,
219
+ status: "closed",
220
+ });
221
+ this.sessions.delete(sessionId);
222
+ }
223
+ async answerHitl(id, answer) {
224
+ HITLBridge.getInstance().resolveAnswer(id, answer);
225
+ }
226
+ emit(sessionId, event) {
227
+ const listeners = this.listeners.get(sessionId);
228
+ if (!listeners) {
229
+ return;
230
+ }
231
+ for (const listener of listeners) {
232
+ listener(event);
233
+ }
234
+ }
235
+ async loadResumedState(sessionId) {
236
+ const payload = await this.sessionStore.loadSession(sessionId);
237
+ const resumer = new SessionResumer(this.cwd);
238
+ return resumer.prepareForResume(payload);
239
+ }
240
+ createInitialState() {
241
+ return {
242
+ globalSystemInstructions: `You are Joone, a highly capable autonomous coding agent.
243
+ You run in a hybrid environment based on user configuration. You execute commands using 'bash' and can safely evaluate tests and install dependencies.
244
+ Always use the tools provided to you. Never read or write outside the current project directory unless explicitly requested.
245
+
246
+ IMPORTANT CAPABILITIES:
247
+ - You have access to an 'ask_user_question' tool. Use it to ask the user for clarification, preferences, or approval before making significant changes.
248
+ - Some tool calls may require user approval before execution, depending on the user's permission settings. If a tool call is denied, try an alternative approach or ask the user for guidance.
249
+ - You have access to Skills - reusable instruction sets for specialized tasks. Use 'search_skills' to discover them and 'load_skill' to activate their instructions.`,
250
+ projectMemory: `Initial working directory: ${this.cwd}`,
251
+ sessionContext: `Environment: ${process.platform}\nCWD: ${this.cwd}`,
252
+ conversationHistory: [],
253
+ };
254
+ }
255
+ async ensureHarness(record) {
256
+ if (record.harness) {
257
+ return record.harness;
258
+ }
259
+ if (!record.harnessPromise) {
260
+ record.harnessPromise = this.harnessFactory({
261
+ config: record.config,
262
+ cwd: this.cwd,
263
+ sessionId: record.sessionId,
264
+ });
265
+ }
266
+ record.harness = await record.harnessPromise;
267
+ return record.harness;
268
+ }
269
+ buildSnapshot(record) {
270
+ return {
271
+ sessionId: record.sessionId,
272
+ provider: record.config.provider,
273
+ model: record.config.model,
274
+ state: record.state,
275
+ messages: serializeMessages(record.state.conversationHistory),
276
+ description: describeConversation(record.state),
277
+ metrics: record.harness?.tracerSummary ?? {
278
+ totalTokens: 0,
279
+ cacheHitRate: 0,
280
+ toolCallCount: 0,
281
+ turnCount: 0,
282
+ totalCost: 0,
283
+ },
284
+ };
285
+ }
286
+ async buildPersistedSnapshot(header) {
287
+ const payload = await this.sessionStore.loadSession(header.sessionId);
288
+ return {
289
+ sessionId: header.sessionId,
290
+ provider: header.provider,
291
+ model: header.model,
292
+ state: payload.state,
293
+ messages: serializeMessages(payload.state.conversationHistory),
294
+ lastSavedAt: header.lastSavedAt,
295
+ description: header.description,
296
+ metrics: emptyRuntimeMetrics(),
297
+ };
298
+ }
299
+ buildStartedEvent(record) {
300
+ return {
301
+ type: "session:started",
302
+ sessionId: record.sessionId,
303
+ provider: record.config.provider,
304
+ model: record.config.model,
305
+ state: serializeState(record.state),
306
+ };
307
+ }
308
+ getRecord(sessionId) {
309
+ const record = this.sessions.get(sessionId);
310
+ if (!record) {
311
+ throw new Error(`Unknown session: ${sessionId}`);
312
+ }
313
+ return record;
314
+ }
315
+ }
316
+ function emptyRuntimeMetrics() {
317
+ return {
318
+ totalTokens: 0,
319
+ cacheHitRate: 0,
320
+ toolCallCount: 0,
321
+ turnCount: 0,
322
+ totalCost: 0,
323
+ };
324
+ }
325
+ function describeConversation(state) {
326
+ const firstUserMessage = serializeMessages(state.conversationHistory).find((message) => message.role === "user");
327
+ return firstUserMessage?.content ?? "Empty session";
328
+ }
329
+ function serializeMessages(messages) {
330
+ return messages.map((message) => {
331
+ const type = message._getType();
332
+ if (type === "human") {
333
+ return { role: "user", content: String(message.content) };
334
+ }
335
+ if (type === "ai") {
336
+ return { role: "agent", content: String(message.content) };
337
+ }
338
+ return { role: "system", content: String(message.content) };
339
+ });
340
+ }
341
+ function serializeState(state) {
342
+ return {
343
+ globalSystemInstructions: state.globalSystemInstructions,
344
+ projectMemory: state.projectMemory,
345
+ sessionContext: state.sessionContext,
346
+ conversationHistory: serializeMessages(state.conversationHistory),
347
+ };
348
+ }
349
+ function stringifyToolResult(result) {
350
+ if (typeof result === "string") {
351
+ return result;
352
+ }
353
+ if (result == null) {
354
+ return "";
355
+ }
356
+ try {
357
+ return JSON.stringify(result);
358
+ }
359
+ catch {
360
+ return String(result);
361
+ }
362
+ }
363
+ function createDefaultRuntimeHarnessFactory() {
364
+ return async ({ config, cwd, sessionId }) => {
365
+ const previousCwd = process.cwd();
366
+ if (previousCwd !== cwd) {
367
+ process.chdir(cwd);
368
+ }
369
+ const { createModel } = await import("../cli/modelFactory.js");
370
+ const model = await createModel(config);
371
+ const { SessionTracer } = await import("../tracing/sessionTracer.js");
372
+ const tracer = new SessionTracer();
373
+ let sandboxManager;
374
+ const { bindSandbox, CORE_TOOLS } = await import("../tools/index.js");
375
+ if (config.executionMode !== "host") {
376
+ const { SandboxManager } = await import("../sandbox/manager.js");
377
+ sandboxManager = new SandboxManager({
378
+ template: config.sandboxTemplate,
379
+ apiKey: config.e2bApiKey,
380
+ openSandboxApiKey: config.openSandboxApiKey,
381
+ openSandboxDomain: config.openSandboxDomain,
382
+ });
383
+ await sandboxManager.create();
384
+ const { FileSync } = await import("../sandbox/sync.js");
385
+ const fileSync = new FileSync(cwd);
386
+ bindSandbox(sandboxManager, fileSync);
387
+ }
388
+ const { askUserQuestionTool } = await import("../tools/askUser.js");
389
+ const tools = [...CORE_TOOLS, askUserQuestionTool];
390
+ const { ExecutionHarness } = await import("../core/agentLoop.js");
391
+ const harness = new ExecutionHarness(model, tools, tracer, config.provider, config.model, sessionId, config.maxTokens, config.permissionMode, config.executionMode);
392
+ return {
393
+ sessionId,
394
+ provider: config.provider,
395
+ model: config.model,
396
+ get tracerSummary() {
397
+ return harness.tracer.getSummary();
398
+ },
399
+ run(state, resumeCommand) {
400
+ return harness.run(state, resumeCommand);
401
+ },
402
+ async save() {
403
+ tracer.save();
404
+ },
405
+ async destroy() {
406
+ if (sandboxManager) {
407
+ await sandboxManager.destroy();
408
+ }
409
+ if (process.cwd() !== previousCwd) {
410
+ process.chdir(previousCwd);
411
+ }
412
+ },
413
+ };
414
+ };
415
+ }
416
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/runtime/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ import type { JooneConfig } from "../cli/config.js";
2
+ import type { ContextState } from "../core/promptBuilder.js";
3
+ export interface RuntimeMessage {
4
+ role: "user" | "agent" | "system";
5
+ content: string;
6
+ }
7
+ export interface RuntimeMetrics {
8
+ totalTokens: number;
9
+ cacheHitRate: number;
10
+ toolCallCount: number;
11
+ turnCount: number;
12
+ totalCost: number;
13
+ }
14
+ export interface SerializedRuntimeState {
15
+ globalSystemInstructions: string;
16
+ projectMemory: string;
17
+ sessionContext: string;
18
+ conversationHistory: RuntimeMessage[];
19
+ }
20
+ export interface RuntimeSessionSnapshot {
21
+ sessionId: string;
22
+ provider: string;
23
+ model: string;
24
+ state: ContextState;
25
+ messages: RuntimeMessage[];
26
+ metrics: RuntimeMetrics;
27
+ lastSavedAt?: number;
28
+ description?: string;
29
+ }
30
+ export interface RuntimePreparedSession {
31
+ sessionId: string;
32
+ provider: string;
33
+ model: string;
34
+ initialState: ContextState;
35
+ createHarness: () => Promise<RuntimeHarness>;
36
+ }
37
+ export interface RuntimeSessionStartedEvent {
38
+ type: "session:started";
39
+ sessionId: string;
40
+ provider: string;
41
+ model: string;
42
+ state: SerializedRuntimeState;
43
+ }
44
+ export interface RuntimeSessionStateEvent {
45
+ type: "session:state";
46
+ sessionId: string;
47
+ state: SerializedRuntimeState;
48
+ metrics: RuntimeMetrics;
49
+ }
50
+ export interface RuntimeAgentTokenEvent {
51
+ type: "agent:token";
52
+ sessionId: string;
53
+ token: string;
54
+ }
55
+ export interface RuntimeToolStartEvent {
56
+ type: "tool:start";
57
+ sessionId: string;
58
+ toolName: string;
59
+ args: Record<string, unknown>;
60
+ }
61
+ export interface RuntimeToolEndEvent {
62
+ type: "tool:end";
63
+ sessionId: string;
64
+ toolName: string;
65
+ result: string;
66
+ }
67
+ export interface RuntimeQuestionEvent {
68
+ type: "hitl:question";
69
+ sessionId: string;
70
+ id: string;
71
+ question: string;
72
+ options?: string[];
73
+ }
74
+ export interface RuntimePermissionEvent {
75
+ type: "hitl:permission";
76
+ sessionId: string;
77
+ id: string;
78
+ toolName: string;
79
+ args: Record<string, unknown>;
80
+ }
81
+ export interface RuntimeErrorEvent {
82
+ type: "session:error";
83
+ sessionId: string;
84
+ message: string;
85
+ }
86
+ export interface RuntimeCompletedEvent {
87
+ type: "session:completed";
88
+ sessionId: string;
89
+ }
90
+ export interface RuntimeSessionStatusEvent {
91
+ type: "session:status";
92
+ sessionId: string;
93
+ status: "idle" | "processing" | "closed";
94
+ }
95
+ export type RuntimeEvent = RuntimeSessionStartedEvent | RuntimeSessionStateEvent | RuntimeAgentTokenEvent | RuntimeToolStartEvent | RuntimeToolEndEvent | RuntimeQuestionEvent | RuntimePermissionEvent | RuntimeErrorEvent | RuntimeCompletedEvent | RuntimeSessionStatusEvent;
96
+ export interface RuntimeHarness {
97
+ sessionId: string;
98
+ provider: string;
99
+ model: string;
100
+ readonly tracerSummary: RuntimeMetrics;
101
+ run(state: ContextState, resumeCommand?: unknown): AsyncGenerator<any>;
102
+ save(): Promise<void>;
103
+ destroy(): Promise<void>;
104
+ }
105
+ export interface RuntimeHarnessFactoryOptions {
106
+ config: JooneConfig;
107
+ cwd: string;
108
+ sessionId: string;
109
+ }
110
+ export type RuntimeHarnessFactory = (options: RuntimeHarnessFactoryOptions) => Promise<RuntimeHarness>;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":""}
package/dist/ui/App.d.ts CHANGED
@@ -1,12 +1,13 @@
1
1
  import React from "react";
2
2
  import { ToolCallStatus } from "./components/ToolCallPanel.js";
3
- import { ExecutionHarness } from "../core/agentLoop.js";
4
- import { ContextState } from "../core/promptBuilder.js";
3
+ import type { ExecutionHarness } from "../core/agentLoop.js";
4
+ import type { ContextState } from "../core/promptBuilder.js";
5
5
  export interface Message {
6
6
  role: "user" | "agent" | "system";
7
7
  content: string;
8
8
  }
9
9
  export interface ActiveToolCall {
10
+ id: string;
10
11
  name: string;
11
12
  args: Record<string, unknown>;
12
13
  status: ToolCallStatus;
@@ -19,6 +20,7 @@ interface AppProps {
19
20
  createHarness: () => Promise<ExecutionHarness>;
20
21
  initialState: ContextState;
21
22
  maxTokens: number;
23
+ onStateChange?: (state: ContextState) => void;
22
24
  benchmarkStartup?: boolean;
23
25
  onStartupBenchmarkMark?: (name: string) => void;
24
26
  onStartupBenchmarkComplete?: () => void;