coding-tool-x 3.6.13 → 3.7.0
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 +46 -33
- package/dist/web/assets/{Analytics-CnA75GxO.js → Analytics-Dma_j2Rq.js} +1 -1
- package/dist/web/assets/{ConfigTemplates-D8XEscQY.js → ConfigTemplates-C49Y1PLH.js} +1 -1
- package/dist/web/assets/Home-DGGC8H4g.js +1 -0
- package/dist/web/assets/Home-ewgeIhF7.css +1 -0
- package/dist/web/assets/{PluginManager-BzKZ8TYu.js → PluginManager-B1ECTHyY.js} +1 -1
- package/dist/web/assets/{ProjectList-DL4JK6ci.css → ProjectList-B_L55-l9.css} +1 -1
- package/dist/web/assets/ProjectList-DyiGyT-H.js +1 -0
- package/dist/web/assets/SessionList-CH5GwwiJ.js +1 -0
- package/dist/web/assets/{SkillManager-fxOvFTYD.js → SkillManager-CRyVhjYQ.js} +1 -1
- package/dist/web/assets/{WorkspaceManager-Ch2mM8jm.js → WorkspaceManager-CO9tclVt.js} +1 -1
- package/dist/web/assets/{icons-QFXzEgqM.js → icons-Dop5j7Bf.js} +1 -1
- package/dist/web/assets/index-CM26UrnJ.css +1 -0
- package/dist/web/assets/index-EQq56pRa.js +2 -0
- package/dist/web/assets/{naive-ui-kcWDeJwl.js → naive-ui-CVyvdmg1.js} +1 -1
- package/dist/web/index.html +4 -4
- package/package.json +2 -1
- package/src/commands/channels.js +85 -24
- package/src/commands/daemon.js +7 -4
- package/src/commands/doctor.js +17 -8
- package/src/commands/logs.js +48 -6
- package/src/commands/port-config.js +83 -75
- package/src/commands/proxy-control.js +52 -19
- package/src/commands/stats.js +37 -19
- package/src/commands/switch.js +5 -1
- package/src/commands/toggle-proxy.js +131 -53
- package/src/commands/ui.js +3 -4
- package/src/commands/workspace.js +3 -35
- package/src/config/default.js +19 -2
- package/src/config/loader.js +5 -76
- package/src/config/paths.js +99 -11
- package/src/index.js +11 -16
- package/src/server/api/commands.js +1 -1
- package/src/server/api/config-export.js +4 -2
- package/src/server/api/config-registry.js +40 -34
- package/src/server/api/config.js +5 -1
- package/src/server/api/dashboard.js +22 -6
- package/src/server/api/mcp.js +5 -3
- package/src/server/api/pi-channels.js +349 -0
- package/src/server/api/pi-config.js +164 -0
- package/src/server/api/pi-projects.js +76 -0
- package/src/server/api/pi-proxy.js +154 -0
- package/src/server/api/pi-sessions.js +334 -0
- package/src/server/api/pi-statistics.js +40 -0
- package/src/server/api/plugins.js +1 -1
- package/src/server/api/prompts.js +3 -2
- package/src/server/api/settings.js +2 -0
- package/src/server/api/skills.js +1 -1
- package/src/server/api/workspaces.js +3 -41
- package/src/server/index.js +41 -0
- package/src/server/pi-proxy-server.js +66 -0
- package/src/server/services/agents-service.js +2 -1
- package/src/server/services/base/proxy-utils.js +1 -0
- package/src/server/services/channel-balance.js +151 -1
- package/src/server/services/channel-scheduler.js +7 -1
- package/src/server/services/commands-service.js +11 -2
- package/src/server/services/config-export-service.js +275 -18
- package/src/server/services/config-registry-service.js +20 -18
- package/src/server/services/config-sync-manager.js +115 -6
- package/src/server/services/config-sync-service.js +4 -2
- package/src/server/services/config-templates-service.js +183 -45
- package/src/server/services/mcp-service.js +217 -33
- package/src/server/services/pi-auth-providers.js +294 -0
- package/src/server/services/pi-channels.js +94 -0
- package/src/server/services/pi-config.js +287 -0
- package/src/server/services/pi-sessions.js +490 -0
- package/src/server/services/pi-settings-manager.js +571 -0
- package/src/server/services/pi-statistics-service.js +317 -0
- package/src/server/services/plugins-service.js +673 -11
- package/src/server/services/prompts-service.js +112 -7
- package/src/server/services/proxy-log-helper.js +1 -0
- package/src/server/services/proxy-runtime.js +5 -1
- package/src/server/services/sessions.js +19 -35
- package/src/server/services/skill-service.js +13 -3
- package/src/server/services/speed-test.js +9 -3
- package/src/server/services/ui-config.js +50 -12
- package/src/server/services/workspace-service.js +117 -225
- package/src/server/websocket-server.js +7 -1
- package/src/utils/session.js +4 -10
- package/dist/web/assets/Home-BiaKZMah.js +0 -1
- package/dist/web/assets/Home-CIua-b-o.css +0 -1
- package/dist/web/assets/ProjectList-BPfG_92X.js +0 -1
- package/dist/web/assets/SessionList-BIVtw00v.js +0 -1
- package/dist/web/assets/index-BpBFF3b2.js +0 -2
- package/dist/web/assets/index-Dsh4Q5Cg.css +0 -1
- package/src/utils/cli-flags.js +0 -7
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
const { PATHS } = require('../../config/paths');
|
|
2
|
+
const BaseChannelService = require('./base/base-channel-service');
|
|
3
|
+
const {
|
|
4
|
+
writeManagedOmpProviders,
|
|
5
|
+
removeManagedOmpProviders,
|
|
6
|
+
isManagedOmpProvidersActive,
|
|
7
|
+
getLastManagedOmpSyncResult
|
|
8
|
+
} = require('./pi-settings-manager');
|
|
9
|
+
|
|
10
|
+
class PiChannelService extends BaseChannelService {
|
|
11
|
+
constructor() {
|
|
12
|
+
super({
|
|
13
|
+
platform: 'pi',
|
|
14
|
+
channelsFilePath: PATHS.channels.pi,
|
|
15
|
+
defaultGatewaySource: 'openai_compatible',
|
|
16
|
+
isProxyRunning: () => isManagedOmpProvidersActive()
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
_applyDefaults(channel) {
|
|
21
|
+
const normalized = super._applyDefaults(channel);
|
|
22
|
+
normalized.providerKey = normalized.providerKey || normalized.provider || normalized.name || normalized.id;
|
|
23
|
+
normalized.providerApi = normalized.providerApi || normalized.api || normalized.wireApi || 'openai-completions';
|
|
24
|
+
normalized.model = normalized.model || null;
|
|
25
|
+
normalized.models = Array.isArray(normalized.models) ? normalized.models : [];
|
|
26
|
+
normalized.allowedModels = Array.isArray(normalized.allowedModels) ? normalized.allowedModels : [];
|
|
27
|
+
normalized.speedTestModel = normalized.speedTestModel || null;
|
|
28
|
+
normalized.modelRedirects = Array.isArray(normalized.modelRedirects) ? normalized.modelRedirects : [];
|
|
29
|
+
return normalized;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
_applyToNativeSettings(channel) {
|
|
33
|
+
writeManagedOmpProviders([channel]);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
_onAfterCreate(_channel, allChannels) {
|
|
37
|
+
this.syncManagedOmpProviders(allChannels);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
_onAfterUpdate(_oldChannel, _newChannel, allChannels) {
|
|
41
|
+
this.syncManagedOmpProviders(allChannels);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
_onAfterDelete(_channel, allChannels) {
|
|
45
|
+
this.syncManagedOmpProviders(allChannels);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
syncManagedOmpProviders(channels = this.getChannels().channels) {
|
|
49
|
+
const enabledChannels = (channels || []).filter(channel => channel.enabled !== false);
|
|
50
|
+
if (enabledChannels.length === 0) {
|
|
51
|
+
removeManagedOmpProviders();
|
|
52
|
+
return getLastManagedOmpSyncResult();
|
|
53
|
+
}
|
|
54
|
+
writeManagedOmpProviders(enabledChannels);
|
|
55
|
+
return getLastManagedOmpSyncResult();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
disableManagedOmpProviders() {
|
|
59
|
+
removeManagedOmpProviders();
|
|
60
|
+
return getLastManagedOmpSyncResult();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
syncManagedProviderExtension(channels = this.getChannels().channels) {
|
|
64
|
+
return this.syncManagedOmpProviders(channels);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
disableManagedProviderExtension() {
|
|
68
|
+
this.disableManagedOmpProviders();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const service = new PiChannelService();
|
|
73
|
+
|
|
74
|
+
module.exports = {
|
|
75
|
+
getChannels: () => service.getChannels(),
|
|
76
|
+
createChannel: (name, baseUrl, apiKey, extra = {}) => service.createChannel({
|
|
77
|
+
name,
|
|
78
|
+
baseUrl,
|
|
79
|
+
apiKey,
|
|
80
|
+
...extra
|
|
81
|
+
}),
|
|
82
|
+
updateChannel: (id, updates) => service.updateChannel(id, updates),
|
|
83
|
+
markChannelAsRecentlyUsed: (id) => service.updateChannel(id, {}),
|
|
84
|
+
deleteChannel: (id) => service.deleteChannel(id),
|
|
85
|
+
getEnabledChannels: () => service.getEnabledChannels(),
|
|
86
|
+
saveChannelOrder: (order) => service.saveChannelOrder(order),
|
|
87
|
+
applyChannelToSettings: (id) => service.applyChannelToSettings(id),
|
|
88
|
+
disableAllChannels: () => service.disableAllChannels(),
|
|
89
|
+
getEffectiveApiKey: (channel) => channel?.apiKey || null,
|
|
90
|
+
syncManagedOmpProviders: (channels) => service.syncManagedOmpProviders(channels),
|
|
91
|
+
disableManagedOmpProviders: () => service.disableManagedOmpProviders(),
|
|
92
|
+
syncManagedProviderExtension: (channels) => service.syncManagedProviderExtension(channels),
|
|
93
|
+
disableManagedProviderExtension: () => service.disableManagedProviderExtension()
|
|
94
|
+
};
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const { execFileSync } = require('child_process');
|
|
4
|
+
const yaml = require('js-yaml');
|
|
5
|
+
const { HOME_DIR } = require('../../config/paths');
|
|
6
|
+
|
|
7
|
+
const DEFAULT_OMP_COMMAND = 'omp';
|
|
8
|
+
const LEGACY_PI_COMMAND = 'pi';
|
|
9
|
+
|
|
10
|
+
function expandHome(input = '') {
|
|
11
|
+
const value = String(input || '').trim();
|
|
12
|
+
if (!value) return '';
|
|
13
|
+
if (value === '~') return HOME_DIR;
|
|
14
|
+
if (value.startsWith('~/')) return path.join(HOME_DIR, value.slice(2));
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function normalizeProfileName(profile = '') {
|
|
19
|
+
const value = String(profile || '').trim();
|
|
20
|
+
if (!value || value === 'default') return '';
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function getOmpProfile(env = process.env) {
|
|
25
|
+
if (env.OMP_PROFILE !== undefined) {
|
|
26
|
+
return normalizeProfileName(env.OMP_PROFILE);
|
|
27
|
+
}
|
|
28
|
+
return normalizeProfileName(env.PI_PROFILE);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function isAbsolutePathLike(value = '') {
|
|
32
|
+
return path.isAbsolute(value) || /^[a-zA-Z]:[\\/]/.test(value) || String(value).startsWith('\\\\');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function getOmpConfigRoot(env = process.env) {
|
|
36
|
+
const configured = expandHome(env.PI_CONFIG_DIR || '');
|
|
37
|
+
if (!configured) return path.join(HOME_DIR, '.omp');
|
|
38
|
+
return isAbsolutePathLike(configured) ? configured : path.join(HOME_DIR, configured);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function getDefaultOmpAgentDir(env = process.env) {
|
|
42
|
+
const configRoot = getOmpConfigRoot(env);
|
|
43
|
+
const profile = getOmpProfile(env);
|
|
44
|
+
return profile
|
|
45
|
+
? path.join(configRoot, 'profiles', profile, 'agent')
|
|
46
|
+
: path.join(configRoot, 'agent');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function getLegacyPiAgentDir() {
|
|
50
|
+
return path.join(HOME_DIR, '.pi', 'agent');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function getFallbackPiAgentDir(runtime, env = process.env) {
|
|
54
|
+
const configured = expandHome(env.PI_CODING_AGENT_DIR || '');
|
|
55
|
+
if (configured) return configured;
|
|
56
|
+
return runtime?.runtime === 'pi' ? getLegacyPiAgentDir(env) : getDefaultOmpAgentDir(env);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function buildCommandEnv(env = process.env) {
|
|
60
|
+
return {
|
|
61
|
+
...process.env,
|
|
62
|
+
...env
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function runPiCommand(command, args = [], env = process.env, options = {}, stdio = ['ignore', 'pipe', 'pipe']) {
|
|
67
|
+
const runner = options.commandRunner || execFileSync;
|
|
68
|
+
return runner(command, args, {
|
|
69
|
+
encoding: 'utf8',
|
|
70
|
+
env: buildCommandEnv(env),
|
|
71
|
+
stdio,
|
|
72
|
+
timeout: options.timeout || 3000
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function readOmpAgentDirFromCommand(command, env = process.env, options = {}) {
|
|
77
|
+
try {
|
|
78
|
+
const output = runPiCommand(command, ['config', 'path'], env, options);
|
|
79
|
+
const agentDir = String(output || '').trim().split(/\r?\n/).find(Boolean);
|
|
80
|
+
return agentDir ? path.resolve(expandHome(agentDir)) : '';
|
|
81
|
+
} catch {
|
|
82
|
+
return '';
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function getPiAgentDir(env = process.env, options = {}) {
|
|
87
|
+
const runtime = options.runtime || resolvePiRuntime(env, options);
|
|
88
|
+
if (runtime.runtime === 'omp' && runtime.installed) {
|
|
89
|
+
const commandAgentDir = readOmpAgentDirFromCommand(runtime.command, env, options);
|
|
90
|
+
if (commandAgentDir) {
|
|
91
|
+
return commandAgentDir;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return path.resolve(expandHome(getFallbackPiAgentDir(runtime, env)));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function getPiPaths(env = process.env, options = {}) {
|
|
98
|
+
const runtime = options.runtime || resolvePiRuntime(env, options);
|
|
99
|
+
const agentDir = getPiAgentDir(env, { ...options, runtime });
|
|
100
|
+
return {
|
|
101
|
+
agentDir,
|
|
102
|
+
config: path.join(agentDir, 'config.yml'),
|
|
103
|
+
settings: path.join(agentDir, 'config.yml'),
|
|
104
|
+
settingsJsonLegacy: path.join(agentDir, 'settings.json'),
|
|
105
|
+
auth: path.join(agentDir, 'auth.json'),
|
|
106
|
+
models: path.join(agentDir, 'models.yml'),
|
|
107
|
+
modelsYml: path.join(agentDir, 'models.yml'),
|
|
108
|
+
modelsJsonLegacy: path.join(agentDir, 'models.json'),
|
|
109
|
+
mcp: path.join(agentDir, 'mcp.json'),
|
|
110
|
+
sessions: path.join(agentDir, 'sessions'),
|
|
111
|
+
skills: path.join(agentDir, 'skills'),
|
|
112
|
+
prompts: path.join(agentDir, 'prompts'),
|
|
113
|
+
commands: path.join(agentDir, 'commands'),
|
|
114
|
+
notes: path.join(agentDir, 'notes'),
|
|
115
|
+
extensions: path.join(agentDir, 'extensions'),
|
|
116
|
+
themes: path.join(agentDir, 'themes'),
|
|
117
|
+
packages: path.join(agentDir, 'packages'),
|
|
118
|
+
managedProviderExtension: path.join(agentDir, 'extensions', 'coding-tool-x-provider.ts')
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function ensurePiDir(dirPath) {
|
|
123
|
+
if (!fs.existsSync(dirPath)) {
|
|
124
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function readJsonFile(filePath, fallback = {}) {
|
|
129
|
+
try {
|
|
130
|
+
if (!fs.existsSync(filePath)) return fallback;
|
|
131
|
+
const raw = fs.readFileSync(filePath, 'utf8');
|
|
132
|
+
return raw.trim() ? JSON.parse(raw) : fallback;
|
|
133
|
+
} catch {
|
|
134
|
+
return fallback;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function writeJsonFile(filePath, data) {
|
|
139
|
+
ensurePiDir(path.dirname(filePath));
|
|
140
|
+
fs.writeFileSync(filePath, JSON.stringify(data || {}, null, 2), 'utf8');
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function readYamlFile(filePath, fallback = {}) {
|
|
144
|
+
try {
|
|
145
|
+
if (!fs.existsSync(filePath)) return fallback;
|
|
146
|
+
const raw = fs.readFileSync(filePath, 'utf8');
|
|
147
|
+
if (!raw.trim()) return fallback;
|
|
148
|
+
const parsed = yaml.load(raw);
|
|
149
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : fallback;
|
|
150
|
+
} catch {
|
|
151
|
+
return fallback;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function writeYamlFile(filePath, data) {
|
|
156
|
+
ensurePiDir(path.dirname(filePath));
|
|
157
|
+
fs.writeFileSync(filePath, yaml.dump(data || {}, {
|
|
158
|
+
lineWidth: 120,
|
|
159
|
+
noRefs: true,
|
|
160
|
+
sortKeys: false
|
|
161
|
+
}), 'utf8');
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function readPiSettings() {
|
|
165
|
+
const paths = getPiPaths();
|
|
166
|
+
return readYamlFile(paths.settings, readJsonFile(paths.settingsJsonLegacy, {}));
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function writePiSettings(settings) {
|
|
170
|
+
writeYamlFile(getPiPaths().settings, settings || {});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function getPiCommand(env = process.env) {
|
|
174
|
+
return String(env.OMP_COMMAND || env.PI_COMMAND || DEFAULT_OMP_COMMAND).trim() || DEFAULT_OMP_COMMAND;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function commandExists(command, env = process.env, options = {}) {
|
|
178
|
+
try {
|
|
179
|
+
runPiCommand(command, ['--version'], env, options, 'ignore');
|
|
180
|
+
return true;
|
|
181
|
+
} catch {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function resolvePiRuntime(env = process.env, options = {}) {
|
|
187
|
+
const configured = env.OMP_COMMAND || env.PI_COMMAND;
|
|
188
|
+
if (configured) {
|
|
189
|
+
const command = getPiCommand(env);
|
|
190
|
+
const source = env.OMP_COMMAND ? 'OMP_COMMAND' : 'PI_COMMAND';
|
|
191
|
+
return {
|
|
192
|
+
command,
|
|
193
|
+
runtime: command === LEGACY_PI_COMMAND ? 'pi' : 'omp',
|
|
194
|
+
installed: commandExists(command, env, options),
|
|
195
|
+
configured: true,
|
|
196
|
+
commandSource: source
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
if (commandExists(DEFAULT_OMP_COMMAND, env, options)) {
|
|
201
|
+
return {
|
|
202
|
+
command: DEFAULT_OMP_COMMAND,
|
|
203
|
+
runtime: 'omp',
|
|
204
|
+
installed: true,
|
|
205
|
+
configured: false,
|
|
206
|
+
commandSource: 'path'
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (commandExists(LEGACY_PI_COMMAND, env, options)) {
|
|
211
|
+
return {
|
|
212
|
+
command: LEGACY_PI_COMMAND,
|
|
213
|
+
runtime: 'pi',
|
|
214
|
+
installed: true,
|
|
215
|
+
configured: false,
|
|
216
|
+
commandSource: 'path'
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return {
|
|
221
|
+
command: DEFAULT_OMP_COMMAND,
|
|
222
|
+
runtime: 'omp',
|
|
223
|
+
installed: false,
|
|
224
|
+
configured: false,
|
|
225
|
+
commandSource: 'fallback'
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function isPiInstalled(env = process.env, options = {}) {
|
|
230
|
+
const runtime = options.runtime || resolvePiRuntime(env, options);
|
|
231
|
+
if (runtime.installed) {
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
234
|
+
return fs.existsSync(getPiPaths(env, { ...options, runtime }).agentDir);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function readTextFile(filePath, fallback = '') {
|
|
238
|
+
try {
|
|
239
|
+
if (!fs.existsSync(filePath)) return fallback;
|
|
240
|
+
return fs.readFileSync(filePath, 'utf8');
|
|
241
|
+
} catch {
|
|
242
|
+
return fallback;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function getPiStatus(env = process.env, options = {}) {
|
|
247
|
+
const runtime = resolvePiRuntime(env, options);
|
|
248
|
+
const paths = getPiPaths(env, { ...options, runtime });
|
|
249
|
+
return {
|
|
250
|
+
installed: isPiInstalled(env, { ...options, runtime }),
|
|
251
|
+
runtime: runtime.runtime,
|
|
252
|
+
command: runtime.command,
|
|
253
|
+
commandSource: runtime.commandSource,
|
|
254
|
+
agentDir: paths.agentDir,
|
|
255
|
+
settingsPath: paths.settings,
|
|
256
|
+
authPath: paths.auth,
|
|
257
|
+
modelsPath: paths.modelsYml,
|
|
258
|
+
modelsYmlPath: paths.modelsYml,
|
|
259
|
+
modelsJsonLegacyPath: paths.modelsJsonLegacy,
|
|
260
|
+
sessionsDir: paths.sessions,
|
|
261
|
+
skillsDir: paths.skills,
|
|
262
|
+
promptsDir: paths.prompts,
|
|
263
|
+
commandsDir: paths.commands,
|
|
264
|
+
extensionsDir: paths.extensions,
|
|
265
|
+
themesDir: paths.themes,
|
|
266
|
+
packagesDir: paths.packages
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
module.exports = {
|
|
271
|
+
expandHome,
|
|
272
|
+
getPiAgentDir,
|
|
273
|
+
getPiPaths,
|
|
274
|
+
ensurePiDir,
|
|
275
|
+
readJsonFile,
|
|
276
|
+
readYamlFile,
|
|
277
|
+
readTextFile,
|
|
278
|
+
writeJsonFile,
|
|
279
|
+
writeYamlFile,
|
|
280
|
+
readPiSettings,
|
|
281
|
+
writePiSettings,
|
|
282
|
+
getPiCommand,
|
|
283
|
+
getOmpProfile,
|
|
284
|
+
resolvePiRuntime,
|
|
285
|
+
isPiInstalled,
|
|
286
|
+
getPiStatus
|
|
287
|
+
};
|