@offworld/sdk 0.1.0 → 0.1.1
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/README.md +32 -48
- package/dist/index.d.mts +3 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +68 -27
- package/dist/index.mjs.map +1 -1
- package/package.json +41 -41
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# @offworld/sdk
|
|
2
2
|
|
|
3
|
-
Core business logic for Offworld
|
|
3
|
+
Core business logic for Offworld.
|
|
4
|
+
|
|
5
|
+
Powers the CLI and web app with git clone management, AI reference generation, and agent skill distribution.
|
|
4
6
|
|
|
5
7
|
## Installation
|
|
6
8
|
|
|
@@ -10,31 +12,31 @@ bun add @offworld/sdk
|
|
|
10
12
|
|
|
11
13
|
## Modules
|
|
12
14
|
|
|
13
|
-
| Module
|
|
14
|
-
|
|
|
15
|
-
| `config.ts`
|
|
16
|
-
| `paths.ts`
|
|
17
|
-
| `clone.ts`
|
|
18
|
-
| `index-manager.ts`
|
|
19
|
-
| `generate.ts`
|
|
20
|
-
| `sync.ts`
|
|
21
|
-
| `auth.ts`
|
|
22
|
-
| `agents.ts`
|
|
23
|
-
| `agents-md.ts`
|
|
24
|
-
| `repo-source.ts`
|
|
25
|
-
| `manifest.ts`
|
|
26
|
-
| `dep-mappings.ts`
|
|
27
|
-
| `reference-matcher.ts` | Match deps to installed references
|
|
28
|
-
| `repo-manager.ts`
|
|
29
|
-
| `models.ts`
|
|
30
|
-
| `installation.ts`
|
|
31
|
-
|
|
32
|
-
##
|
|
15
|
+
| Module | Description |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| `config.ts` | Config load/save, path utilities |
|
|
18
|
+
| `paths.ts` | XDG-compliant path resolution |
|
|
19
|
+
| `clone.ts` | Git clone/update/remove |
|
|
20
|
+
| `index-manager.ts` | Global + project map management |
|
|
21
|
+
| `generate.ts` | AI reference generation |
|
|
22
|
+
| `sync.ts` | Convex client for push/pull |
|
|
23
|
+
| `auth.ts` | WorkOS token management |
|
|
24
|
+
| `agents.ts` | Agent registry |
|
|
25
|
+
| `agents-md.ts` | AGENTS.md reference table generation |
|
|
26
|
+
| `repo-source.ts` | Parse repo input (URL, owner/repo, local) |
|
|
27
|
+
| `manifest.ts` | Dependency parsing (package.json, etc.) |
|
|
28
|
+
| `dep-mappings.ts` | npm package to GitHub repo resolution |
|
|
29
|
+
| `reference-matcher.ts` | Match deps to installed references |
|
|
30
|
+
| `repo-manager.ts` | Bulk repo operations (update, prune, gc) |
|
|
31
|
+
| `models.ts` | AI provider/model registry |
|
|
32
|
+
| `installation.ts` | Upgrade/uninstall utilities |
|
|
33
|
+
|
|
34
|
+
## Usage
|
|
33
35
|
|
|
34
36
|
### Config & Paths
|
|
35
37
|
|
|
36
38
|
```typescript
|
|
37
|
-
import { loadConfig, saveConfig, Paths
|
|
39
|
+
import { loadConfig, saveConfig, Paths } from "@offworld/sdk";
|
|
38
40
|
|
|
39
41
|
const config = loadConfig();
|
|
40
42
|
const skillDir = Paths.offworldDir;
|
|
@@ -44,7 +46,7 @@ const globalMap = Paths.globalMap;
|
|
|
44
46
|
### Clone Management
|
|
45
47
|
|
|
46
48
|
```typescript
|
|
47
|
-
import { cloneRepo, updateRepo, removeRepo
|
|
49
|
+
import { cloneRepo, updateRepo, removeRepo } from "@offworld/sdk";
|
|
48
50
|
|
|
49
51
|
await cloneRepo(repoSource, { shallow: true });
|
|
50
52
|
await updateRepo("owner/repo");
|
|
@@ -77,43 +79,27 @@ import { pullReference, pushReference, checkRemote } from "@offworld/sdk";
|
|
|
77
79
|
|
|
78
80
|
const ref = await pullReference("owner/repo");
|
|
79
81
|
await pushReference("owner/repo", referenceData);
|
|
80
|
-
const status = await checkRemote("owner/repo");
|
|
81
82
|
```
|
|
82
83
|
|
|
83
84
|
### Dependency Resolution
|
|
84
85
|
|
|
85
86
|
```typescript
|
|
86
|
-
import {
|
|
87
|
-
parseDependencies,
|
|
88
|
-
resolveDependencyRepo,
|
|
89
|
-
matchDependenciesToReferences,
|
|
90
|
-
} from "@offworld/sdk";
|
|
87
|
+
import { parseDependencies, resolveDependencyRepo, matchDependenciesToReferences } from "@offworld/sdk";
|
|
91
88
|
|
|
92
89
|
const deps = parseDependencies("package.json");
|
|
93
90
|
const repo = await resolveDependencyRepo("zod");
|
|
94
91
|
const matches = matchDependenciesToReferences(deps);
|
|
95
92
|
```
|
|
96
93
|
|
|
97
|
-
### Agent Management
|
|
98
|
-
|
|
99
|
-
```typescript
|
|
100
|
-
import { detectInstalledAgents, agents } from "@offworld/sdk";
|
|
101
|
-
|
|
102
|
-
const installed = detectInstalledAgents();
|
|
103
|
-
console.log(agents); // AgentConfig[]
|
|
104
|
-
```
|
|
105
|
-
|
|
106
94
|
## Data Paths
|
|
107
95
|
|
|
108
|
-
| Purpose
|
|
109
|
-
|
|
|
110
|
-
| Config
|
|
111
|
-
| Data root
|
|
112
|
-
| Skill dir
|
|
113
|
-
| Global map | `Paths.globalMap`
|
|
96
|
+
| Purpose | Getter |
|
|
97
|
+
| --- | --- |
|
|
98
|
+
| Config | `Paths.config` |
|
|
99
|
+
| Data root | `Paths.data` |
|
|
100
|
+
| Skill dir | `Paths.offworldDir` |
|
|
101
|
+
| Global map | `Paths.globalMap` |
|
|
114
102
|
| References | `Paths.referencesDir` |
|
|
115
|
-
| Auth | `Paths.auth` |
|
|
116
|
-
| State | `Paths.state` |
|
|
117
103
|
|
|
118
104
|
## Commands
|
|
119
105
|
|
|
@@ -122,6 +108,4 @@ bun run build # Build with tsdown
|
|
|
122
108
|
bun run dev # Watch mode
|
|
123
109
|
bun run typecheck # Type check
|
|
124
110
|
bun run test # Run tests
|
|
125
|
-
bun run test:unit # Unit tests only
|
|
126
|
-
bun run test:integration # Integration tests
|
|
127
111
|
```
|
package/dist/index.d.mts
CHANGED
|
@@ -5,7 +5,7 @@ import { Agent, Config, Config as Config$1, FileIndex, FileIndexEntry, FileRole,
|
|
|
5
5
|
* SDK Constants
|
|
6
6
|
*/
|
|
7
7
|
/** SDK version - must match package.json */
|
|
8
|
-
declare const VERSION = "0.1.
|
|
8
|
+
declare const VERSION = "0.1.1";
|
|
9
9
|
/**
|
|
10
10
|
* Default patterns to ignore when scanning repositories.
|
|
11
11
|
* Includes directories, binary files, IDE configs, and build outputs.
|
|
@@ -391,11 +391,11 @@ declare class OpenCodeReferenceError extends Error {
|
|
|
391
391
|
constructor(message: string, details?: unknown | undefined);
|
|
392
392
|
}
|
|
393
393
|
/**
|
|
394
|
-
* Error when the @opencode-ai/sdk package is not installed
|
|
394
|
+
* Error when the @opencode-ai/sdk package is not installed or invalid
|
|
395
395
|
*/
|
|
396
396
|
declare class OpenCodeSDKError extends OpenCodeReferenceError {
|
|
397
397
|
readonly _tag: "OpenCodeSDKError";
|
|
398
|
-
constructor();
|
|
398
|
+
constructor(message?: string);
|
|
399
399
|
}
|
|
400
400
|
//#endregion
|
|
401
401
|
//#region src/sync.d.ts
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/constants.ts","../src/config.ts","../src/paths.ts","../src/repo-source.ts","../src/index-manager.ts","../src/map.ts","../src/clone.ts","../src/ai/opencode.ts","../src/ai/errors.ts","../src/sync.ts","../src/auth.ts","../src/generate.ts","../src/agents.ts","../src/manifest.ts","../src/dep-mappings.ts","../src/reference-matcher.ts","../src/agents-md.ts","../src/repo-manager.ts","../src/models.ts","../src/installation.ts"],"mappings":";;;;;;AAKA;AAAA,cAAa,OAAA;;;;AAMb;cAAa,uBAAA;;;;;;;iBCGG,WAAA,CAAA;AAAA,iBAIA,WAAA,CAAY,MAAA,GAAS,QAAA;;;;;;;AAJrC;;iBAiBgB,WAAA,CACf,QAAA,UACA,QAAA,sCACA,MAAA,GAAS,QAAA;;;AAhBV;;iBA8BgB,aAAA,CAAc,QAAA;;;AAjB9B;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/constants.ts","../src/config.ts","../src/paths.ts","../src/repo-source.ts","../src/index-manager.ts","../src/map.ts","../src/clone.ts","../src/ai/opencode.ts","../src/ai/errors.ts","../src/sync.ts","../src/auth.ts","../src/generate.ts","../src/agents.ts","../src/manifest.ts","../src/dep-mappings.ts","../src/reference-matcher.ts","../src/agents-md.ts","../src/repo-manager.ts","../src/models.ts","../src/installation.ts"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { chmodSync, existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { basename, dirname, join, resolve } from "node:path";
|
|
3
|
-
import { ConfigSchema, GlobalMapSchema, ProjectMapSchema } from "@offworld/types";
|
|
3
|
+
import { ConfigSchema, GitHubRepoMetadataSchema, GlobalMapSchema, ModelsDevDataSchema, NpmPackageResponseSchema, ProjectMapSchema, WorkOSTokenResponseSchema } from "@offworld/types";
|
|
4
4
|
import { xdgConfig, xdgData, xdgState } from "xdg-basedir";
|
|
5
5
|
import { homedir } from "node:os";
|
|
6
6
|
import { createHash } from "node:crypto";
|
|
@@ -15,7 +15,7 @@ import { api } from "@offworld/backend-api/api";
|
|
|
15
15
|
* SDK Constants
|
|
16
16
|
*/
|
|
17
17
|
/** SDK version - must match package.json */
|
|
18
|
-
const VERSION = "0.1.
|
|
18
|
+
const VERSION = "0.1.1";
|
|
19
19
|
/**
|
|
20
20
|
* Default patterns to ignore when scanning repositories.
|
|
21
21
|
* Includes directories, binary files, IDE configs, and build outputs.
|
|
@@ -200,7 +200,10 @@ function getRepoPath(fullName, provider = "github", config) {
|
|
|
200
200
|
*/
|
|
201
201
|
function toMetaDirName(repoName) {
|
|
202
202
|
if (repoName.includes("/")) {
|
|
203
|
-
const
|
|
203
|
+
const parts = repoName.split("/");
|
|
204
|
+
const owner = parts[0];
|
|
205
|
+
const repo = parts[1];
|
|
206
|
+
if (!owner || !repo) return repoName;
|
|
204
207
|
if (owner === repo) return repo;
|
|
205
208
|
return `${owner}-${repo}`;
|
|
206
209
|
}
|
|
@@ -215,7 +218,10 @@ function toMetaDirName(repoName) {
|
|
|
215
218
|
*/
|
|
216
219
|
function toReferenceFileName(repoName) {
|
|
217
220
|
if (repoName.includes("/")) {
|
|
218
|
-
const
|
|
221
|
+
const parts = repoName.split("/");
|
|
222
|
+
const owner = parts[0];
|
|
223
|
+
const repo = parts[1];
|
|
224
|
+
if (!owner || !repo) return `${repoName.toLowerCase()}.md`;
|
|
219
225
|
const ownerLower = owner.toLowerCase();
|
|
220
226
|
const repoLower = repo.toLowerCase();
|
|
221
227
|
if (repoLower.split("-").find((part) => part.length >= 3 && ownerLower.includes(part)) || ownerLower === repoLower) return `${repoLower}.md`;
|
|
@@ -1009,12 +1015,12 @@ var OpenCodeReferenceError = class extends Error {
|
|
|
1009
1015
|
}
|
|
1010
1016
|
};
|
|
1011
1017
|
/**
|
|
1012
|
-
* Error when the @opencode-ai/sdk package is not installed
|
|
1018
|
+
* Error when the @opencode-ai/sdk package is not installed or invalid
|
|
1013
1019
|
*/
|
|
1014
1020
|
var OpenCodeSDKError = class extends OpenCodeReferenceError {
|
|
1015
1021
|
_tag = "OpenCodeSDKError";
|
|
1016
|
-
constructor() {
|
|
1017
|
-
super("Failed to import @opencode-ai/sdk. Install it with: bun add @opencode-ai/sdk");
|
|
1022
|
+
constructor(message) {
|
|
1023
|
+
super(message ?? "Failed to import @opencode-ai/sdk. Install it with: bun add @opencode-ai/sdk");
|
|
1018
1024
|
this.name = "OpenCodeSDKError";
|
|
1019
1025
|
}
|
|
1020
1026
|
};
|
|
@@ -1373,20 +1379,22 @@ async function getOpenCodeSDK() {
|
|
|
1373
1379
|
};
|
|
1374
1380
|
try {
|
|
1375
1381
|
const sdk = await import("@opencode-ai/sdk");
|
|
1382
|
+
if (typeof sdk.createOpencode !== "function" || typeof sdk.createOpencodeClient !== "function") throw new OpenCodeSDKError("SDK missing required exports");
|
|
1376
1383
|
cachedCreateOpencode = sdk.createOpencode;
|
|
1377
1384
|
cachedCreateOpencodeClient = sdk.createOpencodeClient;
|
|
1378
1385
|
return {
|
|
1379
1386
|
createOpencode: cachedCreateOpencode,
|
|
1380
1387
|
createOpencodeClient: cachedCreateOpencodeClient
|
|
1381
1388
|
};
|
|
1382
|
-
} catch {
|
|
1389
|
+
} catch (error) {
|
|
1390
|
+
if (error instanceof OpenCodeSDKError) throw error;
|
|
1383
1391
|
throw new OpenCodeSDKError();
|
|
1384
1392
|
}
|
|
1385
1393
|
}
|
|
1386
1394
|
function formatToolMessage(tool, state) {
|
|
1387
1395
|
if (state.title) return state.title;
|
|
1388
1396
|
if (!tool) return null;
|
|
1389
|
-
const input = state.input;
|
|
1397
|
+
const input = state.input && typeof state.input === "object" && !Array.isArray(state.input) ? state.input : void 0;
|
|
1390
1398
|
if (!input) return `Running ${tool}...`;
|
|
1391
1399
|
switch (tool) {
|
|
1392
1400
|
case "read": {
|
|
@@ -1883,7 +1891,10 @@ async function fetchGitHubMetadata(owner, repo) {
|
|
|
1883
1891
|
"User-Agent": "offworld-cli"
|
|
1884
1892
|
} });
|
|
1885
1893
|
if (!response.ok) return null;
|
|
1886
|
-
const
|
|
1894
|
+
const json = await response.json();
|
|
1895
|
+
const result = GitHubRepoMetadataSchema.safeParse(json);
|
|
1896
|
+
if (!result.success) return null;
|
|
1897
|
+
const data = result.data;
|
|
1887
1898
|
return {
|
|
1888
1899
|
stars: data.stargazers_count ?? 0,
|
|
1889
1900
|
description: data.description ?? void 0,
|
|
@@ -1940,6 +1951,13 @@ function validatePushAllowed(source) {
|
|
|
1940
1951
|
/**
|
|
1941
1952
|
* Authentication utilities for offworld CLI
|
|
1942
1953
|
*/
|
|
1954
|
+
const AuthDataSchema = z.object({
|
|
1955
|
+
token: z.string(),
|
|
1956
|
+
expiresAt: z.string().optional(),
|
|
1957
|
+
workosId: z.string().optional(),
|
|
1958
|
+
refreshToken: z.string().optional(),
|
|
1959
|
+
email: z.string().optional()
|
|
1960
|
+
});
|
|
1943
1961
|
var AuthError = class extends Error {
|
|
1944
1962
|
constructor(message) {
|
|
1945
1963
|
super(message);
|
|
@@ -2003,9 +2021,10 @@ function loadAuthData() {
|
|
|
2003
2021
|
if (!existsSync(authPath)) return null;
|
|
2004
2022
|
try {
|
|
2005
2023
|
const content = readFileSync(authPath, "utf-8");
|
|
2006
|
-
const
|
|
2007
|
-
|
|
2008
|
-
return
|
|
2024
|
+
const json = JSON.parse(content);
|
|
2025
|
+
const parsed = AuthDataSchema.safeParse(json);
|
|
2026
|
+
if (!parsed.success) return null;
|
|
2027
|
+
return parsed.data;
|
|
2009
2028
|
} catch {
|
|
2010
2029
|
return null;
|
|
2011
2030
|
}
|
|
@@ -2131,7 +2150,8 @@ async function refreshAccessToken() {
|
|
|
2131
2150
|
})
|
|
2132
2151
|
});
|
|
2133
2152
|
if (!response.ok) throw new AuthError(`Token refresh failed: ${await response.text()}`);
|
|
2134
|
-
const
|
|
2153
|
+
const json = await response.json();
|
|
2154
|
+
const tokenData = WorkOSTokenResponseSchema.parse(json);
|
|
2135
2155
|
const newAuthData = {
|
|
2136
2156
|
token: tokenData.access_token,
|
|
2137
2157
|
email: tokenData.user.email,
|
|
@@ -2236,6 +2256,10 @@ function getAllAgentConfigs() {
|
|
|
2236
2256
|
* This module provides a streamlined approach to generating reference files
|
|
2237
2257
|
* by delegating all codebase exploration to the AI agent via OpenCode.
|
|
2238
2258
|
*/
|
|
2259
|
+
const PackageJsonKeywordsSchema = z.object({
|
|
2260
|
+
name: z.string().optional(),
|
|
2261
|
+
keywords: z.array(z.string()).optional()
|
|
2262
|
+
});
|
|
2239
2263
|
function normalizeKeyword(value) {
|
|
2240
2264
|
const trimmed = value.trim();
|
|
2241
2265
|
if (!trimmed) return [];
|
|
@@ -2264,10 +2288,11 @@ function deriveKeywords(fullName, localPath, referenceContent) {
|
|
|
2264
2288
|
const packageJsonPath = join(localPath, "package.json");
|
|
2265
2289
|
if (existsSync(packageJsonPath)) try {
|
|
2266
2290
|
const content = readFileSync(packageJsonPath, "utf-8");
|
|
2267
|
-
const
|
|
2268
|
-
|
|
2269
|
-
if (
|
|
2270
|
-
|
|
2291
|
+
const json = JSON.parse(content);
|
|
2292
|
+
const parsed = PackageJsonKeywordsSchema.safeParse(json);
|
|
2293
|
+
if (parsed.success) {
|
|
2294
|
+
if (parsed.data.name) addKeywords(parsed.data.name);
|
|
2295
|
+
if (parsed.data.keywords) for (const keyword of parsed.data.keywords) addKeywords(keyword);
|
|
2271
2296
|
}
|
|
2272
2297
|
} catch {}
|
|
2273
2298
|
return Array.from(keywords);
|
|
@@ -2802,6 +2827,12 @@ function parseRequirementsTxt(path) {
|
|
|
2802
2827
|
//#endregion
|
|
2803
2828
|
//#region src/dep-mappings.ts
|
|
2804
2829
|
/**
|
|
2830
|
+
* Three-tier dependency name to GitHub repo resolution:
|
|
2831
|
+
* 1. KNOWN_MAPPINGS - hardcoded popular packages
|
|
2832
|
+
* 2. npm registry fallback
|
|
2833
|
+
* 3. User prompt (handled by caller)
|
|
2834
|
+
*/
|
|
2835
|
+
/**
|
|
2805
2836
|
* Hardcoded mappings for popular packages.
|
|
2806
2837
|
* Covers top ecosystems: React, Vue, Svelte, backend, database, validation, styling.
|
|
2807
2838
|
*/
|
|
@@ -2899,7 +2930,10 @@ async function resolveFromNpm(packageName) {
|
|
|
2899
2930
|
try {
|
|
2900
2931
|
const res = await fetch(`https://registry.npmjs.org/${packageName}`);
|
|
2901
2932
|
if (!res.ok) return null;
|
|
2902
|
-
const
|
|
2933
|
+
const json = await res.json();
|
|
2934
|
+
const result = NpmPackageResponseSchema.safeParse(json);
|
|
2935
|
+
if (!result.success) return null;
|
|
2936
|
+
const repoUrl = result.data.repository?.url;
|
|
2903
2937
|
if (!repoUrl) return null;
|
|
2904
2938
|
return parseGitHubUrl(repoUrl);
|
|
2905
2939
|
} catch {
|
|
@@ -3343,7 +3377,10 @@ async function fetchModelsDevData() {
|
|
|
3343
3377
|
if (cachedData && now - cacheTime < CACHE_TTL_MS) return cachedData;
|
|
3344
3378
|
const res = await fetch(MODELS_DEV_URL, { signal: AbortSignal.timeout(1e4) });
|
|
3345
3379
|
if (!res.ok) throw new Error(`Failed to fetch models.dev: ${res.status} ${res.statusText}`);
|
|
3346
|
-
|
|
3380
|
+
const json = await res.json();
|
|
3381
|
+
const parsed = ModelsDevDataSchema.safeParse(json);
|
|
3382
|
+
if (!parsed.success) throw new Error(`Invalid models.dev response: ${parsed.error.message}`);
|
|
3383
|
+
cachedData = parsed.data;
|
|
3347
3384
|
cacheTime = now;
|
|
3348
3385
|
return cachedData;
|
|
3349
3386
|
}
|
|
@@ -3355,7 +3392,7 @@ async function listProviders() {
|
|
|
3355
3392
|
return Object.values(data).map((p) => ({
|
|
3356
3393
|
id: p.id,
|
|
3357
3394
|
name: p.name,
|
|
3358
|
-
env: p.env
|
|
3395
|
+
env: p.env ?? []
|
|
3359
3396
|
})).sort((a, b) => a.name.localeCompare(b.name));
|
|
3360
3397
|
}
|
|
3361
3398
|
/**
|
|
@@ -3367,11 +3404,11 @@ async function getProvider(providerId) {
|
|
|
3367
3404
|
return {
|
|
3368
3405
|
id: provider.id,
|
|
3369
3406
|
name: provider.name,
|
|
3370
|
-
env: provider.env,
|
|
3407
|
+
env: provider.env ?? [],
|
|
3371
3408
|
models: Object.values(provider.models).filter((m) => m.status !== "deprecated").map((m) => ({
|
|
3372
3409
|
id: m.id,
|
|
3373
3410
|
name: m.name,
|
|
3374
|
-
reasoning: m.reasoning,
|
|
3411
|
+
reasoning: m.reasoning ?? false,
|
|
3375
3412
|
experimental: m.experimental,
|
|
3376
3413
|
status: m.status
|
|
3377
3414
|
})).sort((a, b) => a.name.localeCompare(b.name))
|
|
@@ -3385,11 +3422,11 @@ async function listProvidersWithModels() {
|
|
|
3385
3422
|
return Object.values(data).map((p) => ({
|
|
3386
3423
|
id: p.id,
|
|
3387
3424
|
name: p.name,
|
|
3388
|
-
env: p.env,
|
|
3425
|
+
env: p.env ?? [],
|
|
3389
3426
|
models: Object.values(p.models).filter((m) => m.status !== "deprecated").map((m) => ({
|
|
3390
3427
|
id: m.id,
|
|
3391
3428
|
name: m.name,
|
|
3392
|
-
reasoning: m.reasoning,
|
|
3429
|
+
reasoning: m.reasoning ?? false,
|
|
3393
3430
|
experimental: m.experimental,
|
|
3394
3431
|
status: m.status
|
|
3395
3432
|
})).sort((a, b) => a.name.localeCompare(b.name))
|
|
@@ -3500,14 +3537,18 @@ async function fetchLatestVersion(method) {
|
|
|
3500
3537
|
if (installMethod === "npm" || installMethod === "pnpm" || installMethod === "bun") {
|
|
3501
3538
|
const response = await fetch(`https://registry.npmjs.org/${NPM_PACKAGE}/latest`);
|
|
3502
3539
|
if (!response.ok) return null;
|
|
3503
|
-
|
|
3540
|
+
const json = await response.json();
|
|
3541
|
+
const result = NpmPackageResponseSchema.safeParse(json);
|
|
3542
|
+
if (!result.success) return null;
|
|
3543
|
+
return result.data.version ?? null;
|
|
3504
3544
|
}
|
|
3505
3545
|
const response = await fetch(`https://api.github.com/repos/${GITHUB_REPO}/releases/latest`, { headers: {
|
|
3506
3546
|
Accept: "application/vnd.github.v3+json",
|
|
3507
3547
|
"User-Agent": "offworld-cli"
|
|
3508
3548
|
} });
|
|
3509
3549
|
if (!response.ok) return null;
|
|
3510
|
-
|
|
3550
|
+
const json = await response.json();
|
|
3551
|
+
return (typeof json === "object" && json !== null && "tag_name" in json ? String(json.tag_name) : null)?.replace(/^v/, "") ?? null;
|
|
3511
3552
|
} catch {
|
|
3512
3553
|
return null;
|
|
3513
3554
|
}
|