@gtc6244/immediacy-daemon 0.1.1 → 0.1.2

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.
Files changed (66) hide show
  1. package/README.md +51 -25
  2. package/dist/src/agent/agent.d.ts +19 -6
  3. package/dist/src/agent/agent.js +3 -1
  4. package/dist/src/agent/agent.js.map +1 -1
  5. package/dist/src/agent/anthropic-probe.d.ts +24 -0
  6. package/dist/src/agent/anthropic-probe.js +81 -0
  7. package/dist/src/agent/anthropic-probe.js.map +1 -0
  8. package/dist/src/agent/claude.d.ts +4 -2
  9. package/dist/src/agent/claude.js +32 -4
  10. package/dist/src/agent/claude.js.map +1 -1
  11. package/dist/src/agent/codex.d.ts +1 -1
  12. package/dist/src/agent/codex.js +26 -3
  13. package/dist/src/agent/codex.js.map +1 -1
  14. package/dist/src/agent/images.d.ts +21 -0
  15. package/dist/src/agent/images.js +54 -0
  16. package/dist/src/agent/images.js.map +1 -0
  17. package/dist/src/agent/mock.d.ts +1 -1
  18. package/dist/src/agent/mock.js +28 -3
  19. package/dist/src/agent/mock.js.map +1 -1
  20. package/dist/src/agent/ollama-probe.d.ts +28 -0
  21. package/dist/src/agent/ollama-probe.js +76 -0
  22. package/dist/src/agent/ollama-probe.js.map +1 -0
  23. package/dist/src/agent/ollama.d.ts +42 -0
  24. package/dist/src/agent/ollama.js +64 -0
  25. package/dist/src/agent/ollama.js.map +1 -0
  26. package/dist/src/agent/openai-probe.d.ts +18 -0
  27. package/dist/src/agent/openai-probe.js +83 -0
  28. package/dist/src/agent/openai-probe.js.map +1 -0
  29. package/dist/src/agent/openrouter-probe.d.ts +21 -0
  30. package/dist/src/agent/openrouter-probe.js +77 -0
  31. package/dist/src/agent/openrouter-probe.js.map +1 -0
  32. package/dist/src/crypto.js +7 -2
  33. package/dist/src/crypto.js.map +1 -1
  34. package/dist/src/index.d.ts +3 -0
  35. package/dist/src/index.js +35 -3
  36. package/dist/src/index.js.map +1 -1
  37. package/dist/src/jobs/scheduler.d.ts +1 -0
  38. package/dist/src/jobs/scheduler.js +1 -0
  39. package/dist/src/jobs/scheduler.js.map +1 -1
  40. package/dist/src/media-watch.d.ts +29 -0
  41. package/dist/src/media-watch.js +108 -0
  42. package/dist/src/media-watch.js.map +1 -0
  43. package/dist/src/media.d.ts +54 -0
  44. package/dist/src/media.js +156 -0
  45. package/dist/src/media.js.map +1 -0
  46. package/dist/src/model-efforts.d.ts +49 -0
  47. package/dist/src/model-efforts.js +107 -0
  48. package/dist/src/model-efforts.js.map +1 -0
  49. package/dist/src/models.d.ts +50 -17
  50. package/dist/src/models.js +119 -21
  51. package/dist/src/models.js.map +1 -1
  52. package/dist/src/projects.d.ts +7 -0
  53. package/dist/src/projects.js +14 -0
  54. package/dist/src/projects.js.map +1 -1
  55. package/dist/src/protocol.d.ts +127 -9
  56. package/dist/src/protocol.js +1 -1
  57. package/dist/src/server.js +105 -5
  58. package/dist/src/server.js.map +1 -1
  59. package/dist/src/types.d.ts +9 -0
  60. package/dist/src/workspace.d.ts +25 -0
  61. package/dist/src/workspace.js +159 -6
  62. package/dist/src/workspace.js.map +1 -1
  63. package/package.json +3 -2
  64. package/dist/src/migrate-state-dir.d.ts +0 -1
  65. package/dist/src/migrate-state-dir.js +0 -47
  66. package/dist/src/migrate-state-dir.js.map +0 -1
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Reasoning-effort policy — the single source of truth for which effort levels
3
+ * each provider/family exposes, and the labels shown to clients.
4
+ *
5
+ * Effort ("how hard the model thinks") is a per-model knob:
6
+ * - Claude → low / medium / high / xhigh / max, gated by model family
7
+ * (see effortsForClaude). Handed to the Agent SDK's `effort`
8
+ * option; unsupported levels are silently downgraded by the CLI.
9
+ * - Codex → minimal / low / medium / high, passed to the Codex CLI as
10
+ * `-c model_reasoning_effort=<level>`.
11
+ * - OpenRouter → low / medium / high when the model advertises `reasoning`
12
+ * in its `supported_parameters`.
13
+ * - Ollama → none.
14
+ *
15
+ * Discovery probes (anthropic/openai/openrouter) and the static fallback
16
+ * catalog in models.ts both call these helpers, so a model carries the same
17
+ * effort set however it was surfaced.
18
+ */
19
+ const YEAR_MS = 365 * 24 * 60 * 60 * 1000;
20
+ /** Human-readable label for each effort id. */
21
+ const EFFORT_LABELS = {
22
+ minimal: "Minimal",
23
+ low: "Low",
24
+ medium: "Medium",
25
+ high: "High",
26
+ xhigh: "Extra high",
27
+ max: "Max",
28
+ };
29
+ /** Build `ModelEffort[]` from ordered ids, labeling each from the table above. */
30
+ function mk(ids) {
31
+ return ids.map((id) => ({ id, label: EFFORT_LABELS[id] ?? id }));
32
+ }
33
+ /** True if `iso` is missing/unparseable or falls within the trailing 12 months. */
34
+ export function withinLastYear(iso) {
35
+ if (!iso)
36
+ return true;
37
+ const t = Date.parse(iso);
38
+ if (Number.isNaN(t))
39
+ return true;
40
+ return t >= Date.now() - YEAR_MS;
41
+ }
42
+ /**
43
+ * Effort levels a Claude model supports, by family (per Anthropic's effort docs):
44
+ * - Fable / Mythos, Opus 4.7+/4.8 → low, medium, high, xhigh, max
45
+ * - Opus 4.6, Sonnet 4.6 → low, medium, high, max
46
+ * - Opus 4.5 → low, medium, high
47
+ * - Sonnet 4.5 / Haiku / older → none (effort would error / no-op)
48
+ * Returns undefined when the model has no effort knob.
49
+ */
50
+ export function effortsForClaude(id) {
51
+ const s = id.toLowerCase();
52
+ if (/fable|mythos/.test(s))
53
+ return mk(["low", "medium", "high", "xhigh", "max"]);
54
+ if (/opus-4-(7|8)\b/.test(s))
55
+ return mk(["low", "medium", "high", "xhigh", "max"]);
56
+ if (/opus-4-6\b/.test(s))
57
+ return mk(["low", "medium", "high", "max"]);
58
+ if (/sonnet-4-6\b/.test(s))
59
+ return mk(["low", "medium", "high", "max"]);
60
+ if (/opus-4-5\b/.test(s))
61
+ return mk(["low", "medium", "high"]);
62
+ return undefined;
63
+ }
64
+ /**
65
+ * Effort levels a Codex/OpenAI model supports:
66
+ * - GPT-5 family → minimal, low, medium, high
67
+ * - o-series (o1/o3/o4…) → low, medium, high
68
+ * - everything else (incl. the "codex" account-default sentinel) → none
69
+ */
70
+ export function effortsForCodex(id) {
71
+ const s = id.toLowerCase();
72
+ if (s === "codex")
73
+ return undefined;
74
+ if (/^gpt-5/.test(s))
75
+ return mk(["minimal", "low", "medium", "high"]);
76
+ if (/^o[0-9]/.test(s))
77
+ return mk(["low", "medium", "high"]);
78
+ return undefined;
79
+ }
80
+ /**
81
+ * Effort levels for an OpenRouter model — low/medium/high when it advertises
82
+ * `reasoning` support, else none. OpenRouter maps these onto its
83
+ * `reasoning: { effort }` request field.
84
+ */
85
+ export function effortsForOpenRouter(supportedParameters) {
86
+ if (supportedParameters?.includes("reasoning")) {
87
+ return mk(["low", "medium", "high"]);
88
+ }
89
+ return undefined;
90
+ }
91
+ /** Prefer "high" for Claude (the coding/agentic sweet spot), else the top level. */
92
+ export function DEFAULT_CLAUDE_EFFORT(efforts) {
93
+ return pick(efforts, "high");
94
+ }
95
+ /** Prefer "medium" for Codex, else the top level. */
96
+ export function DEFAULT_CODEX_EFFORT(efforts) {
97
+ return pick(efforts, "medium");
98
+ }
99
+ /** Prefer "medium" for OpenRouter, else the top level. */
100
+ export function DEFAULT_OPENROUTER_EFFORT(efforts) {
101
+ return pick(efforts, "medium");
102
+ }
103
+ function pick(efforts, preferred) {
104
+ const hit = efforts.find((e) => e.id === preferred);
105
+ return (hit ?? efforts[efforts.length - 1])?.id ?? preferred;
106
+ }
107
+ //# sourceMappingURL=model-efforts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-efforts.js","sourceRoot":"","sources":["../../src/model-efforts.ts"],"names":[],"mappings":"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"}
@@ -1,36 +1,69 @@
1
1
  /**
2
- * Model catalog — the daemon's source of truth for which agent models the app
3
- * may pick from.
2
+ * Model catalog — the daemon's source of truth for which agent models (and, for
3
+ * models that support it, which reasoning-effort levels) the app may pick from.
4
4
  *
5
5
  * A model's `provider` decides which agent backend runs it:
6
- * - "claude" → ClaudeAgent (Agent SDK, `model` option)
7
- * - "codex" → CodexAgent (OpenAI Codex CLI, `-m` flag)
6
+ * - "claude" → ClaudeAgent (Agent SDK, `model` + `effort` options)
7
+ * - "codex" → CodexAgent (OpenAI Codex CLI, `-m` + `-c
8
+ * model_reasoning_effort=<level>`)
8
9
  * - "openrouter" → OpenRouterAgent (Agent SDK against OpenRouter's
9
- * Anthropic-compatible endpoint; the `id` is an OpenRouter
10
- * `vendor/model` slug — see OpenRouterAgent / OPENROUTER_API_KEY)
10
+ * Anthropic-compatible endpoint; `id` is an OpenRouter
11
+ * `vendor/model` slug)
12
+ * - "ollama" → OllamaAgent (Agent SDK against a local Ollama's
13
+ * Anthropic-compatible endpoint; `id` is an Ollama model tag.
14
+ * Runs on-device, no key, no billing)
11
15
  *
12
- * The list is deliberately scoped to models released in roughly the last year
13
- * (as of 2026-08). `id` is the exact string handed to the backend; keep them in
14
- * sync with each provider's model IDs. The Dart mirror is app/lib/models.dart.
16
+ * DISCOVERY. Online providers are enumerated live from their model APIs and
17
+ * scoped to the last 12 months (see anthropic/openai/openrouter-probe.ts); the
18
+ * effort levels each model supports come from model-efforts.ts. Ollama is
19
+ * discovered from whatever is installed locally (every model, no date filter).
20
+ * The static {@link FALLBACK_MODELS} below is only used for a provider whose
21
+ * live probe returned nothing — no API key, or an unreachable endpoint — so the
22
+ * picker is never empty. `id` is the exact string handed to the backend.
23
+ *
24
+ * The Dart mirror is packages/immediacy_core/lib/models.dart (ModelInfo /
25
+ * ModelEffort shape only).
15
26
  */
