@pi-orca/models 0.0.2-dev.20260413162335
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 +43 -0
- package/defaults/models.yaml +27 -0
- package/dist/commands.d.ts +22 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +62 -0
- package/dist/commands.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +349 -0
- package/dist/index.js.map +1 -0
- package/dist/resolver.d.ts +55 -0
- package/dist/resolver.d.ts.map +1 -0
- package/dist/resolver.js +216 -0
- package/dist/resolver.js.map +1 -0
- package/dist/tool.d.ts +13 -0
- package/dist/tool.d.ts.map +1 -0
- package/dist/tool.js +66 -0
- package/dist/tool.js.map +1 -0
- package/dist/types.d.ts +19 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/widget.d.ts +10 -0
- package/dist/widget.d.ts.map +1 -0
- package/dist/widget.js +28 -0
- package/dist/widget.js.map +1 -0
- package/package.json +44 -0
package/README.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# pi-orca-models
|
|
2
|
+
|
|
3
|
+
**Model Alias Management**
|
|
4
|
+
|
|
5
|
+
Version: 0.0.1 (Phase 0 - Stub)
|
|
6
|
+
License: MIT
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Model alias management (fast, balanced, thinker, coder) with user and project overrides.
|
|
11
|
+
|
|
12
|
+
**Status:** Phase 0 scaffold complete. Full implementation pending.
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install pi-orca-models
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
This package is currently in stub mode. Tools and commands are registered but return "Not implemented yet" messages.
|
|
23
|
+
|
|
24
|
+
## Development Status
|
|
25
|
+
|
|
26
|
+
- [x] Package scaffold
|
|
27
|
+
- [x] TypeScript configuration
|
|
28
|
+
- [x] Tool registration (stub)
|
|
29
|
+
- [x] Command registration (stub)
|
|
30
|
+
- [x] Event emission (ready signal)
|
|
31
|
+
- [ ] Full implementation (pending)
|
|
32
|
+
|
|
33
|
+
## Dependencies
|
|
34
|
+
|
|
35
|
+
- `pi-orca-core` — Shared types and utilities
|
|
36
|
+
|
|
37
|
+
## Documentation
|
|
38
|
+
|
|
39
|
+
See the [Pi Orca specification](../../docs/spec-v0.3.0.md) for the complete design.
|
|
40
|
+
|
|
41
|
+
## License
|
|
42
|
+
|
|
43
|
+
MIT License — see [LICENSE](../../LICENSE) for details.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Pi Orca Model Aliases
|
|
2
|
+
# Spec: §8.2 — Model Alias Configuration
|
|
3
|
+
#
|
|
4
|
+
# Maps semantic tier names to provider-qualified model IDs.
|
|
5
|
+
# Override at project level: <project>/.pi/orca/models.yaml
|
|
6
|
+
# Session overrides: /models set <alias> <provider>/<model>
|
|
7
|
+
|
|
8
|
+
aliases:
|
|
9
|
+
fast:
|
|
10
|
+
provider: anthropic
|
|
11
|
+
model: claude-haiku-4-5
|
|
12
|
+
description: "Lowest latency, lowest cost"
|
|
13
|
+
|
|
14
|
+
balanced:
|
|
15
|
+
provider: anthropic
|
|
16
|
+
model: claude-sonnet-4-6
|
|
17
|
+
description: "Good all-rounder"
|
|
18
|
+
|
|
19
|
+
thinker:
|
|
20
|
+
provider: anthropic
|
|
21
|
+
model: claude-opus-4-6
|
|
22
|
+
description: "Deep reasoning, higher cost"
|
|
23
|
+
|
|
24
|
+
coder:
|
|
25
|
+
provider: anthropic
|
|
26
|
+
model: claude-sonnet-4-6
|
|
27
|
+
description: "Best available for code generation"
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slash command implementations for pi-orca-models.
|
|
3
|
+
* Spec: §8.8 — Slash Commands
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* /models (no args) — return widget string
|
|
7
|
+
*/
|
|
8
|
+
export declare function cmdModelsToggle(projectRoot?: string): Promise<string>;
|
|
9
|
+
/**
|
|
10
|
+
* /models set <alias> <provider>/<model> — set session override
|
|
11
|
+
*/
|
|
12
|
+
export declare function cmdModelsSet(alias: string, modelId: string): Promise<string>;
|
|
13
|
+
/**
|
|
14
|
+
* /models reset — clear session overrides
|
|
15
|
+
*/
|
|
16
|
+
export declare function cmdModelsReset(): string;
|
|
17
|
+
/**
|
|
18
|
+
* /models setup — interactive guided configuration stub
|
|
19
|
+
* Full interactive version requires Pi TUI access.
|
|
20
|
+
*/
|
|
21
|
+
export declare function cmdModelsSetup(): Promise<string>;
|
|
22
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE3E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAclF;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CASvC;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAqBtD"}
|
package/dist/commands.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slash command implementations for pi-orca-models.
|
|
3
|
+
* Spec: §8.8 — Slash Commands
|
|
4
|
+
*/
|
|
5
|
+
import { listAllAliases, setSessionAlias, clearSessionOverrides, getSessionOverrides, getUserModelsPath, bootstrapModels, } from "./resolver.js";
|
|
6
|
+
import { renderModelsWidget } from "./widget.js";
|
|
7
|
+
/**
|
|
8
|
+
* /models (no args) — return widget string
|
|
9
|
+
*/
|
|
10
|
+
export async function cmdModelsToggle(projectRoot) {
|
|
11
|
+
return renderModelsWidget(projectRoot);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* /models set <alias> <provider>/<model> — set session override
|
|
15
|
+
*/
|
|
16
|
+
export async function cmdModelsSet(alias, modelId) {
|
|
17
|
+
if (!alias || !modelId) {
|
|
18
|
+
return "Usage: /models set <alias> <provider>/<model>";
|
|
19
|
+
}
|
|
20
|
+
if (!modelId.includes("/")) {
|
|
21
|
+
return `Error: model must be in 'provider/model' format (e.g., anthropic/claude-haiku-4-5)`;
|
|
22
|
+
}
|
|
23
|
+
const [provider, ...modelParts] = modelId.split("/");
|
|
24
|
+
const model = modelParts.join("/");
|
|
25
|
+
setSessionAlias(alias, provider, model);
|
|
26
|
+
return `Set session alias '${alias}' → ${modelId}`;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* /models reset — clear session overrides
|
|
30
|
+
*/
|
|
31
|
+
export function cmdModelsReset() {
|
|
32
|
+
const overrides = getSessionOverrides();
|
|
33
|
+
const count = overrides.size;
|
|
34
|
+
clearSessionOverrides();
|
|
35
|
+
if (count === 0) {
|
|
36
|
+
return "No session overrides to clear.";
|
|
37
|
+
}
|
|
38
|
+
return `Cleared ${count} session override(s). Reverted to config-based resolution.`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* /models setup — interactive guided configuration stub
|
|
42
|
+
* Full interactive version requires Pi TUI access.
|
|
43
|
+
*/
|
|
44
|
+
export async function cmdModelsSetup() {
|
|
45
|
+
const userPath = getUserModelsPath();
|
|
46
|
+
// Bootstrap if missing
|
|
47
|
+
const created = await bootstrapModels(false);
|
|
48
|
+
if (created) {
|
|
49
|
+
return `Created default model aliases at ${userPath}\n\nTo customize, edit the file directly or run:\n /models set <alias> <provider>/<model>`;
|
|
50
|
+
}
|
|
51
|
+
const aliases = await listAllAliases();
|
|
52
|
+
const lines = [
|
|
53
|
+
`Current model aliases (${userPath}):`,
|
|
54
|
+
"",
|
|
55
|
+
...aliases.map((a) => ` ${a.alias.padEnd(12)} → ${a.modelId} [${a.source}]`),
|
|
56
|
+
"",
|
|
57
|
+
"To change an alias for this session: /models set <alias> <provider>/<model>",
|
|
58
|
+
"To permanently change, edit the file: " + userPath,
|
|
59
|
+
];
|
|
60
|
+
return lines.join("\n");
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAoB;IACxD,OAAO,kBAAkB,CAAC,WAAW,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa,EAAE,OAAe;IAC/D,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,+CAA+C,CAAC;IACzD,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,oFAAoF,CAAC;IAC9F,CAAC;IAED,MAAM,CAAC,QAAQ,EAAE,GAAG,UAAU,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAExC,OAAO,sBAAsB,KAAK,OAAO,OAAO,EAAE,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC;IAC7B,qBAAqB,EAAE,CAAC;IAExB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,gCAAgC,CAAC;IAC1C,CAAC;IACD,OAAO,WAAW,KAAK,4DAA4D,CAAC;AACtF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IAErC,uBAAuB;IACvB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;IAE7C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,oCAAoC,QAAQ,4FAA4F,CAAC;IAClJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG;QACZ,0BAA0B,QAAQ,IAAI;QACtC,EAAE;QACF,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;QAC/E,EAAE;QACF,6EAA6E;QAC7E,wCAAwC,GAAG,QAAQ;KACpD,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pi Orca Models Extension
|
|
3
|
+
* Model alias management.
|
|
4
|
+
* Spec: §8 — pi-orca-models Extension
|
|
5
|
+
*/
|
|
6
|
+
export { executeModelAliasTool } from "./tool.js";
|
|
7
|
+
export * from "./resolver.js";
|
|
8
|
+
export * from "./types.js";
|
|
9
|
+
export * from "./commands.js";
|
|
10
|
+
export declare function register(pi: any): void;
|
|
11
|
+
export default register;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AA+Q9B,wBAAgB,QAAQ,CAAC,EAAE,EAAE,GAAG,QA4I/B;AAED,eAAe,QAAQ,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pi Orca Models Extension
|
|
3
|
+
* Model alias management.
|
|
4
|
+
* Spec: §8 — pi-orca-models Extension
|
|
5
|
+
*/
|
|
6
|
+
import { executeModelAliasTool } from "./tool.js";
|
|
7
|
+
import { bootstrapModels, resolveAlias, listAllAliases, setSessionAlias, } from "./resolver.js";
|
|
8
|
+
import { cmdModelsSet, cmdModelsReset, cmdModelsSetup, } from "./commands.js";
|
|
9
|
+
import { DynamicBorder } from "@mariozechner/pi-coding-agent";
|
|
10
|
+
import { resolveCompletions } from "@pi-orca/core";
|
|
11
|
+
import { SelectList, Container, Text, Spacer, Input } from "@mariozechner/pi-tui";
|
|
12
|
+
export { executeModelAliasTool } from "./tool.js";
|
|
13
|
+
export * from "./resolver.js";
|
|
14
|
+
export * from "./types.js";
|
|
15
|
+
export * from "./commands.js";
|
|
16
|
+
// ─── completion cache (updated on session_start) ─────────────────────────────
|
|
17
|
+
// getArgumentCompletions is synchronous — cache aliases here for quick lookup.
|
|
18
|
+
let _cachedAliases = [];
|
|
19
|
+
let _cachedModels = [];
|
|
20
|
+
function buildModelsTree() {
|
|
21
|
+
return {
|
|
22
|
+
items: [
|
|
23
|
+
{ value: "set", label: "set", description: "Set alias -> provider/model" },
|
|
24
|
+
{ value: "reset", label: "reset", description: "Clear session overrides" },
|
|
25
|
+
{ value: "setup", label: "setup", description: "Setup default aliases" },
|
|
26
|
+
],
|
|
27
|
+
children: {
|
|
28
|
+
set: {
|
|
29
|
+
dynamicItems: () => _cachedAliases.map((a) => ({
|
|
30
|
+
value: a.alias,
|
|
31
|
+
label: a.alias,
|
|
32
|
+
description: `-> ${a.modelId} [${a.source}]`,
|
|
33
|
+
})),
|
|
34
|
+
children: {
|
|
35
|
+
"*": {
|
|
36
|
+
dynamicItems: () => _cachedModels.map((m) => ({ value: m, label: m })),
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// ─── helpers ────────────────────────────────────────────────────────────────
|
|
44
|
+
/**
|
|
45
|
+
* Register all current aliases as models under the synthetic "orca-aliases"
|
|
46
|
+
* provider. For each alias we look up the real model in the registry and copy
|
|
47
|
+
* its `reasoning` and `input` fields so Pi treats the entry correctly.
|
|
48
|
+
*/
|
|
49
|
+
async function registerAliasProvider(pi, ctx) {
|
|
50
|
+
const aliases = await listAllAliases();
|
|
51
|
+
if (aliases.length === 0)
|
|
52
|
+
return;
|
|
53
|
+
const models = aliases.map((a) => {
|
|
54
|
+
const [providerName, ...rest] = a.modelId.split("/");
|
|
55
|
+
const modelId = rest.join("/");
|
|
56
|
+
const real = ctx.modelRegistry?.find(providerName, modelId);
|
|
57
|
+
return {
|
|
58
|
+
id: a.modelId,
|
|
59
|
+
name: `[orca] ${a.alias}`,
|
|
60
|
+
reasoning: real?.reasoning ?? false,
|
|
61
|
+
input: (real?.input ?? ["text", "image"]),
|
|
62
|
+
contextWindow: real?.contextWindow ?? 200_000,
|
|
63
|
+
maxTokens: real?.maxTokens ?? 16_384,
|
|
64
|
+
cost: real?.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
pi.registerProvider("orca-aliases", {
|
|
68
|
+
baseUrl: "https://orca-aliases.local", // never called — resolved via model_select
|
|
69
|
+
apiKey: "ANTHROPIC_API_KEY", // reuse key so availability check passes
|
|
70
|
+
api: "anthropic-messages",
|
|
71
|
+
models,
|
|
72
|
+
});
|
|
73
|
+
console.log(`pi-orca-models: registered ${models.length} alias(es) in /model selector`);
|
|
74
|
+
}
|
|
75
|
+
// ─── interactive /models UI ──────────────────────────────────────────────────
|
|
76
|
+
/**
|
|
77
|
+
* Single-overlay interactive UI with internal state machine:
|
|
78
|
+
* "alias" — pick which alias to edit (esc → close)
|
|
79
|
+
* "model" — filter + pick real model (esc → back to alias)
|
|
80
|
+
*
|
|
81
|
+
* After a model is assigned the overlay stays open on the alias screen
|
|
82
|
+
* so the user can reassign more aliases before closing.
|
|
83
|
+
*/
|
|
84
|
+
async function openModelsUI(pi, ctx) {
|
|
85
|
+
// ── collect data ────────────────────────────────────────────────────────
|
|
86
|
+
const allModels = (ctx.modelRegistry?.getAvailable?.() ?? ctx.modelRegistry?.getAll?.() ?? []).filter((m) => m.provider !== "orca-aliases");
|
|
87
|
+
if (allModels.length === 0) {
|
|
88
|
+
ctx.ui.notify("No models found in registry.", "warning");
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const modelItems = allModels.map((m) => ({
|
|
92
|
+
value: `${m.provider}/${m.id}`,
|
|
93
|
+
label: m.name,
|
|
94
|
+
description: `${m.provider}/${m.id}`,
|
|
95
|
+
}));
|
|
96
|
+
await ctx.ui.custom((tui, theme, _kb, done) => {
|
|
97
|
+
// ── shared theme shorthand ─────────────────────────────────────────
|
|
98
|
+
const ac = (s) => theme.fg("accent", s);
|
|
99
|
+
const dim = (s) => theme.fg("dim", s);
|
|
100
|
+
const mut = (s) => theme.fg("muted", s);
|
|
101
|
+
const wrn = (s) => theme.fg("warning", s);
|
|
102
|
+
const listTheme = {
|
|
103
|
+
selectedPrefix: ac,
|
|
104
|
+
selectedText: ac,
|
|
105
|
+
description: mut,
|
|
106
|
+
scrollInfo: dim,
|
|
107
|
+
noMatch: wrn,
|
|
108
|
+
};
|
|
109
|
+
let screen = "alias";
|
|
110
|
+
let chosenAlias = "";
|
|
111
|
+
// ── alias screen ───────────────────────────────────────────────────
|
|
112
|
+
let aliasList;
|
|
113
|
+
let aliasContainer;
|
|
114
|
+
function buildAliasScreen() {
|
|
115
|
+
// Rebuild every time so description reflects latest assignment
|
|
116
|
+
return listAllAliases().then((aliases) => {
|
|
117
|
+
const items = aliases.map((a) => ({
|
|
118
|
+
value: a.alias,
|
|
119
|
+
label: a.alias,
|
|
120
|
+
description: `→ ${a.modelId} [${a.source}]`,
|
|
121
|
+
}));
|
|
122
|
+
aliasContainer = new Container();
|
|
123
|
+
aliasContainer.addChild(new DynamicBorder(ac));
|
|
124
|
+
aliasContainer.addChild(new Text(ac(" Model Aliases — select to reassign"), 1, 0));
|
|
125
|
+
aliasContainer.addChild(new Spacer(1));
|
|
126
|
+
aliasList = new SelectList(items, Math.min(items.length + 2, 12), listTheme);
|
|
127
|
+
aliasList.onSelect = (item) => {
|
|
128
|
+
chosenAlias = item.value;
|
|
129
|
+
screen = "model";
|
|
130
|
+
filterInput.setValue("");
|
|
131
|
+
// Rebuild model list unfiltered
|
|
132
|
+
modelList = new SelectList(applyFilter(""), Math.min(modelItems.length + 2, 16), listTheme);
|
|
133
|
+
attachModelListHandlers();
|
|
134
|
+
tui.requestRender();
|
|
135
|
+
};
|
|
136
|
+
aliasList.onCancel = () => done(undefined);
|
|
137
|
+
aliasContainer.addChild(aliasList);
|
|
138
|
+
aliasContainer.addChild(new Spacer(1));
|
|
139
|
+
aliasContainer.addChild(new Text(dim(" ↑↓ navigate • enter select • esc close"), 1, 0));
|
|
140
|
+
aliasContainer.addChild(new DynamicBorder(ac));
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
// ── model screen ───────────────────────────────────────────────────
|
|
144
|
+
const filterInput = new Input();
|
|
145
|
+
filterInput.focused = true;
|
|
146
|
+
// Case-insensitive substring match across label (model name) and value (provider/id)
|
|
147
|
+
function applyFilter(filterText) {
|
|
148
|
+
const q = filterText.toLowerCase();
|
|
149
|
+
return q
|
|
150
|
+
? modelItems.filter((m) => m.label.toLowerCase().includes(q) || m.value.toLowerCase().includes(q))
|
|
151
|
+
: modelItems;
|
|
152
|
+
}
|
|
153
|
+
let modelList = new SelectList(applyFilter(""), Math.min(modelItems.length + 2, 16), listTheme);
|
|
154
|
+
function attachModelListHandlers() {
|
|
155
|
+
modelList.onSelect = async (item) => {
|
|
156
|
+
const [provider, ...rest] = item.value.split("/");
|
|
157
|
+
setSessionAlias(chosenAlias, provider, rest.join("/"));
|
|
158
|
+
await registerAliasProvider(pi, ctx);
|
|
159
|
+
ctx.ui.notify(`"${chosenAlias}" → ${item.value}`, "info");
|
|
160
|
+
screen = "alias";
|
|
161
|
+
await buildAliasScreen();
|
|
162
|
+
tui.requestRender();
|
|
163
|
+
};
|
|
164
|
+
modelList.onCancel = () => {
|
|
165
|
+
screen = "alias";
|
|
166
|
+
tui.requestRender();
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
attachModelListHandlers();
|
|
170
|
+
filterInput.onSubmit = () => {
|
|
171
|
+
modelList.handleInput("\r");
|
|
172
|
+
};
|
|
173
|
+
filterInput.onEscape = () => {
|
|
174
|
+
screen = "alias";
|
|
175
|
+
tui.requestRender();
|
|
176
|
+
};
|
|
177
|
+
// ── component ──────────────────────────────────────────────────────
|
|
178
|
+
// Build alias screen initially then return component
|
|
179
|
+
let ready = false;
|
|
180
|
+
buildAliasScreen().then(() => {
|
|
181
|
+
ready = true;
|
|
182
|
+
tui.requestRender();
|
|
183
|
+
});
|
|
184
|
+
return {
|
|
185
|
+
render(w) {
|
|
186
|
+
if (!ready)
|
|
187
|
+
return [ac(" Loading…")];
|
|
188
|
+
if (screen === "alias") {
|
|
189
|
+
return aliasContainer.render(w);
|
|
190
|
+
}
|
|
191
|
+
// Model screen — rebuild container each render so filter label is live
|
|
192
|
+
const mc = new Container();
|
|
193
|
+
mc.addChild(new DynamicBorder(ac));
|
|
194
|
+
mc.addChild(new Text(ac(` Set "${chosenAlias}" — type to filter, ↑↓ navigate, enter select`), 1, 0));
|
|
195
|
+
mc.addChild(new Spacer(1));
|
|
196
|
+
mc.addChild(new Text(dim(" Filter: ") + filterInput.render(w > 20 ? w - 10 : w)[0], 0, 0));
|
|
197
|
+
mc.addChild(new Spacer(1));
|
|
198
|
+
mc.addChild(modelList);
|
|
199
|
+
mc.addChild(new Spacer(1));
|
|
200
|
+
mc.addChild(new Text(dim(" esc → back to aliases"), 1, 0));
|
|
201
|
+
mc.addChild(new DynamicBorder(ac));
|
|
202
|
+
return mc.render(w);
|
|
203
|
+
},
|
|
204
|
+
invalidate() {
|
|
205
|
+
aliasContainer?.invalidate();
|
|
206
|
+
modelList.invalidate();
|
|
207
|
+
filterInput.invalidate();
|
|
208
|
+
},
|
|
209
|
+
handleInput(data) {
|
|
210
|
+
if (screen === "alias") {
|
|
211
|
+
aliasList.handleInput(data);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
// On the model screen, typing goes to the filter input;
|
|
215
|
+
// arrow keys / enter go to the model list.
|
|
216
|
+
const isNav = [
|
|
217
|
+
"\x1b[A", "\x1b[B", "\x1b[C", "\x1b[D", // arrows
|
|
218
|
+
"\r", "\n", // enter
|
|
219
|
+
].includes(data);
|
|
220
|
+
if (isNav) {
|
|
221
|
+
modelList.handleInput(data);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
const before = filterInput.getValue();
|
|
225
|
+
filterInput.handleInput(data);
|
|
226
|
+
const after = filterInput.getValue();
|
|
227
|
+
if (after !== before) {
|
|
228
|
+
// Rebuild SelectList with fresh filtered items
|
|
229
|
+
modelList = new SelectList(applyFilter(after), Math.min(modelItems.length + 2, 16), listTheme);
|
|
230
|
+
attachModelListHandlers();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
tui.requestRender();
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
}, { overlay: true, overlayOptions: { width: "70%", minWidth: 60 } });
|
|
238
|
+
}
|
|
239
|
+
// ─── extension entry point ───────────────────────────────────────────────────
|
|
240
|
+
export function register(pi) {
|
|
241
|
+
console.log("pi-orca-models: Registering extension");
|
|
242
|
+
// ── tool ──────────────────────────────────────────────────────────────────
|
|
243
|
+
pi.registerTool?.({
|
|
244
|
+
name: "model_alias",
|
|
245
|
+
label: "Model Aliases",
|
|
246
|
+
description: "Manage model aliases (fast, balanced, thinker, coder). Actions: list, set, resolve",
|
|
247
|
+
parameters: {
|
|
248
|
+
type: "object",
|
|
249
|
+
properties: {
|
|
250
|
+
action: {
|
|
251
|
+
type: "string",
|
|
252
|
+
enum: ["list", "set", "resolve"],
|
|
253
|
+
description: "Action to perform",
|
|
254
|
+
},
|
|
255
|
+
alias: {
|
|
256
|
+
type: "string",
|
|
257
|
+
description: "Alias name (e.g., fast, balanced, thinker, coder)",
|
|
258
|
+
},
|
|
259
|
+
provider: { type: "string", description: "Provider name (e.g., anthropic)" },
|
|
260
|
+
model: {
|
|
261
|
+
type: "string",
|
|
262
|
+
description: "Model name or provider/model-id (e.g., claude-haiku-4-5 or anthropic/claude-haiku-4-5)",
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
required: ["action"],
|
|
266
|
+
},
|
|
267
|
+
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
268
|
+
return executeModelAliasTool({ ...params });
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
// ── slash command ──────────────────────────────────────────────────────────
|
|
272
|
+
pi.registerCommand("models", {
|
|
273
|
+
description: "Manage model aliases (no args → /models widget)",
|
|
274
|
+
getArgumentCompletions(prefix) {
|
|
275
|
+
return resolveCompletions(prefix, buildModelsTree());
|
|
276
|
+
},
|
|
277
|
+
handler: async (args, ctx) => {
|
|
278
|
+
const parts = args ? args.trim().split(/\s+/) : [];
|
|
279
|
+
const subcommand = parts[0];
|
|
280
|
+
// No subcommand → open interactive overlay
|
|
281
|
+
if (!subcommand) {
|
|
282
|
+
await openModelsUI(pi, ctx);
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
switch (subcommand.toLowerCase()) {
|
|
286
|
+
case "set": {
|
|
287
|
+
const alias = parts[1];
|
|
288
|
+
const modelId = parts[2];
|
|
289
|
+
const result = await cmdModelsSet(alias, modelId);
|
|
290
|
+
const isErr = result.startsWith("Error") || result.startsWith("Usage");
|
|
291
|
+
ctx.ui.notify(result, isErr ? "error" : "info");
|
|
292
|
+
if (!isErr) {
|
|
293
|
+
await registerAliasProvider(pi, ctx);
|
|
294
|
+
}
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
case "reset": {
|
|
298
|
+
const result = cmdModelsReset();
|
|
299
|
+
ctx.ui.notify(result, "info");
|
|
300
|
+
await registerAliasProvider(pi, ctx);
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
case "setup": {
|
|
304
|
+
const result = await cmdModelsSetup();
|
|
305
|
+
ctx.ui.notify(result, "info");
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
default:
|
|
309
|
+
ctx.ui.notify(`Unknown subcommand '${subcommand}'. Available: set, reset, setup`, "error");
|
|
310
|
+
}
|
|
311
|
+
},
|
|
312
|
+
});
|
|
313
|
+
// ── lifecycle ──────────────────────────────────────────────────────────────
|
|
314
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
315
|
+
await bootstrapModels(true);
|
|
316
|
+
_cachedAliases = await listAllAliases();
|
|
317
|
+
// Populate model cache from registry for completions
|
|
318
|
+
const allModels = (ctx.modelRegistry?.getAvailable?.() ?? ctx.modelRegistry?.getAll?.() ?? []).filter((m) => m.provider !== "orca-aliases");
|
|
319
|
+
_cachedModels = allModels.map((m) => `${m.provider}/${m.id}`);
|
|
320
|
+
await registerAliasProvider(pi, ctx);
|
|
321
|
+
pi.events?.on("orca:models:resolve", async (data) => {
|
|
322
|
+
return resolveAlias(data.alias);
|
|
323
|
+
});
|
|
324
|
+
pi.events?.on("orca:models:list", async () => {
|
|
325
|
+
return listAllAliases();
|
|
326
|
+
});
|
|
327
|
+
pi.events?.emit("orca:models:ready", {});
|
|
328
|
+
console.log("pi-orca-models: Ready");
|
|
329
|
+
});
|
|
330
|
+
// When user picks an orca alias from /model, resolve to the real model
|
|
331
|
+
pi.on("model_select", async (event, ctx) => {
|
|
332
|
+
if (event.model?.provider !== "orca-aliases")
|
|
333
|
+
return;
|
|
334
|
+
const realModelId = event.model.id;
|
|
335
|
+
const [realProvider, ...rest] = realModelId.split("/");
|
|
336
|
+
const realModel = rest.join("/");
|
|
337
|
+
const found = ctx.modelRegistry?.find(realProvider, realModel);
|
|
338
|
+
if (found) {
|
|
339
|
+
await pi.setModel(found);
|
|
340
|
+
ctx.ui.notify(`Alias '${event.model.name}' → ${realModelId}`, "info");
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
ctx.ui.notify(`Alias '${event.model.name}': model ${realModelId} not found in registry`, "warning");
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
console.log("pi-orca-models: Registered");
|
|
347
|
+
}
|
|
348
|
+
export default register;
|
|
349
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EACL,eAAe,EACf,YAAY,EACZ,cAAc,EACd,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAuB,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAElF,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAE9B,gFAAgF;AAChF,+EAA+E;AAC/E,IAAI,cAAc,GAAyD,EAAE,CAAC;AAC9E,IAAI,aAAa,GAAa,EAAE,CAAC;AAEjC,SAAS,eAAe;IACtB,OAAO;QACL,KAAK,EAAE;YACL,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,6BAA6B,EAAE;YAC1E,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE;YAC1E,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE;SACzE;QACD,QAAQ,EAAE;YACR,GAAG,EAAE;gBACH,YAAY,EAAE,GAAG,EAAE,CACjB,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACzB,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,WAAW,EAAE,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,GAAG;iBAC9C,CAAC,CAAC;gBACL,QAAQ,EAAE;oBACR,GAAG,EAAE;wBACH,YAAY,EAAE,GAAG,EAAE,CACjB,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;qBACrD;iBACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,+EAA+E;AAE/E;;;;GAIG;AACH,KAAK,UAAU,qBAAqB,CAAC,EAAO,EAAE,GAAQ;IACpD,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;IACvC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEjC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/B,MAAM,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAE5D,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,OAAO;YACb,IAAI,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE;YACzB,SAAS,EAAE,IAAI,EAAE,SAAS,IAAI,KAAK;YACnC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAyB;YACjE,aAAa,EAAE,IAAI,EAAE,aAAa,IAAI,OAAO;YAC7C,SAAS,EAAE,IAAI,EAAE,SAAS,IAAI,MAAM;YACpC,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;SACzE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,CAAC,cAAc,EAAE;QAClC,OAAO,EAAE,4BAA4B,EAAE,2CAA2C;QAClF,MAAM,EAAE,mBAAmB,EAAY,yCAAyC;QAChF,GAAG,EAAE,oBAAoB;QACzB,MAAM;KACP,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,MAAM,+BAA+B,CAAC,CAAC;AAC1F,CAAC;AAED,gFAAgF;AAEhF;;;;;;;GAOG;AACH,KAAK,UAAU,YAAY,CAAC,EAAO,EAAE,GAAQ;IAC3C,2EAA2E;IAC3E,MAAM,SAAS,GAAU,CACvB,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,EAAE,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAC3E,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,cAAc,CAAC,CAAC;IAEpD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,EAAE,SAAS,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;QAC5C,KAAK,EAAE,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,EAAE;QAC9B,KAAK,EAAE,CAAC,CAAC,IAAI;QACb,WAAW,EAAE,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,EAAE;KACrC,CAAC,CAAC,CAAC;IAEJ,MAAO,GAAG,CAAC,EAAE,CAAC,MAAgD,CAC5D,CAAC,GAAQ,EAAE,KAAU,EAAE,GAAQ,EAAE,IAAS,EAAE,EAAE;QAC5C,sEAAsE;QACtE,MAAM,EAAE,GAAI,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG;YAChB,cAAc,EAAE,EAAE;YAClB,YAAY,EAAI,EAAE;YAClB,WAAW,EAAK,GAAG;YACnB,UAAU,EAAM,GAAG;YACnB,OAAO,EAAS,GAAG;SACpB,CAAC;QAIF,IAAI,MAAM,GAAW,OAAO,CAAC;QAC7B,IAAI,WAAW,GAAG,EAAE,CAAC;QAErB,sEAAsE;QACtE,IAAI,SAA0C,CAAC;QAC/C,IAAI,cAA8C,CAAC;QAEnD,SAAS,gBAAgB;YACvB,+DAA+D;YAC/D,OAAO,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;gBACvC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAChC,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,WAAW,EAAE,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,GAAG;iBAC7C,CAAC,CAAC,CAAC;gBAEJ,cAAc,GAAG,IAAI,SAAS,EAAE,CAAC;gBACjC,cAAc,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC/C,cAAc,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,sCAAsC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACpF,cAAc,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEvC,SAAS,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;gBAC7E,SAAS,CAAC,QAAQ,GAAG,CAAC,IAAS,EAAE,EAAE;oBACjC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;oBACzB,MAAM,GAAG,OAAO,CAAC;oBACjB,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBACzB,gCAAgC;oBAChC,SAAS,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;oBAC5F,uBAAuB,EAAE,CAAC;oBAC1B,GAAG,CAAC,aAAa,EAAE,CAAC;gBACtB,CAAC,CAAC;gBACF,SAAS,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC3C,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAEnC,cAAc,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvC,cAAc,CAAC,QAAQ,CACrB,IAAI,IAAI,CAAC,GAAG,CAAC,8CAA8C,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACpE,CAAC;gBACF,cAAc,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;QACL,CAAC;QAED,sEAAsE;QACtE,MAAM,WAAW,GAAG,IAAI,KAAK,EAAE,CAAC;QAChC,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;QAE3B,qFAAqF;QACrF,SAAS,WAAW,CAAC,UAAkB;YACrC,MAAM,CAAC,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;YACnC,OAAO,CAAC;gBACN,CAAC,CAAC,UAAU,CAAC,MAAM,CACf,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC9E;gBACH,CAAC,CAAC,UAAU,CAAC;QACjB,CAAC;QAED,IAAI,SAAS,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;QAEhG,SAAS,uBAAuB;YAC9B,SAAS,CAAC,QAAQ,GAAG,KAAK,EAAE,IAAS,EAAE,EAAE;gBACvC,MAAM,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAClD,eAAe,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvD,MAAM,qBAAqB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;gBACrC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,WAAW,OAAO,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;gBAC1D,MAAM,GAAG,OAAO,CAAC;gBACjB,MAAM,gBAAgB,EAAE,CAAC;gBACzB,GAAG,CAAC,aAAa,EAAE,CAAC;YACtB,CAAC,CAAC;YACF,SAAS,CAAC,QAAQ,GAAG,GAAG,EAAE;gBACxB,MAAM,GAAG,OAAO,CAAC;gBACjB,GAAG,CAAC,aAAa,EAAE,CAAC;YACtB,CAAC,CAAC;QACJ,CAAC;QACD,uBAAuB,EAAE,CAAC;QAE1B,WAAW,CAAC,QAAQ,GAAG,GAAG,EAAE;YAC1B,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC;QACF,WAAW,CAAC,QAAQ,GAAG,GAAG,EAAE;YAC1B,MAAM,GAAG,OAAO,CAAC;YACjB,GAAG,CAAC,aAAa,EAAE,CAAC;QACtB,CAAC,CAAC;QAEF,sEAAsE;QACtE,qDAAqD;QACrD,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,gBAAgB,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAC3B,KAAK,GAAG,IAAI,CAAC;YACb,GAAG,CAAC,aAAa,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,CAAC,CAAS;gBACd,IAAI,CAAC,KAAK;oBAAE,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;gBAEtC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;oBACvB,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAClC,CAAC;gBAED,uEAAuE;gBACvE,MAAM,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC;gBAC3B,EAAE,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnC,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,WAAW,+CAA+C,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACtG,EAAE,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3B,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC7F,EAAE,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3B,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACvB,EAAE,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3B,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC5D,EAAE,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACtB,CAAC;YAED,UAAU;gBACR,cAAc,EAAE,UAAU,EAAE,CAAC;gBAC7B,SAAS,CAAC,UAAU,EAAE,CAAC;gBACvB,WAAW,CAAC,UAAU,EAAE,CAAC;YAC3B,CAAC;YAED,WAAW,CAAC,IAAY;gBACtB,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;oBACvB,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC9B,CAAC;qBAAM,CAAC;oBACN,wDAAwD;oBACxD,2CAA2C;oBAC3C,MAAM,KAAK,GAAG;wBACZ,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS;wBACjD,IAAI,EAAE,IAAI,EAA+B,QAAQ;qBAClD,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAEjB,IAAI,KAAK,EAAE,CAAC;wBACV,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;oBAC9B,CAAC;yBAAM,CAAC;wBACN,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;wBACtC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;wBAC9B,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;wBACrC,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;4BACrB,+CAA+C;4BAC/C,SAAS,GAAG,IAAI,UAAU,CACxB,WAAW,CAAC,KAAK,CAAC,EAClB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,EACnC,SAAS,CACV,CAAC;4BACF,uBAAuB,EAAE,CAAC;wBAC5B,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,GAAG,CAAC,aAAa,EAAE,CAAC;YACtB,CAAC;SACF,CAAC;IACJ,CAAC,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAClE,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,QAAQ,CAAC,EAAO;IAC9B,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IAErD,6EAA6E;IAC7E,EAAE,CAAC,YAAY,EAAE,CAAC;QAChB,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,oFAAoF;QACtF,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;oBAChC,WAAW,EAAE,mBAAmB;iBACjC;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,mDAAmD;iBACjE;gBACD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iCAAiC,EAAE;gBAC5E,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,wFAAwF;iBAC3F;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB;QACD,KAAK,CAAC,OAAO,CACX,WAAmB,EACnB,MAAW,EACX,OAAoB,EACpB,SAAc,EACd,IAAS;YAET,OAAO,qBAAqB,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAC9C,CAAC;KACF,CAAC,CAAC;IAEH,8EAA8E;IAC9E,EAAE,CAAC,eAAe,CAAC,QAAQ,EAAE;QAC3B,WAAW,EAAE,kDAAkD;QAE/D,sBAAsB,CAAC,MAAc;YACnC,OAAO,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,IAAY,EAAE,GAAQ,EAAE,EAAE;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAE5B,2CAA2C;YAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC5B,OAAO;YACT,CAAC;YAED,QAAQ,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;gBACjC,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACvB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACzB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;oBAClD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;oBACvE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;oBAChD,IAAI,CAAC,KAAK,EAAE,CAAC;wBACX,MAAM,qBAAqB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;oBACvC,CAAC;oBACD,MAAM;gBACR,CAAC;gBAED,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;oBAChC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAC9B,MAAM,qBAAqB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;oBACrC,MAAM;gBACR,CAAC;gBAED,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;oBACtC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAC9B,MAAM;gBACR,CAAC;gBAED;oBACE,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,uBAAuB,UAAU,iCAAiC,EAClE,OAAO,CACR,CAAC;YACN,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,8EAA8E;IAC9E,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAW,EAAE,GAAQ,EAAE,EAAE;QACrD,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;QAC5B,cAAc,GAAG,MAAM,cAAc,EAAE,CAAC;QAExC,qDAAqD;QACrD,MAAM,SAAS,GAAU,CACvB,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,EAAE,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAC3E,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,cAAc,CAAC,CAAC;QACpD,aAAa,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEnE,MAAM,qBAAqB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAErC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,qBAAqB,EAAE,KAAK,EAAE,IAAuB,EAAE,EAAE;YACrE,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;YAC3C,OAAO,cAAc,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,uEAAuE;IACvE,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,KAAU,EAAE,GAAQ,EAAE,EAAE;QACnD,IAAI,KAAK,CAAC,KAAK,EAAE,QAAQ,KAAK,cAAc;YAAE,OAAO;QAErD,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,EAAY,CAAC;QAC7C,MAAM,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAE/D,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACzB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,KAAK,CAAC,KAAK,CAAC,IAAI,OAAO,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,UAAU,KAAK,CAAC,KAAK,CAAC,IAAI,YAAY,WAAW,wBAAwB,EACzE,SAAS,CACV,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAC5C,CAAC;AAED,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model alias resolution with four-level cascade.
|
|
3
|
+
* Spec: §8.3 — Override Cascade, §8.4 — First-Run Setup
|
|
4
|
+
*/
|
|
5
|
+
import { ModelAlias, ResolvedAlias } from "./types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Get path to user-level models.yaml.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getUserModelsPath(): string;
|
|
10
|
+
/**
|
|
11
|
+
* Get path to project-level models.yaml.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getProjectModelsPath(projectRoot?: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Bootstrap user-level models.yaml from defaults if missing.
|
|
16
|
+
* Spec: §8.4 — First-Run Setup
|
|
17
|
+
*/
|
|
18
|
+
export declare function bootstrapModels(notify?: boolean): Promise<boolean>;
|
|
19
|
+
/**
|
|
20
|
+
* Resolve a model alias through the four-level cascade.
|
|
21
|
+
* Returns null if the input is not a known alias (treat as literal model ID).
|
|
22
|
+
* Spec: §8.3
|
|
23
|
+
*/
|
|
24
|
+
export declare function resolveAlias(alias: string, projectRoot?: string): Promise<ResolvedAlias | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Resolve a model field — alias or literal provider/model-id.
|
|
27
|
+
* Spec: §3.2.3
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveModel(modelField: string, projectRoot?: string): Promise<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Set a session-level alias override (Level 4).
|
|
32
|
+
* Spec: §8.3 — Session Override
|
|
33
|
+
*/
|
|
34
|
+
export declare function setSessionAlias(alias: string, provider: string, model: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* Clear all session-level overrides.
|
|
37
|
+
* Spec: §3.6.5 — /models reset
|
|
38
|
+
*/
|
|
39
|
+
export declare function clearSessionOverrides(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Get all current session overrides.
|
|
42
|
+
*/
|
|
43
|
+
export declare function getSessionOverrides(): Map<string, ModelAlias>;
|
|
44
|
+
/**
|
|
45
|
+
* List all aliases through the full cascade.
|
|
46
|
+
* Returns a map of alias → resolved info + source.
|
|
47
|
+
*/
|
|
48
|
+
export declare function listAllAliases(projectRoot?: string): Promise<Array<{
|
|
49
|
+
alias: string;
|
|
50
|
+
provider: string;
|
|
51
|
+
model: string;
|
|
52
|
+
modelId: string;
|
|
53
|
+
source: string;
|
|
54
|
+
}>>;
|
|
55
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,UAAU,EAAoB,aAAa,EAAE,MAAM,YAAY,CAAC;AAqBzE;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE;AAWD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,MAAM,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CA4CrE;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAsC/B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAEpF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAE7D;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CACR,KAAK,CAAC;IACJ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CACH,CA8CA"}
|
package/dist/resolver.js
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model alias resolution with four-level cascade.
|
|
3
|
+
* Spec: §8.3 — Override Cascade, §8.4 — First-Run Setup
|
|
4
|
+
*/
|
|
5
|
+
import { readFile, writeFile } from "fs/promises";
|
|
6
|
+
import { existsSync } from "fs";
|
|
7
|
+
import { join, dirname } from "path";
|
|
8
|
+
import { fileURLToPath } from "url";
|
|
9
|
+
import YAML from "yaml";
|
|
10
|
+
import { ensureDir, getUserOrcaDir, getProjectOrcaDir } from "@pi-orca/core";
|
|
11
|
+
// Session-level overrides (Level 4 — most specific)
|
|
12
|
+
const sessionOverrides = new Map();
|
|
13
|
+
/**
|
|
14
|
+
* Load models.yaml from a path. Returns empty config if not found.
|
|
15
|
+
*/
|
|
16
|
+
async function loadModelsYaml(filePath) {
|
|
17
|
+
if (!existsSync(filePath)) {
|
|
18
|
+
return { aliases: {} };
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const content = await readFile(filePath, "utf-8");
|
|
22
|
+
const parsed = YAML.parse(content);
|
|
23
|
+
return parsed ?? { aliases: {} };
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return { aliases: {} };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get path to user-level models.yaml.
|
|
31
|
+
*/
|
|
32
|
+
export function getUserModelsPath() {
|
|
33
|
+
return join(getUserOrcaDir(), "models.yaml");
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get path to project-level models.yaml.
|
|
37
|
+
*/
|
|
38
|
+
export function getProjectModelsPath(projectRoot) {
|
|
39
|
+
return join(getProjectOrcaDir(projectRoot), "models.yaml");
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get path to bundled default models.yaml.
|
|
43
|
+
*/
|
|
44
|
+
function getDefaultModelsPath() {
|
|
45
|
+
// Resolve relative to this file's location
|
|
46
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
47
|
+
return join(__dirname, "..", "defaults", "models.yaml");
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Bootstrap user-level models.yaml from defaults if missing.
|
|
51
|
+
* Spec: §8.4 — First-Run Setup
|
|
52
|
+
*/
|
|
53
|
+
export async function bootstrapModels(notify = true) {
|
|
54
|
+
const userPath = getUserModelsPath();
|
|
55
|
+
if (existsSync(userPath)) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
await ensureDir(getUserOrcaDir());
|
|
59
|
+
// Read default content
|
|
60
|
+
const defaultPath = getDefaultModelsPath();
|
|
61
|
+
let defaultContent;
|
|
62
|
+
if (existsSync(defaultPath)) {
|
|
63
|
+
defaultContent = await readFile(defaultPath, "utf-8");
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// Fallback inline defaults
|
|
67
|
+
defaultContent = `aliases:
|
|
68
|
+
fast:
|
|
69
|
+
provider: anthropic
|
|
70
|
+
model: claude-haiku-4-5
|
|
71
|
+
description: "Lowest latency, lowest cost"
|
|
72
|
+
balanced:
|
|
73
|
+
provider: anthropic
|
|
74
|
+
model: claude-sonnet-4-6
|
|
75
|
+
description: "Good all-rounder"
|
|
76
|
+
thinker:
|
|
77
|
+
provider: anthropic
|
|
78
|
+
model: claude-opus-4-6
|
|
79
|
+
description: "Deep reasoning, higher cost"
|
|
80
|
+
coder:
|
|
81
|
+
provider: anthropic
|
|
82
|
+
model: claude-sonnet-4-6
|
|
83
|
+
description: "Best available for code generation"
|
|
84
|
+
`;
|
|
85
|
+
}
|
|
86
|
+
await writeFile(userPath, defaultContent, "utf-8");
|
|
87
|
+
if (notify) {
|
|
88
|
+
console.log(`Created default model aliases at ${userPath} — run /models setup to customize.`);
|
|
89
|
+
}
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Resolve a model alias through the four-level cascade.
|
|
94
|
+
* Returns null if the input is not a known alias (treat as literal model ID).
|
|
95
|
+
* Spec: §8.3
|
|
96
|
+
*/
|
|
97
|
+
export async function resolveAlias(alias, projectRoot) {
|
|
98
|
+
// Level 4: Session overrides (most specific)
|
|
99
|
+
if (sessionOverrides.has(alias)) {
|
|
100
|
+
const override = sessionOverrides.get(alias);
|
|
101
|
+
return {
|
|
102
|
+
provider: override.provider,
|
|
103
|
+
model: override.model,
|
|
104
|
+
modelId: `${override.provider}/${override.model}`,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// Level 3: CLI flag (not easily available here — skip for now, handled by environment)
|
|
108
|
+
const cliOverride = process.env[`PI_MODEL_ALIAS_${alias.toUpperCase()}`];
|
|
109
|
+
if (cliOverride) {
|
|
110
|
+
const [provider, ...modelParts] = cliOverride.split("/");
|
|
111
|
+
const model = modelParts.join("/");
|
|
112
|
+
if (provider && model) {
|
|
113
|
+
return { provider, model, modelId: cliOverride };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Level 2: Project override
|
|
117
|
+
const projectPath = getProjectModelsPath(projectRoot);
|
|
118
|
+
const projectConfig = await loadModelsYaml(projectPath);
|
|
119
|
+
if (projectConfig.aliases[alias]) {
|
|
120
|
+
const a = projectConfig.aliases[alias];
|
|
121
|
+
return { provider: a.provider, model: a.model, modelId: `${a.provider}/${a.model}` };
|
|
122
|
+
}
|
|
123
|
+
// Level 1: User defaults
|
|
124
|
+
const userPath = getUserModelsPath();
|
|
125
|
+
const userConfig = await loadModelsYaml(userPath);
|
|
126
|
+
if (userConfig.aliases[alias]) {
|
|
127
|
+
const a = userConfig.aliases[alias];
|
|
128
|
+
return { provider: a.provider, model: a.model, modelId: `${a.provider}/${a.model}` };
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Resolve a model field — alias or literal provider/model-id.
|
|
134
|
+
* Spec: §3.2.3
|
|
135
|
+
*/
|
|
136
|
+
export async function resolveModel(modelField, projectRoot) {
|
|
137
|
+
// Try alias first
|
|
138
|
+
const resolved = await resolveAlias(modelField, projectRoot);
|
|
139
|
+
if (resolved) {
|
|
140
|
+
return resolved.modelId;
|
|
141
|
+
}
|
|
142
|
+
// If it contains '/', treat as literal provider/model-id
|
|
143
|
+
if (modelField.includes("/")) {
|
|
144
|
+
return modelField;
|
|
145
|
+
}
|
|
146
|
+
// Unknown — return as-is with warning
|
|
147
|
+
return modelField;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Set a session-level alias override (Level 4).
|
|
151
|
+
* Spec: §8.3 — Session Override
|
|
152
|
+
*/
|
|
153
|
+
export function setSessionAlias(alias, provider, model) {
|
|
154
|
+
sessionOverrides.set(alias, { provider, model });
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Clear all session-level overrides.
|
|
158
|
+
* Spec: §3.6.5 — /models reset
|
|
159
|
+
*/
|
|
160
|
+
export function clearSessionOverrides() {
|
|
161
|
+
sessionOverrides.clear();
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get all current session overrides.
|
|
165
|
+
*/
|
|
166
|
+
export function getSessionOverrides() {
|
|
167
|
+
return new Map(sessionOverrides);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* List all aliases through the full cascade.
|
|
171
|
+
* Returns a map of alias → resolved info + source.
|
|
172
|
+
*/
|
|
173
|
+
export async function listAllAliases(projectRoot) {
|
|
174
|
+
// Gather all alias names from all levels
|
|
175
|
+
const allAliasNames = new Set();
|
|
176
|
+
// Session overrides
|
|
177
|
+
for (const key of sessionOverrides.keys()) {
|
|
178
|
+
allAliasNames.add(key);
|
|
179
|
+
}
|
|
180
|
+
// Project overrides
|
|
181
|
+
const projectConfig = await loadModelsYaml(getProjectModelsPath(projectRoot));
|
|
182
|
+
for (const key of Object.keys(projectConfig.aliases)) {
|
|
183
|
+
allAliasNames.add(key);
|
|
184
|
+
}
|
|
185
|
+
// User defaults
|
|
186
|
+
const userConfig = await loadModelsYaml(getUserModelsPath());
|
|
187
|
+
for (const key of Object.keys(userConfig.aliases)) {
|
|
188
|
+
allAliasNames.add(key);
|
|
189
|
+
}
|
|
190
|
+
const results = [];
|
|
191
|
+
for (const alias of allAliasNames) {
|
|
192
|
+
// Determine source
|
|
193
|
+
let source = "user defaults";
|
|
194
|
+
if (sessionOverrides.has(alias)) {
|
|
195
|
+
source = "session override";
|
|
196
|
+
}
|
|
197
|
+
else if (process.env[`PI_MODEL_ALIAS_${alias.toUpperCase()}`]) {
|
|
198
|
+
source = "CLI flag";
|
|
199
|
+
}
|
|
200
|
+
else if (projectConfig.aliases[alias]) {
|
|
201
|
+
source = "project override";
|
|
202
|
+
}
|
|
203
|
+
const resolved = await resolveAlias(alias, projectRoot);
|
|
204
|
+
if (resolved) {
|
|
205
|
+
results.push({
|
|
206
|
+
alias,
|
|
207
|
+
provider: resolved.provider,
|
|
208
|
+
model: resolved.model,
|
|
209
|
+
modelId: resolved.modelId,
|
|
210
|
+
source,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return results;
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"}
|
package/dist/tool.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model alias tool dispatcher.
|
|
3
|
+
* Spec: §8.7 — Tool Schema
|
|
4
|
+
*/
|
|
5
|
+
export interface ModelAliasToolParams {
|
|
6
|
+
action: "set" | "resolve";
|
|
7
|
+
alias?: string;
|
|
8
|
+
provider?: string;
|
|
9
|
+
model?: string;
|
|
10
|
+
projectRoot?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function executeModelAliasTool(params: ModelAliasToolParams): Promise<Record<string, unknown>>;
|
|
13
|
+
//# sourceMappingURL=tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,KAAK,GAAG,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA6DlC"}
|
package/dist/tool.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model alias tool dispatcher.
|
|
3
|
+
* Spec: §8.7 — Tool Schema
|
|
4
|
+
*/
|
|
5
|
+
import { resolveAlias, setSessionAlias } from "./resolver.js";
|
|
6
|
+
export async function executeModelAliasTool(params) {
|
|
7
|
+
switch (params.action) {
|
|
8
|
+
case "set": {
|
|
9
|
+
if (!params.alias) {
|
|
10
|
+
return { success: false, error: "The 'alias' parameter is required for set action" };
|
|
11
|
+
}
|
|
12
|
+
if (!params.provider || !params.model) {
|
|
13
|
+
// Try parsing from model as "provider/model"
|
|
14
|
+
if (params.model?.includes("/")) {
|
|
15
|
+
const [prov, ...modelParts] = params.model.split("/");
|
|
16
|
+
setSessionAlias(params.alias, prov, modelParts.join("/"));
|
|
17
|
+
return {
|
|
18
|
+
success: true,
|
|
19
|
+
message: `Set session alias '${params.alias}' → ${params.model}`,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
success: false,
|
|
24
|
+
error: "Both 'provider' and 'model' are required, or 'model' as 'provider/model-id'",
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
setSessionAlias(params.alias, params.provider, params.model);
|
|
28
|
+
return {
|
|
29
|
+
success: true,
|
|
30
|
+
message: `Set session alias '${params.alias}' → ${params.provider}/${params.model}`,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
case "resolve": {
|
|
34
|
+
if (!params.alias) {
|
|
35
|
+
return { success: false, error: "The 'alias' parameter is required for resolve action" };
|
|
36
|
+
}
|
|
37
|
+
const resolved = await resolveAlias(params.alias, params.projectRoot);
|
|
38
|
+
if (resolved) {
|
|
39
|
+
return {
|
|
40
|
+
success: true,
|
|
41
|
+
alias: params.alias,
|
|
42
|
+
provider: resolved.provider,
|
|
43
|
+
model: resolved.model,
|
|
44
|
+
modelId: resolved.modelId,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// Not an alias — check if literal model ID
|
|
48
|
+
if (params.alias.includes("/")) {
|
|
49
|
+
return {
|
|
50
|
+
success: true,
|
|
51
|
+
alias: params.alias,
|
|
52
|
+
modelId: params.alias,
|
|
53
|
+
literal: true,
|
|
54
|
+
message: "Input is a literal provider/model-id, not an alias",
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
success: false,
|
|
59
|
+
error: `Unknown alias '${params.alias}'. Use /models to see available aliases.`,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
default:
|
|
63
|
+
return { success: false, error: `Unknown action: ${params.action}` };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=tool.js.map
|
package/dist/tool.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAkB,MAAM,eAAe,CAAC;AAU9E,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAA4B;IAE5B,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kDAAkD,EAAE,CAAC;YACvF,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACtC,6CAA6C;gBAC7C,IAAI,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBAChC,MAAM,CAAC,IAAI,EAAE,GAAG,UAAU,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACtD,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC1D,OAAO;wBACL,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,sBAAsB,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,KAAK,EAAE;qBACjE,CAAC;gBACJ,CAAC;gBACD,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,6EAA6E;iBACrF,CAAC;YACJ,CAAC;YACD,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7D,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,sBAAsB,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,EAAE;aACpF,CAAC;QACJ,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,sDAAsD,EAAE,CAAC;YAC3F,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACtE,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oBAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;oBACrB,OAAO,EAAE,QAAQ,CAAC,OAAO;iBAC1B,CAAC;YACJ,CAAC;YACD,2CAA2C;YAC3C,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,OAAO,EAAE,MAAM,CAAC,KAAK;oBACrB,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,oDAAoD;iBAC9D,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,kBAAkB,MAAM,CAAC,KAAK,0CAA0C;aAChF,CAAC;QACJ,CAAC;QAED;YACE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAoB,MAAc,CAAC,MAAM,EAAE,EAAE,CAAC;IAClF,CAAC;AACH,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for pi-orca-models.
|
|
3
|
+
* Spec: §8.2 — Model Alias Configuration
|
|
4
|
+
*/
|
|
5
|
+
export interface ModelAlias {
|
|
6
|
+
provider: string;
|
|
7
|
+
model: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ModelAliasConfig {
|
|
11
|
+
aliases: Record<string, ModelAlias>;
|
|
12
|
+
}
|
|
13
|
+
export interface ResolvedAlias {
|
|
14
|
+
provider: string;
|
|
15
|
+
model: string;
|
|
16
|
+
/** Full provider/model-id string */
|
|
17
|
+
modelId: string;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;CACjB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
package/dist/widget.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget.d.ts","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuB9E"}
|
package/dist/widget.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Models widget renderer.
|
|
3
|
+
* Spec: §8.9 — Widget
|
|
4
|
+
*/
|
|
5
|
+
import { listAllAliases } from "./resolver.js";
|
|
6
|
+
/**
|
|
7
|
+
* Render the models widget as a string.
|
|
8
|
+
* Spec: §8.9
|
|
9
|
+
*/
|
|
10
|
+
export async function renderModelsWidget(projectRoot) {
|
|
11
|
+
const aliases = await listAllAliases(projectRoot);
|
|
12
|
+
const lines = ["🎯 Model Aliases"];
|
|
13
|
+
if (aliases.length === 0) {
|
|
14
|
+
lines.push(" (no aliases configured — run /models setup to configure)");
|
|
15
|
+
return lines.join("\n");
|
|
16
|
+
}
|
|
17
|
+
const sources = new Set(aliases.map((a) => a.source));
|
|
18
|
+
const sourceLabel = Array.from(sources).join(" + ");
|
|
19
|
+
for (const alias of aliases) {
|
|
20
|
+
const aliasStr = alias.alias.padEnd(10);
|
|
21
|
+
const modelStr = alias.modelId.padEnd(44);
|
|
22
|
+
lines.push(` ${aliasStr} → ${modelStr} ✓`);
|
|
23
|
+
}
|
|
24
|
+
lines.push(" " + "─".repeat(50));
|
|
25
|
+
lines.push(` Source: ${sourceLabel}`);
|
|
26
|
+
return lines.join("\n");
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=widget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget.js","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,WAAoB;IAC3D,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IAElD,MAAM,KAAK,GAAa,CAAC,kBAAkB,CAAC,CAAC;IAE7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QACzE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEpD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,MAAM,QAAQ,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,KAAK,CAAC,IAAI,CAAC,aAAa,WAAW,EAAE,CAAC,CAAC;IAEvC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pi-orca/models",
|
|
3
|
+
"version": "0.0.2-dev.20260413162335",
|
|
4
|
+
"description": "Model alias management",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"defaults"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc -p tsconfig.json",
|
|
20
|
+
"clean": "rm -rf dist *.tsbuildinfo",
|
|
21
|
+
"typecheck": "tsc --noEmit",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"test:watch": "vitest"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"pi-package",
|
|
27
|
+
"pi-orca",
|
|
28
|
+
"pi-agent",
|
|
29
|
+
"pi-extension"
|
|
30
|
+
],
|
|
31
|
+
"author": "Bindu / Ba",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public"
|
|
35
|
+
},
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "https://github.com/bwavell/pi-orca.git",
|
|
39
|
+
"directory": "packages/pi-orca-models"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@pi-orca/core": "0.0.2-dev.20260413162335"
|
|
43
|
+
}
|
|
44
|
+
}
|