orynacode-ai 1.16.9 → 1.16.11
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/package.json +1 -1
- package/src/cli/upgrade.ts +1 -0
- package/src/oryna/agent.ts +1 -1
- package/src/plugin/oryna.ts +28 -25
- package/src/provider/provider.ts +8 -3
- package/src/session/processor.ts +8 -1
- package/src/session/status.ts +5 -0
- package/src/tool/registry.ts +2 -2
- package/src/tool/reply.ts +1 -1
package/package.json
CHANGED
package/src/cli/upgrade.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { InstallationVersion } from "@opencode-ai/core/installation/version"
|
|
|
6
6
|
import { GlobalBus } from "@/bus/global"
|
|
7
7
|
|
|
8
8
|
export async function upgrade() {
|
|
9
|
+
if (InstallationVersion.startsWith("0.0.0-")) return
|
|
9
10
|
const config = await AppRuntime.runPromise(Config.Service.use((cfg) => cfg.getGlobal()))
|
|
10
11
|
if (config.autoupdate === false || Flag.OPENCODE_DISABLE_AUTOUPDATE) return
|
|
11
12
|
const method = await Installation.method()
|
package/src/oryna/agent.ts
CHANGED
|
@@ -60,7 +60,7 @@ export function start() {
|
|
|
60
60
|
|
|
61
61
|
const host = new URL(url).host
|
|
62
62
|
const user = os.userInfo().username || "user"
|
|
63
|
-
const token = `sk-local-${user}-${path.basename(process.cwd())}`
|
|
63
|
+
const token = `sk-local-${user}-${path.basename(process.env.ORYNA_GATE_WORKSPACE || process.cwd())}`
|
|
64
64
|
const wsUrl = `ws://${host}/ws?token=${token}&name=orynacode`
|
|
65
65
|
|
|
66
66
|
const connect = () => {
|
package/src/plugin/oryna.ts
CHANGED
|
@@ -224,6 +224,22 @@ function mapOrynaModels(data: Record<string, any>): Record<string, any> {
|
|
|
224
224
|
return result
|
|
225
225
|
}
|
|
226
226
|
|
|
227
|
+
export async function reAuthOryna(): Promise<string> {
|
|
228
|
+
const port = await startOAuthServer()
|
|
229
|
+
const state = randomState()
|
|
230
|
+
const redirectUri = `http://127.0.0.1:${port}/callback`
|
|
231
|
+
const loginUrl = `${ORYNA_LOGIN_URL}?redirect_uri=${encodeURIComponent(redirectUri)}&state=${state}`
|
|
232
|
+
|
|
233
|
+
const tokenPromise = waitForToken(state)
|
|
234
|
+
await open(loginUrl)
|
|
235
|
+
|
|
236
|
+
try {
|
|
237
|
+
return await tokenPromise
|
|
238
|
+
} finally {
|
|
239
|
+
stopOAuthServer()
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
227
243
|
export async function OrynaAuthPlugin(input: PluginInput): Promise<Hooks> {
|
|
228
244
|
return {
|
|
229
245
|
provider: {
|
|
@@ -251,15 +267,18 @@ export async function OrynaAuthPlugin(input: PluginInput): Promise<Hooks> {
|
|
|
251
267
|
|
|
252
268
|
if (jwtExpired(jwt)) {
|
|
253
269
|
if (!_refreshPromise) {
|
|
254
|
-
_refreshPromise = refreshJwt(jwt).catch(() => {
|
|
270
|
+
_refreshPromise = refreshJwt(jwt).catch(async () => {
|
|
255
271
|
_refreshPromise = undefined
|
|
256
|
-
|
|
272
|
+
log.info("oryna token refresh failed, removing stale auth")
|
|
273
|
+
await (input.client as any)._client.delete({ url: "/auth/{id}", path: { id: "oryna" } }).catch(() => {})
|
|
274
|
+
log.info("oryna stale auth removed")
|
|
275
|
+
return ""
|
|
257
276
|
})
|
|
258
277
|
}
|
|
259
278
|
jwt = await _refreshPromise
|
|
260
279
|
_refreshPromise = undefined
|
|
261
280
|
|
|
262
|
-
if (jwt !== auth.key) {
|
|
281
|
+
if (jwt && jwt !== auth.key) {
|
|
263
282
|
await input.client.auth
|
|
264
283
|
.set({
|
|
265
284
|
path: { id: "oryna" },
|
|
@@ -269,7 +288,7 @@ export async function OrynaAuthPlugin(input: PluginInput): Promise<Hooks> {
|
|
|
269
288
|
}
|
|
270
289
|
}
|
|
271
290
|
|
|
272
|
-
return { apiKey: jwt }
|
|
291
|
+
return jwt ? { apiKey: jwt } : {}
|
|
273
292
|
},
|
|
274
293
|
methods: [
|
|
275
294
|
{
|
|
@@ -277,36 +296,20 @@ export async function OrynaAuthPlugin(input: PluginInput): Promise<Hooks> {
|
|
|
277
296
|
label: "Login with Oryna AI (Browser)",
|
|
278
297
|
authorize: async () => {
|
|
279
298
|
try {
|
|
280
|
-
const
|
|
281
|
-
const state = randomState()
|
|
282
|
-
const redirectUri = `http://127.0.0.1:${port}/callback`
|
|
283
|
-
const loginUrl = `${ORYNA_LOGIN_URL}?redirect_uri=${encodeURIComponent(redirectUri)}&state=${state}`
|
|
284
|
-
|
|
285
|
-
const tokenPromise = waitForToken(state)
|
|
286
|
-
|
|
287
|
-
await open(loginUrl)
|
|
288
|
-
|
|
299
|
+
const tokenPromise = reAuthOryna()
|
|
289
300
|
return {
|
|
290
|
-
url:
|
|
301
|
+
url: ORYNA_LOGIN_URL,
|
|
291
302
|
instructions: "Complete login in your browser. This window will close automatically when done.",
|
|
292
303
|
method: "auto" as const,
|
|
293
304
|
callback: async () => {
|
|
294
305
|
try {
|
|
295
|
-
const
|
|
296
|
-
|
|
297
|
-
type: "success" as const,
|
|
298
|
-
key: token,
|
|
299
|
-
}
|
|
300
|
-
} catch (err) {
|
|
301
|
-
log.error("oryna login callback failed", { error: err })
|
|
306
|
+
return { type: "success" as const, key: await tokenPromise }
|
|
307
|
+
} catch {
|
|
302
308
|
return { type: "failed" as const }
|
|
303
|
-
} finally {
|
|
304
|
-
stopOAuthServer()
|
|
305
309
|
}
|
|
306
310
|
},
|
|
307
311
|
}
|
|
308
|
-
} catch
|
|
309
|
-
log.error("oryna login authorize failed", { error: err })
|
|
312
|
+
} catch {
|
|
310
313
|
return {
|
|
311
314
|
url: ORYNA_LOGIN_URL,
|
|
312
315
|
instructions: "Failed to start login server. Please use API key instead.",
|
package/src/provider/provider.ts
CHANGED
|
@@ -1521,9 +1521,9 @@ export const layer = Layer.effect(
|
|
|
1521
1521
|
toPublicInfo(dbInfo),
|
|
1522
1522
|
),
|
|
1523
1523
|
)
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1524
|
+
const opts = options ?? {}
|
|
1525
|
+
const patch: Partial<Info> = providers[providerID] ? { options: opts } : { source: "custom", options: opts }
|
|
1526
|
+
mergeProvider(providerID, patch)
|
|
1527
1527
|
}
|
|
1528
1528
|
|
|
1529
1529
|
for (const [id, fn] of Object.entries(custom(dep))) {
|
|
@@ -1686,6 +1686,11 @@ export const layer = Layer.effect(
|
|
|
1686
1686
|
|
|
1687
1687
|
if (baseURL !== undefined) options["baseURL"] = baseURL
|
|
1688
1688
|
if (options["apiKey"] === undefined && provider.key) options["apiKey"] = provider.key
|
|
1689
|
+
if (model.providerID === "orynagate") {
|
|
1690
|
+
const workspace = path.basename(process.env.ORYNA_GATE_WORKSPACE || process.cwd())
|
|
1691
|
+
const user = os.userInfo().username || "user"
|
|
1692
|
+
options["apiKey"] = `sk-local-${user}-${workspace}`
|
|
1693
|
+
}
|
|
1689
1694
|
if (model.headers)
|
|
1690
1695
|
options["headers"] = {
|
|
1691
1696
|
...options["headers"],
|
package/src/session/processor.ts
CHANGED
|
@@ -952,7 +952,14 @@ export const layer = Layer.effect(
|
|
|
952
952
|
sessionID: ctx.assistantMessage.sessionID,
|
|
953
953
|
error: ctx.assistantMessage.error,
|
|
954
954
|
})
|
|
955
|
-
|
|
955
|
+
if (
|
|
956
|
+
error.name === "ProviderAuthError" ||
|
|
957
|
+
(error.data as any)?.statusCode === 401
|
|
958
|
+
) {
|
|
959
|
+
yield* status.set(ctx.sessionID, { type: "needs_auth", providerID: String(input.model.providerID) })
|
|
960
|
+
} else {
|
|
961
|
+
yield* status.set(ctx.sessionID, { type: "idle" })
|
|
962
|
+
}
|
|
956
963
|
})
|
|
957
964
|
|
|
958
965
|
const process = Effect.fn("SessionProcessor.process")(function* (streamInput: LLM.StreamInput) {
|
package/src/session/status.ts
CHANGED
|
@@ -28,6 +28,10 @@ export const Info = Schema.Union([
|
|
|
28
28
|
Schema.Struct({
|
|
29
29
|
type: Schema.Literal("busy"),
|
|
30
30
|
}),
|
|
31
|
+
Schema.Struct({
|
|
32
|
+
type: Schema.Literal("needs_auth"),
|
|
33
|
+
providerID: Schema.String,
|
|
34
|
+
}),
|
|
31
35
|
]).annotate({ identifier: "SessionStatus" })
|
|
32
36
|
export type Info = Schema.Schema.Type<typeof Info>
|
|
33
37
|
|
|
@@ -76,6 +80,7 @@ export const layer = Layer.effect(
|
|
|
76
80
|
|
|
77
81
|
const set = Effect.fn("SessionStatus.set")(function* (sessionID: SessionID, status: Info) {
|
|
78
82
|
const data = yield* InstanceState.get(state)
|
|
83
|
+
if (status.type === "idle" && data.get(sessionID)?.type === "needs_auth") return
|
|
79
84
|
yield* events.publish(Event.Status, { sessionID, status })
|
|
80
85
|
if (status.type === "idle") {
|
|
81
86
|
yield* events.publish(Event.Idle, { sessionID })
|
package/src/tool/registry.ts
CHANGED
|
@@ -240,7 +240,7 @@ export const layer: Layer.Layer<
|
|
|
240
240
|
question: Tool.init(question),
|
|
241
241
|
lsp: Tool.init(lsptool),
|
|
242
242
|
plan: Tool.init(plan),
|
|
243
|
-
|
|
243
|
+
collab_reply: Tool.init(replytool),
|
|
244
244
|
})
|
|
245
245
|
|
|
246
246
|
return {
|
|
@@ -260,7 +260,7 @@ export const layer: Layer.Layer<
|
|
|
260
260
|
tool.search,
|
|
261
261
|
tool.skill,
|
|
262
262
|
tool.patch,
|
|
263
|
-
tool.
|
|
263
|
+
tool.collab_reply,
|
|
264
264
|
...(flags.experimentalLspTool ? [tool.lsp] : []),
|
|
265
265
|
...(flags.experimentalPlanMode && flags.client === "cli" ? [tool.plan] : []),
|
|
266
266
|
],
|