16
27
  import type { ModelInfo, ModelProvider } from "./protocol.js";
17
- /**
18
- * Available models, in display order. Exactly one is marked `default: true`;
19
- * that model backs new workspaces when the client doesn't pick one, and any
20
- * workspace restored from before model selection existed.
21
- */
22
- export declare const MODELS: ModelInfo[];
23
- export declare const DEFAULT_MODEL: ModelInfo;
28
+ import type { CredentialsStore } from "./credentials.js";
29
+ /** The id backing new workspaces when a client doesn't pick a model. */
30
+ export declare const DEFAULT_MODEL_ID = "claude-opus-4-8";
31
+ export declare const FALLBACK_MODELS: ModelInfo[];
24
32
  /**
25
33
  * Sentinel Codex model id meaning "don't pass -m; use the account's default".
26
34
  * Passing an explicit model id requires API-key billing; a ChatGPT-login Codex
27
35
  * only accepts its plan default, so this is the safe cross-setup choice.
28
36
  */
29
37
  export declare const CODEX_DEFAULT_MODEL = "codex";
30
- /** Look up a model by id (undefined id → the default). */
38
+ /**
39
+ * The full catalog surfaced to clients: live-discovered online models (Claude /
40
+ * Codex / OpenRouter, scoped to the last 12 months) plus every locally-installed
41
+ * Ollama model. A provider with no live results falls back to its curated static
42
+ * entries so the picker is never empty. Recomputed on each read so a fresh probe
43
+ * shows up without restarting the daemon.
44
+ */
45
+ export declare function allModels(): ModelInfo[];
46
+ /** The model that backs new workspaces when a client doesn't pick one. */
47
+ export declare function defaultModel(): ModelInfo;
48
+ /**
49
+ * Refresh every provider's catalog from its live API, using the resolved key
50
+ * for each (Anthropic/OpenAI from CredentialsStore; OpenRouter listing is
51
+ * keyless; Ollama is local). Runs the four probes concurrently; each is
52
+ * independently best-effort and never throws.
53
+ */
54
+ export declare function refreshAllModels(credentials?: CredentialsStore, force?: boolean): Promise<void>;
55
+ /** Look up a model by id (undefined id → the default). Includes discovered
56
+ * online + Ollama models so a workspace resolves to the right backend. */
31
57
  export declare function modelById(id?: string): ModelInfo | undefined;
