Compare commits
4 Commits
v0.2.2-dev
...
v0.2.3-dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ed769911d6 | ||
|
|
dd6efee900 | ||
|
|
48a16a6702 | ||
|
|
841b9daa1f |
12
package-lock.json
generated
12
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "codenomad-workspace",
|
"name": "codenomad-workspace",
|
||||||
"version": "0.2.2",
|
"version": "0.2.3",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "codenomad-workspace",
|
"name": "codenomad-workspace",
|
||||||
"version": "0.2.2",
|
"version": "0.2.3",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"7zip-bin": "^5.2.0",
|
"7zip-bin": "^5.2.0",
|
||||||
"google-auth-library": "^10.5.0"
|
"google-auth-library": "^10.5.0"
|
||||||
@@ -8613,7 +8613,7 @@
|
|||||||
},
|
},
|
||||||
"packages/electron-app": {
|
"packages/electron-app": {
|
||||||
"name": "@neuralnomads/codenomad-electron-app",
|
"name": "@neuralnomads/codenomad-electron-app",
|
||||||
"version": "0.2.2",
|
"version": "0.2.3",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codenomad/ui": "file:../ui",
|
"@codenomad/ui": "file:../ui",
|
||||||
"@neuralnomads/codenomad": "file:../server"
|
"@neuralnomads/codenomad": "file:../server"
|
||||||
@@ -8641,7 +8641,7 @@
|
|||||||
},
|
},
|
||||||
"packages/server": {
|
"packages/server": {
|
||||||
"name": "@neuralnomads/codenomad",
|
"name": "@neuralnomads/codenomad",
|
||||||
"version": "0.2.2",
|
"version": "0.2.3",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fastify/cors": "^8.5.0",
|
"@fastify/cors": "^8.5.0",
|
||||||
"@fastify/reply-from": "^9.8.0",
|
"@fastify/reply-from": "^9.8.0",
|
||||||
@@ -8680,14 +8680,14 @@
|
|||||||
},
|
},
|
||||||
"packages/tauri-app": {
|
"packages/tauri-app": {
|
||||||
"name": "@codenomad/tauri-app",
|
"name": "@codenomad/tauri-app",
|
||||||
"version": "0.2.2",
|
"version": "0.2.3",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@tauri-apps/cli": "^2.9.4"
|
"@tauri-apps/cli": "^2.9.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"packages/ui": {
|
"packages/ui": {
|
||||||
"name": "@codenomad/ui",
|
"name": "@codenomad/ui",
|
||||||
"version": "0.2.2",
|
"version": "0.2.3",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@git-diff-view/solid": "^0.0.8",
|
"@git-diff-view/solid": "^0.0.8",
|
||||||
"@kobalte/core": "0.13.11",
|
"@kobalte/core": "0.13.11",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "codenomad-workspace",
|
"name": "codenomad-workspace",
|
||||||
"version": "0.2.2",
|
"version": "0.2.3",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "CodeNomad monorepo workspace",
|
"description": "CodeNomad monorepo workspace",
|
||||||
"workspaces": {
|
"workspaces": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@neuralnomads/codenomad-electron-app",
|
"name": "@neuralnomads/codenomad-electron-app",
|
||||||
"version": "0.2.2",
|
"version": "0.2.3",
|
||||||
"description": "CodeNomad - AI coding assistant",
|
"description": "CodeNomad - AI coding assistant",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Neural Nomads",
|
"name": "Neural Nomads",
|
||||||
|
|||||||
4
packages/server/package-lock.json
generated
4
packages/server/package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "@neuralnomads/codenomad",
|
"name": "@neuralnomads/codenomad",
|
||||||
"version": "0.2.2",
|
"version": "0.2.3",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "@neuralnomads/codenomad",
|
"name": "@neuralnomads/codenomad",
|
||||||
"version": "0.2.2",
|
"version": "0.2.3",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fastify/cors": "^8.5.0",
|
"@fastify/cors": "^8.5.0",
|
||||||
"commander": "^12.1.0",
|
"commander": "^12.1.0",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@neuralnomads/codenomad",
|
"name": "@neuralnomads/codenomad",
|
||||||
"version": "0.2.2",
|
"version": "0.2.3",
|
||||||
"description": "CodeNomad Server",
|
"description": "CodeNomad Server",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Neural Nomads",
|
"name": "Neural Nomads",
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
import { fetch } from "undici"
|
import { Agent, fetch } from "undici"
|
||||||
|
import { Agent as UndiciAgent } from "undici"
|
||||||
import { EventBus } from "../events/bus"
|
import { EventBus } from "../events/bus"
|
||||||
import { Logger } from "../logger"
|
import { Logger } from "../logger"
|
||||||
import { WorkspaceManager } from "./manager"
|
import { WorkspaceManager } from "./manager"
|
||||||
import { InstanceStreamEvent, InstanceStreamStatus } from "../api-types"
|
import { InstanceStreamEvent, InstanceStreamStatus } from "../api-types"
|
||||||
|
|
||||||
const INSTANCE_HOST = "127.0.0.1"
|
const INSTANCE_HOST = "127.0.0.1"
|
||||||
|
const STREAM_AGENT = new UndiciAgent({ bodyTimeout: 0, headersTimeout: 0 })
|
||||||
const RECONNECT_DELAY_MS = 1000
|
const RECONNECT_DELAY_MS = 1000
|
||||||
|
|
||||||
interface InstanceEventBridgeOptions {
|
interface InstanceEventBridgeOptions {
|
||||||
@@ -24,8 +26,8 @@ export class InstanceEventBridge {
|
|||||||
constructor(private readonly options: InstanceEventBridgeOptions) {
|
constructor(private readonly options: InstanceEventBridgeOptions) {
|
||||||
const bus = this.options.eventBus
|
const bus = this.options.eventBus
|
||||||
bus.on("workspace.started", (event) => this.startStream(event.workspace.id))
|
bus.on("workspace.started", (event) => this.startStream(event.workspace.id))
|
||||||
bus.on("workspace.stopped", (event) => this.stopStream(event.workspaceId))
|
bus.on("workspace.stopped", (event) => this.stopStream(event.workspaceId, "workspace stopped"))
|
||||||
bus.on("workspace.error", (event) => this.stopStream(event.workspace.id))
|
bus.on("workspace.error", (event) => this.stopStream(event.workspace.id, "workspace error"))
|
||||||
}
|
}
|
||||||
|
|
||||||
shutdown() {
|
shutdown() {
|
||||||
@@ -59,14 +61,14 @@ export class InstanceEventBridge {
|
|||||||
this.streams.set(workspaceId, { controller, task })
|
this.streams.set(workspaceId, { controller, task })
|
||||||
}
|
}
|
||||||
|
|
||||||
private stopStream(workspaceId: string) {
|
private stopStream(workspaceId: string, reason?: string) {
|
||||||
const active = this.streams.get(workspaceId)
|
const active = this.streams.get(workspaceId)
|
||||||
if (!active) {
|
if (!active) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
active.controller.abort()
|
active.controller.abort()
|
||||||
this.streams.delete(workspaceId)
|
this.streams.delete(workspaceId)
|
||||||
this.publishStatus(workspaceId, "disconnected")
|
this.publishStatus(workspaceId, "disconnected", reason)
|
||||||
}
|
}
|
||||||
|
|
||||||
private async runStream(workspaceId: string, signal: AbortSignal) {
|
private async runStream(workspaceId: string, signal: AbortSignal) {
|
||||||
@@ -97,6 +99,7 @@ export class InstanceEventBridge {
|
|||||||
const response = await fetch(url, {
|
const response = await fetch(url, {
|
||||||
headers: { Accept: "text/event-stream" },
|
headers: { Accept: "text/event-stream" },
|
||||||
signal,
|
signal,
|
||||||
|
dispatcher: STREAM_AGENT,
|
||||||
})
|
})
|
||||||
|
|
||||||
if (!response.ok || !response.body) {
|
if (!response.ok || !response.body) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@codenomad/tauri-app",
|
"name": "@codenomad/tauri-app",
|
||||||
"version": "0.2.2",
|
"version": "0.2.3",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "tauri dev",
|
"dev": "tauri dev",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@codenomad/ui",
|
"name": "@codenomad/ui",
|
||||||
"version": "0.2.2",
|
"version": "0.2.3",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -58,8 +58,11 @@ class SSEManager {
|
|||||||
serverEvents.on("instance.eventStatus", (event) => {
|
serverEvents.on("instance.eventStatus", (event) => {
|
||||||
const payload = event as InstanceStatusPayload
|
const payload = event as InstanceStatusPayload
|
||||||
this.updateConnectionStatus(payload.instanceId, payload.status)
|
this.updateConnectionStatus(payload.instanceId, payload.status)
|
||||||
if (payload.status === "error") {
|
if (payload.status === "disconnected") {
|
||||||
const reason = payload.reason ?? "Instance stream error"
|
if (payload.reason === "workspace stopped") {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const reason = payload.reason ?? "Instance disconnected"
|
||||||
void this.onConnectionLost?.(payload.instanceId, reason)
|
void this.onConnectionLost?.(payload.instanceId, reason)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user