fix: fix npm scope prefix and Windows ARM64 binary name. Also resolve typecheck issues

This commit is contained in:
Johnny Amancio
2026-04-09 21:18:38 +02:00
parent 3c65d939c1
commit 8bcdb1377b
10 changed files with 2872 additions and 1313 deletions
+1 -1
View File
@@ -13,7 +13,7 @@ export const SIDECAR_BINARIES: Array<{ rustTarget: string; ocBinary: string; ass
},
{
rustTarget: "aarch64-pc-windows-msvc",
ocBinary: "opencode-windows-arm64",
ocBinary: "@kilocode/cli-windows-arm64", // kilocode_change
assetExt: "zip",
},
{
+6 -6
View File
@@ -26,7 +26,8 @@ export namespace Installation {
}
async function upgradeCurl(target: string) {
const body = await fetch("https://kilo.ai/install").then((res) => { // kilocode_change
const body = await fetch("https://kilo.ai/install").then((res) => {
// kilocode_change
if (!res.ok) throw new Error(res.statusText)
return res.text()
})
@@ -136,8 +137,7 @@ export namespace Installation {
for (const check of checks) {
const output = await check.command()
// kilocode_change start - check for @kilocode/cli instead of opencode-ai for JS package managers
const installedName =
check.name === "brew" ? "opencode" : "@kilocode/cli" // kilocode_change - removed choco/scoop
const installedName = check.name === "brew" ? "opencode" : "@kilocode/cli" // kilocode_change - removed choco/scoop
// kilocode_change end
if (output.includes(installedName)) {
return check.name
@@ -171,13 +171,13 @@ export namespace Installation {
result = await upgradeCurl(target)
break
case "npm":
result = await Process.run(["npm", "install", "-g", `kilocode/cli@${target}`], { nothrow: true }) // kilocode_change
result = await Process.run(["npm", "install", "-g", `@kilocode/cli@${target}`], { nothrow: true }) // kilocode_change
break
case "pnpm":
result = await Process.run(["pnpm", "install", "-g", `kilocode/cli@${target}`], { nothrow: true }) // kilocode_change
result = await Process.run(["pnpm", "install", "-g", `@kilocode/cli@${target}`], { nothrow: true }) // kilocode_change
break
case "bun":
result = await Process.run(["bun", "install", "-g", `kilocode/cli@${target}`], { nothrow: true }) // kilocode_change
result = await Process.run(["bun", "install", "-g", `@kilocode/cli@${target}`], { nothrow: true }) // kilocode_change
break
case "brew": {
const formula = await getBrewFormula()
@@ -83,7 +83,7 @@ export namespace RemoteSender {
})
async function directoryFor(sid: string): Promise<string> {
const info = await Session.get(sid).catch(() => undefined)
const info = await Session.get(SessionID.make(sid)).catch(() => undefined)
return info?.directory ?? options.directory
}
@@ -7,6 +7,7 @@ import { Global } from "@/global"
import { Identifier } from "@/id/id"
import { Instance } from "@/project/instance"
import { Provider } from "@/provider/provider"
import { ProviderID, ModelID } from "@/provider/schema"
import { Question } from "@/question"
import { Session } from "@/session"
import { SessionID, MessageID, PartID } from "@/session/schema"
@@ -125,7 +126,7 @@ export namespace PlanFollowup {
const ModelState = z
.object({
model: z.record(z.string(), z.object({ providerID: z.string(), modelID: z.string() })).optional(),
model: z.record(z.string(), z.object({ providerID: ProviderID.zod, modelID: ModelID.zod })).optional(),
variant: z.record(z.string(), z.string().optional()).optional(),
})
.passthrough()
+1
View File
@@ -275,6 +275,7 @@ export namespace Server {
.route("/permission", PermissionRoutes())
.route("/permission", PermissionKilocodeRoutes()) // kilocode_change
.route("/question", QuestionRoutes())
.route("/network", NetworkRoutes()) // kilocode_change
.route("/provider", ProviderRoutes())
.route("/telemetry", TelemetryRoutes()) // kilocode_change
.route("/remote", RemoteRoutes()) // kilocode_change
@@ -14,6 +14,7 @@ mock.module("@/kilo-sessions/remote-sender", () => ({
import type { Provider } from "../../src/provider/provider"
import type { LLM as LLMType } from "../../src/session/llm"
import type { MessageV2 } from "../../src/session/message-v2"
import { MessageID } from "../../src/session/schema"
import { Log } from "../../src/util/log"
import { tmpdir } from "../fixture/fixture"
@@ -64,7 +65,7 @@ describe("session processor network offline", () => {
const m = model()
const session = await Session.create({})
const user = (await Session.updateMessage({
id: Identifier.ascending("message"),
id: MessageID.make(Identifier.ascending("message")),
role: "user",
sessionID: session.id,
time: { created: Date.now() },
@@ -73,7 +74,7 @@ describe("session processor network offline", () => {
tools: {},
})) as MessageV2.User
const assistant = (await Session.updateMessage({
id: Identifier.ascending("message"),
id: MessageID.make(Identifier.ascending("message")),
parentID: user.id,
role: "assistant",
mode: "code",
+1 -1
View File
@@ -194,7 +194,7 @@ describe("session.message-v2.fromError", () => {
syscall: "connect",
message: "connect ECONNREFUSED 127.0.0.1:3000",
},
{ providerID: "test" },
{ providerID: ProviderID.make("test") },
) as MessageV2.APIError
expect(result.data.isRetryable).toBe(true)
+101 -101
View File
@@ -2814,6 +2814,102 @@ export class Question extends HeyApiClient {
}
}
export class Network extends HeyApiClient {
/**
* List pending network waits
*
* Get all pending network reconnect requests across all sessions.
*/
public list<ThrowOnError extends boolean = false>(
parameters?: {
directory?: string
workspace?: string
},
options?: Options<never, ThrowOnError>,
) {
const params = buildClientParams(
[parameters],
[
{
args: [
{ in: "query", key: "directory" },
{ in: "query", key: "workspace" },
],
},
],
)
return (options?.client ?? this.client).get<NetworkListResponses, unknown, ThrowOnError>({
url: "/network",
...options,
...params,
})
}
/**
* Resume after network wait
*
* Resume a pending session after reconnecting network-dependent services.
*/
public reply<ThrowOnError extends boolean = false>(
parameters: {
requestID: string
directory?: string
workspace?: string
},
options?: Options<never, ThrowOnError>,
) {
const params = buildClientParams(
[parameters],
[
{
args: [
{ in: "path", key: "requestID" },
{ in: "query", key: "directory" },
{ in: "query", key: "workspace" },
],
},
],
)
return (options?.client ?? this.client).post<NetworkReplyResponses, NetworkReplyErrors, ThrowOnError>({
url: "/network/{requestID}/reply",
...options,
...params,
})
}
/**
* Reject network resume request
*
* Stop a pending session instead of resuming after network reconnect.
*/
public reject<ThrowOnError extends boolean = false>(
parameters: {
requestID: string
directory?: string
workspace?: string
},
options?: Options<never, ThrowOnError>,
) {
const params = buildClientParams(
[parameters],
[
{
args: [
{ in: "path", key: "requestID" },
{ in: "query", key: "directory" },
{ in: "query", key: "workspace" },
],
},
],
)
return (options?.client ?? this.client).post<NetworkRejectResponses, NetworkRejectErrors, ThrowOnError>({
url: "/network/{requestID}/reject",
...options,
...params,
})
}
}
export class Oauth extends HeyApiClient {
/**
* OAuth authorize
@@ -5291,102 +5387,6 @@ export class Event extends HeyApiClient {
}
}
export class Network extends HeyApiClient {
/**
* List pending network waits
*
* Get all pending network reconnect requests across all sessions.
*/
public list<ThrowOnError extends boolean = false>(
parameters?: {
directory?: string
workspace?: string
},
options?: Options<never, ThrowOnError>,
) {
const params = buildClientParams(
[parameters],
[
{
args: [
{ in: "query", key: "directory" },
{ in: "query", key: "workspace" },
],
},
],
)
return (options?.client ?? this.client).get<NetworkListResponses, unknown, ThrowOnError>({
url: "/network",
...options,
...params,
})
}
/**
* Resume after network wait
*
* Resume a pending session after reconnecting network-dependent services.
*/
public reply<ThrowOnError extends boolean = false>(
parameters: {
requestID: string
directory?: string
workspace?: string
},
options?: Options<never, ThrowOnError>,
) {
const params = buildClientParams(
[parameters],
[
{
args: [
{ in: "path", key: "requestID" },
{ in: "query", key: "directory" },
{ in: "query", key: "workspace" },
],
},
],
)
return (options?.client ?? this.client).post<NetworkReplyResponses, NetworkReplyErrors, ThrowOnError>({
url: "/network/{requestID}/reply",
...options,
...params,
})
}
/**
* Reject network resume request
*
* Stop a pending session instead of resuming after network reconnect.
*/
public reject<ThrowOnError extends boolean = false>(
parameters: {
requestID: string
directory?: string
workspace?: string
},
options?: Options<never, ThrowOnError>,
) {
const params = buildClientParams(
[parameters],
[
{
args: [
{ in: "path", key: "requestID" },
{ in: "query", key: "directory" },
{ in: "query", key: "workspace" },
],
},
],
)
return (options?.client ?? this.client).post<NetworkRejectResponses, NetworkRejectErrors, ThrowOnError>({
url: "/network/{requestID}/reject",
...options,
...params,
})
}
}
export class KiloClient extends HeyApiClient {
public static readonly __registry = new HeyApiRegistry<KiloClient>()
@@ -5455,6 +5455,11 @@ export class KiloClient extends HeyApiClient {
return (this._question ??= new Question({ client: this.client }))
}
private _network?: Network
get network(): Network {
return (this._network ??= new Network({ client: this.client }))
}
private _provider?: Provider
get provider(): Provider {
return (this._provider ??= new Provider({ client: this.client }))
@@ -5549,9 +5554,4 @@ export class KiloClient extends HeyApiClient {
get event(): Event {
return (this._event ??= new Event({ client: this.client }))
}
private _network?: Network
get network(): Network {
return (this._network ??= new Network({ client: this.client }))
}
}
+206 -206
View File
@@ -97,6 +97,114 @@ export type EventFileEdited = {
}
}
export type EventTuiPromptAppend = {
type: "tui.prompt.append"
properties: {
text: string
}
}
export type EventTuiCommandExecute = {
type: "tui.command.execute"
properties: {
command:
| "session.list"
| "session.new"
| "session.share"
| "session.interrupt"
| "session.compact"
| "session.page.up"
| "session.page.down"
| "session.line.up"
| "session.line.down"
| "session.half.page.up"
| "session.half.page.down"
| "session.first"
| "session.last"
| "prompt.clear"
| "prompt.submit"
| "agent.cycle"
| string
}
}
export type EventTuiToastShow = {
type: "tui.toast.show"
properties: {
title?: string
message: string
variant: "info" | "success" | "warning" | "error"
/**
* Duration in milliseconds
*/
duration?: number
}
}
export type EventTuiSessionSelect = {
type: "tui.session.select"
properties: {
/**
* Session ID to navigate to
*/
sessionID: string
}
}
export type EventMcpToolsChanged = {
type: "mcp.tools.changed"
properties: {
server: string
}
}
export type EventMcpBrowserOpenFailed = {
type: "mcp.browser.open.failed"
properties: {
mcpName: string
url: string
}
}
export type SessionNetworkWait = {
id: string
sessionID: string
message: string
restored: boolean
time: {
created: number
}
}
export type EventSessionNetworkAsked = {
type: "session.network.asked"
properties: SessionNetworkWait
}
export type EventSessionNetworkReplied = {
type: "session.network.replied"
properties: {
sessionID: string
requestID: string
}
}
export type EventSessionNetworkRejected = {
type: "session.network.rejected"
properties: {
sessionID: string
requestID: string
}
}
export type EventSessionNetworkRestored = {
type: "session.network.restored"
properties: {
sessionID: string
requestID: string
}
}
export type OutputFormatText = {
type: "text"
}
@@ -738,75 +846,6 @@ export type EventTodoUpdated = {
}
}
export type EventTuiPromptAppend = {
type: "tui.prompt.append"
properties: {
text: string
}
}
export type EventTuiCommandExecute = {
type: "tui.command.execute"
properties: {
command:
| "session.list"
| "session.new"
| "session.share"
| "session.interrupt"
| "session.compact"
| "session.page.up"
| "session.page.down"
| "session.line.up"
| "session.line.down"
| "session.half.page.up"
| "session.half.page.down"
| "session.first"
| "session.last"
| "prompt.clear"
| "prompt.submit"
| "agent.cycle"
| string
}
}
export type EventTuiToastShow = {
type: "tui.toast.show"
properties: {
title?: string
message: string
variant: "info" | "success" | "warning" | "error"
/**
* Duration in milliseconds
*/
duration?: number
}
}
export type EventTuiSessionSelect = {
type: "tui.session.select"
properties: {
/**
* Session ID to navigate to
*/
sessionID: string
}
}
export type EventMcpToolsChanged = {
type: "mcp.tools.changed"
properties: {
server: string
}
}
export type EventMcpBrowserOpenFailed = {
type: "mcp.browser.open.failed"
properties: {
mcpName: string
url: string
}
}
export type EventCommandExecuted = {
type: "command.executed"
properties: {
@@ -1018,6 +1057,16 @@ export type Event =
| EventLspClientDiagnostics
| EventLspUpdated
| EventFileEdited
| EventTuiPromptAppend
| EventTuiCommandExecute
| EventTuiToastShow
| EventTuiSessionSelect
| EventMcpToolsChanged
| EventMcpBrowserOpenFailed
| EventSessionNetworkAsked
| EventSessionNetworkReplied
| EventSessionNetworkRejected
| EventSessionNetworkRestored
| EventMessageUpdated
| EventMessageRemoved
| EventMessagePartUpdated
@@ -1030,19 +1079,9 @@ export type Event =
| EventQuestionAsked
| EventQuestionReplied
| EventQuestionRejected
| EventSessionNetworkAsked
| EventSessionNetworkReplied
| EventSessionNetworkRejected
| EventSessionNetworkRestored
| EventSessionCompacted
| EventFileWatcherUpdated
| EventTodoUpdated
| EventTuiPromptAppend
| EventTuiCommandExecute
| EventTuiToastShow
| EventTuiSessionSelect
| EventMcpToolsChanged
| EventMcpBrowserOpenFailed
| EventCommandExecuted
| EventSessionCreated
| EventSessionUpdated
@@ -1286,7 +1325,7 @@ export type ProviderConfig = {
*/
setCacheKey?: boolean
/**
* Timeout in milliseconds for requests to this provider. Default is 300000 (5 minutes). Set to false to disable timeout.
* Timeout in milliseconds for requests to this provider. Default is 120000 (2 minutes). Set to false to disable timeout.
*/
timeout?: number | false
/**
@@ -2007,45 +2046,6 @@ export type FormatterStatus = {
enabled: boolean
}
export type SessionNetworkWait = {
id: string
sessionID: string
message: string
restored: boolean
time: {
created: number
}
}
export type EventSessionNetworkAsked = {
type: "session.network.asked"
properties: SessionNetworkWait
}
export type EventSessionNetworkReplied = {
type: "session.network.replied"
properties: {
sessionID: string
requestID: string
}
}
export type EventSessionNetworkRejected = {
type: "session.network.rejected"
properties: {
sessionID: string
requestID: string
}
}
export type EventSessionNetworkRestored = {
type: "session.network.restored"
properties: {
sessionID: string
requestID: string
}
}
export type GlobalHealthData = {
body?: never
path?: never
@@ -4243,6 +4243,93 @@ export type QuestionRejectResponses = {
export type QuestionRejectResponse = QuestionRejectResponses[keyof QuestionRejectResponses]
export type NetworkListData = {
body?: never
path?: never
query?: {
directory?: string
workspace?: string
}
url: "/network"
}
export type NetworkListResponses = {
/**
* List of pending network reconnect requests
*/
200: Array<SessionNetworkWait>
}
export type NetworkListResponse = NetworkListResponses[keyof NetworkListResponses]
export type NetworkReplyData = {
body?: never
path: {
requestID: string
}
query?: {
directory?: string
workspace?: string
}
url: "/network/{requestID}/reply"
}
export type NetworkReplyErrors = {
/**
* Bad request
*/
400: BadRequestError
/**
* Not found
*/
404: NotFoundError
}
export type NetworkReplyError = NetworkReplyErrors[keyof NetworkReplyErrors]
export type NetworkReplyResponses = {
/**
* Network wait resumed successfully
*/
200: boolean
}
export type NetworkReplyResponse = NetworkReplyResponses[keyof NetworkReplyResponses]
export type NetworkRejectData = {
body?: never
path: {
requestID: string
}
query?: {
directory?: string
workspace?: string
}
url: "/network/{requestID}/reject"
}
export type NetworkRejectErrors = {
/**
* Bad request
*/
400: BadRequestError
/**
* Not found
*/
404: NotFoundError
}
export type NetworkRejectError = NetworkRejectErrors[keyof NetworkRejectErrors]
export type NetworkRejectResponses = {
/**
* Network wait rejected successfully
*/
200: boolean
}
export type NetworkRejectResponse = NetworkRejectResponses[keyof NetworkRejectResponses]
export type ProviderListData = {
body?: never
path?: never
@@ -6261,90 +6348,3 @@ export type EventSubscribeResponses = {
}
export type EventSubscribeResponse = EventSubscribeResponses[keyof EventSubscribeResponses]
export type NetworkListData = {
body?: never
path?: never
query?: {
directory?: string
workspace?: string
}
url: "/network"
}
export type NetworkListResponses = {
/**
* List of pending network reconnect requests
*/
200: Array<SessionNetworkWait>
}
export type NetworkListResponse = NetworkListResponses[keyof NetworkListResponses]
export type NetworkReplyData = {
body?: never
path: {
requestID: string
}
query?: {
directory?: string
workspace?: string
}
url: "/network/{requestID}/reply"
}
export type NetworkReplyErrors = {
/**
* Bad request
*/
400: BadRequestError
/**
* Not found
*/
404: NotFoundError
}
export type NetworkReplyError = NetworkReplyErrors[keyof NetworkReplyErrors]
export type NetworkReplyResponses = {
/**
* Network wait resumed successfully
*/
200: boolean
}
export type NetworkReplyResponse = NetworkReplyResponses[keyof NetworkReplyResponses]
export type NetworkRejectData = {
body?: never
path: {
requestID: string
}
query?: {
directory?: string
workspace?: string
}
url: "/network/{requestID}/reject"
}
export type NetworkRejectErrors = {
/**
* Bad request
*/
400: BadRequestError
/**
* Not found
*/
404: NotFoundError
}
export type NetworkRejectError = NetworkRejectErrors[keyof NetworkRejectErrors]
export type NetworkRejectResponses = {
/**
* Network wait rejected successfully
*/
200: boolean
}
export type NetworkRejectResponse = NetworkRejectResponses[keyof NetworkRejectResponses]
+2550 -994
View File
File diff suppressed because it is too large Load Diff