32
58
  /**
33
59
  * Which backend runs a given model id. Unknown or missing ids fall back to
34
60
  * "claude" so restored/legacy workspaces keep working.
35
61
  */
36
62
  export declare function providerFor(id?: string): ModelProvider;
63
+ /**
64
+ * Resolve a client-supplied effort id against a model's supported set: returns
65
+ * the id only if the model actually offers it, else undefined (so an invalid or
66
+ * stale effort never reaches a backend). Falls back to the model's `defaultEffort`
67
+ * when `effortId` is absent.
68
+ */
69
+ export declare function resolveEffort(modelId: string | undefined, effortId: string | undefined): string | undefined;
@@ -1,34 +1,66 @@
1
1
  /**
2
- * Model catalog — the daemon's source of truth for which agent models the app
3
- * may pick from.
2
+ * Model catalog — the daemon's source of truth for which agent models (and, for
3
+ * models that support it, which reasoning-effort levels) the app may pick from.
4
4
  *
5
5
  * A model's `provider` decides which agent backend runs it:
6
- * - "claude" → ClaudeAgent (Agent SDK, `model` option)
7
- * - "codex" → CodexAgent (OpenAI Codex CLI, `-m` flag)
6
+ * - "claude" → ClaudeAgent (Agent SDK, `model` + `effort` options)
7
+ * - "codex" → CodexAgent (OpenAI Codex CLI, `-m` + `-c
8
+ * model_reasoning_effort=<level>`)
8
9
  * - "openrouter" → OpenRouterAgent (Agent SDK against OpenRouter's
9
- * Anthropic-compatible endpoint; the `id` is an OpenRouter
10
- * `vendor/model` slug — see OpenRouterAgent / OPENROUTER_API_KEY)
10
+ * Anthropic-compatible endpoint; `id` is an OpenRouter
11
+ * `vendor/model` slug)
12
+ * - "ollama" → OllamaAgent (Agent SDK against a local Ollama's
13
+ * Anthropic-compatible endpoint; `id` is an Ollama model tag.
14
+ * Runs on-device, no key, no billing)
11
15
  *
12
- * The list is deliberately scoped to models released in roughly the last year
13
- * (as of 2026-08). `id` is the exact string handed to the backend; keep them in
14
- * sync with each provider's model IDs. The Dart mirror is app/lib/models.dart.
16
+ * DISCOVERY. Online providers are enumerated live from their model APIs and
17
+ * scoped to the last 12 months (see anthropic/openai/openrouter-probe.ts); the
18
+ * effort levels each model supports come from model-efforts.ts. Ollama is
19
+ * discovered from whatever is installed locally (every model, no date filter).
20
+ * The static {@link FALLBACK_MODELS} below is only used for a provider whose
21
+ * live probe returned nothing — no API key, or an unreachable endpoint — so the
22
+ * picker is never empty. `id` is the exact string handed to the backend.
23
+ *
24
+ * The Dart mirror is packages/immediacy_core/lib/models.dart (ModelInfo /
25
+ * ModelEffort shape only).
15
26
  */
27
+ import { ollamaModels, refreshOllamaModels } from "./agent/ollama-probe.js";
28
+ import { anthropicModels, refreshAnthropicModels, } from "./agent/anthropic-probe.js";
29
+ import { openaiModels, refreshOpenAIModels } from "./agent/openai-probe.js";
30
+ import { openrouterModels, refreshOpenRouterModels, } from "./agent/openrouter-probe.js";
31
+ import { effortsForClaude, effortsForCodex, DEFAULT_CLAUDE_EFFORT, DEFAULT_CODEX_EFFORT, } from "./model-efforts.js";
32
+ /** The id backing new workspaces when a client doesn't pick a model. */
33
+ export const DEFAULT_MODEL_ID = "claude-opus-4-8";
34
+ /** Attach the effort set for a static Claude/Codex entry (keeps it in sync). */
35
+ function withClaudeEfforts(m) {
36
+ const efforts = effortsForClaude(m.id);
37
+ return efforts
38
+ ? { ...m, efforts, defaultEffort: DEFAULT_CLAUDE_EFFORT(efforts) }
39
+ : m;
40
+ }
41
+ function withCodexEfforts(m) {
42
+ const efforts = effortsForCodex(m.id);
43
+ return efforts
44
+ ? { ...m, efforts, defaultEffort: DEFAULT_CODEX_EFFORT(efforts) }
45
+ : m;
46
+ }
16
47
  /**
17
- * Available models, in display order. Exactly one is marked `default: true`;
18
- * that model backs new workspaces when the client doesn't pick one, and any
19
- * workspace restored from before model selection existed.
48
+ * Curated fallback catalog (release-scoped to roughly the last year), used only
49
+ * for a provider whose live probe yielded nothing. Effort metadata is attached
50
+ * from the shared policy so a fallback entry matches its discovered twin.
20
51
  */
21
- export const MODELS = [
52
+ const FALLBACK_CLAUDE = [
22
53
  // Anthropic — Claude (Agent SDK).
23
54
  { id: "claude-opus-4-8", label: "Claude Opus 4.8", provider: "claude", default: true },
24
55
  { id: "claude-fable-5", label: "Claude Fable 5", provider: "claude" },
25
56
  { id: "claude-opus-4-7", label: "Claude Opus 4.7", provider: "claude" },
26
57
  { id: "claude-opus-4-6", label: "Claude Opus 4.6", provider: "claude" },
27
58
  { id: "claude-opus-4-5", label: "Claude Opus 4.5", provider: "claude" },
28
- { id: "claude-sonnet-5", label: "Claude Sonnet 5", provider: "claude" },
29
59
  { id: "claude-sonnet-4-6", label: "Claude Sonnet 4.6", provider: "claude" },
30
60
  { id: "claude-sonnet-4-5", label: "Claude Sonnet 4.5", provider: "claude" },
31
61
  { id: "claude-haiku-4-5", label: "Claude Haiku 4.5", provider: "claude" },
62
+ ].map((m) => withClaudeEfforts(m));
63
+ const FALLBACK_CODEX = [
32
64
  // OpenAI — Codex CLI. "codex" is a sentinel meaning "let Codex pick the
33
65
  // account's default model" — the only option that works on a ChatGPT login
34
66
  // (explicit ids require API-key billing). See CODEX_DEFAULT_MODEL.
@@ -38,28 +70,78 @@ export const MODELS = [
38
70
  { id: "gpt-5-mini", label: "GPT-5 mini", provider: "codex" },
39
71
  { id: "o4-mini", label: "OpenAI o4-mini", provider: "codex" },
40
72
  { id: "o3", label: "OpenAI o3", provider: "codex" },
73
+ ].map((m) => withCodexEfforts(m));
74
+ const FALLBACK_OPENROUTER = [
41
75
  // OpenRouter — routed through the Agent SDK against OpenRouter's
42
76
  // Anthropic-compatible endpoint (needs OPENROUTER_API_KEY). `id` is the exact
43
- // OpenRouter `vendor/model` slug; this is a curated starter set of capable
44
- // agentic models the native Claude/Codex backends don't already cover — add
45
- // any slug from https://openrouter.ai/models here.
77
+ // OpenRouter `vendor/model` slug; a curated starter set the native
78
+ // Claude/Codex backends don't already cover.
46
79
  { id: "google/gemini-3.7-flash", label: "Gemini 3.7 Flash", provider: "openrouter" },
47
80
  { id: "deepseek/deepseek-v4-pro-0813", label: "DeepSeek V4 Pro", provider: "openrouter" },
48
81
  { id: "x-ai/grok-4.6", label: "Grok 4.6", provider: "openrouter" },
49
82
  { id: "qwen/qwen3.8-max", label: "Qwen3.8 Max", provider: "openrouter" },
50
83
  ];
51
- export const DEFAULT_MODEL = MODELS.find((m) => m.default) ?? MODELS[0];
84
+ export const FALLBACK_MODELS = [
85
+ ...FALLBACK_CLAUDE,
86
+ ...FALLBACK_CODEX,
87
+ ...FALLBACK_OPENROUTER,
88
+ ];
52
89
  /**
53
90
  * Sentinel Codex model id meaning "don't pass -m; use the account's default".
54
91
  * Passing an explicit model id requires API-key billing; a ChatGPT-login Codex
55
92
  * only accepts its plan default, so this is the safe cross-setup choice.
56
93
  */
57
94
  export const CODEX_DEFAULT_MODEL = "codex";
58
- /** Look up a model by id (undefined id → the default). */
95
+ /** Fallback entries for one provider (used when its live probe is empty). */
96
+ function fallbackFor(provider) {
97
+ return FALLBACK_MODELS.filter((m) => m.provider === provider);
98
+ }
99
+ /**
100
+ * The full catalog surfaced to clients: live-discovered online models (Claude /
101
+ * Codex / OpenRouter, scoped to the last 12 months) plus every locally-installed
102
+ * Ollama model. A provider with no live results falls back to its curated static
103
+ * entries so the picker is never empty. Recomputed on each read so a fresh probe
104
+ * shows up without restarting the daemon.
105
+ */
106
+ export function allModels() {
107
+ const claude = anthropicModels();
108
+ const codex = openaiModels();
109
+ const openrouter = openrouterModels();
110
+ return [
111
+ ...(claude.length ? claude : fallbackFor("claude")),
112
+ ...(codex.length ? codex : fallbackFor("codex")),
113
+ ...(openrouter.length ? openrouter : fallbackFor("openrouter")),
114
+ ...ollamaModels(),
115
+ ];
116
+ }
117
+ /** The model that backs new workspaces when a client doesn't pick one. */
118
+ export function defaultModel() {
119
+ const models = allModels();
120
+ return (models.find((m) => m.id === DEFAULT_MODEL_ID) ??
121
+ models.find((m) => m.default) ??
122
+ models[0] ??
123
+ FALLBACK_MODELS[0]);
124
+ }
125
+ /**
126
+ * Refresh every provider's catalog from its live API, using the resolved key
127
+ * for each (Anthropic/OpenAI from CredentialsStore; OpenRouter listing is
128
+ * keyless; Ollama is local). Runs the four probes concurrently; each is
129
+ * independently best-effort and never throws.
130
+ */
131
+ export async function refreshAllModels(credentials, force = false) {
132
+ await Promise.allSettled([
133
+ refreshAnthropicModels(credentials?.getKey("anthropic"), force),
134
+ refreshOpenAIModels(credentials?.getKey("openai"), force),
135
+ refreshOpenRouterModels(credentials?.getKey("openrouter"), force),
136
+ refreshOllamaModels(force),
137
+ ]);
138
+ }
139
+ /** Look up a model by id (undefined id → the default). Includes discovered
140
+ * online + Ollama models so a workspace resolves to the right backend. */
59
141
  export function modelById(id) {
60
142
  if (!id)
61
- return DEFAULT_MODEL;
62
- return MODELS.find((m) => m.id === id);
143
+ return defaultModel();
144
+ return allModels().find((m) => m.id === id);
63
145
  }
64
146
  /**
65
147
  * Which backend runs a given model id. Unknown or missing ids fall back to
@@ -68,4 +150,20 @@ export function modelById(id) {
68
150
  export function providerFor(id) {
69
151
  return modelById(id)?.provider ?? "claude";
70
152
  }
153
+ /**
154
+ * Resolve a client-supplied effort id against a model's supported set: returns
155
+ * the id only if the model actually offers it, else undefined (so an invalid or
156
+ * stale effort never reaches a backend). Falls back to the model's `defaultEffort`
157
+ * when `effortId` is absent.
158
+ */
159
+ export function resolveEffort(modelId, effortId) {
160
+ const model = modelById(modelId);
161
+ if (!model?.efforts?.length)
162
+ return undefined;
163
+ if (effortId && model.efforts.some((e) => e.id === effortId))
164
+ return effortId;
165
+ if (!effortId)
166
+ return model.defaultEffort;
167
+ return undefined;
168
+ }
71
169
  //# sourceMappingURL=models.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"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"}
@@ -72,6 +72,13 @@ export declare class ProjectStore {
72
72
  ensureForSource(src: ProjectSource): Promise<ProjectRecord>;
73
73
  /** Remove a project. The caller guards that no worktrees still reference it. */
74
74
  remove(id: string): Promise<void>;
75
+ /**
76
+ * Rename a project — display name only. The on-disk managed dir (`slugFor`) is
77
+ * derived from the name at create time and never recomputed, so it is left as
78
+ * is (matching existing behavior). No-op on an unknown id, a blank name, or an
79
+ * unchanged name; persists only when the name actually changes.
80
+ */
81
+ rename(id: string, name: string): Promise<void>;
75
82
  /**
76
83
  * Rewrite the stored project order. `list()` returns projects in Map insertion
77
84
  * order, so we rebuild the Map in the requested order. Unknown ids are ignored;
@@ -177,6 +177,20 @@ export class ProjectStore {
177
177
  if (this.projects.delete(id))
178
178
  await this.persist();
179
179
  }
180
+ /**
181
+ * Rename a project — display name only. The on-disk managed dir (`slugFor`) is
182
+ * derived from the name at create time and never recomputed, so it is left as
183
+ * is (matching existing behavior). No-op on an unknown id, a blank name, or an
184
+ * unchanged name; persists only when the name actually changes.
185
+ */
186
+ async rename(id, name) {
187
+ const r = this.projects.get(id);
188
+ const next = name.trim();
189
+ if (!r || !next || r.name === next)
190
+ return;
191
+ r.name = next;
192
+ await this.persist();
193
+ }
180
194
  /**
181
195
  * Rewrite the stored project order. `list()` returns projects in Map insertion
182
196
  * order, so we rebuild the Map in the requested order. Unknown ids are ignored;
@@ -1 +1 @@
1
- {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/projects.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/projects.ts"],"names":[],"mappings":"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"}