create-loopengine 0.1.38 → 0.1.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "create-loopengine",
3
- "version": "0.1.38",
3
+ "version": "0.1.41",
4
4
  "description": "Scaffold a new loopengine agent project — a runnable HTTP server with one example agent, in your own repo.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "homepage": "https://loopengine.co",
8
8
  "repository": {
9
9
  "type": "git",
10
- "url": "git+https://github.com/evanyan22/create-loopengine.git"
10
+ "url": "git+https://github.com/loopengine-co/create-loopengine.git"
11
11
  },
12
12
  "bin": {
13
13
  "create-loopengine": "dist/cli.js"
@@ -102,6 +102,7 @@ import {
102
102
  installAbility,
103
103
  upgradeAbility,
104
104
  listInstalledAbilities,
105
+ backfillDependencies,
105
106
  AbilityAlreadyInstalledError,
106
107
  AbilityCollisionError,
107
108
  AbilityManifestError,
@@ -355,7 +356,16 @@ async function describeAgent(entry: RegistryEntry): Promise<Record<string, unkno
355
356
  name: config.name,
356
357
  systemPrompt: config.systemPrompt,
357
358
  model: config.model
358
- ? { provider: config.model.provider, model: config.model.model, maxTokens: config.model.maxTokens }
359
+ ? {
360
+ provider: config.model.provider,
361
+ model: config.model.model,
362
+ maxTokens: config.model.maxTokens,
363
+ // Only the 'openai' variant of AgentModelConfig carries this —
364
+ // an `in` check rather than a cast, so a provider that can
365
+ // never have it just reports undefined instead of needing its
366
+ // own narrowing branch here.
367
+ reasoningEffort: 'reasoningEffort' in config.model ? config.model.reasoningEffort : undefined,
368
+ }
359
369
  : 'custom (module exports its own createModelCall)',
360
370
  maxTurns: config.maxTurns ?? 25,
361
371
  contextBudgetTokens: config.contextBudgetTokens ?? 100000,
@@ -1033,9 +1043,16 @@ async function handleAbilitiesGet(res: ServerResponse, agentName: string): Promi
1033
1043
  const installed = listInstalledAbilities(agentName)
1034
1044
  const abilities = await Promise.all(
1035
1045
  installed.map(async (a) => {
1046
+ // a.dependencies is only ever undefined for a record from before
1047
+ // that field existed — backfillDependencies re-derives and
1048
+ // persists it once rather than this route silently treating
1049
+ // "never recorded" the same as "confirmed zero", which would
1050
+ // otherwise permanently hide "Install deps" for an ability that
1051
+ // genuinely still needs something.
1052
+ const dependencies = a.dependencies !== undefined ? a.dependencies : ((await backfillDependencies(agentName, a.name)) ?? [])
1036
1053
  const latestVersion = await fetchLatestAbilityVersion(a.name)
1037
- const missingDependencies = (a.dependencies ?? []).filter((dep) => !hasNodeModule(dep))
1038
- return { ...a, latestVersion, upToDate: latestVersion !== null && latestVersion === a.version, missingDependencies }
1054
+ const missingDependencies = dependencies.filter((dep) => !hasNodeModule(dep))
1055
+ return { ...a, dependencies, latestVersion, upToDate: latestVersion !== null && latestVersion === a.version, missingDependencies }
1039
1056
  }),
1040
1057
  )
1041
1058
  res.writeHead(200, { 'content-type': 'application/json' }).end(JSON.stringify({ abilities }))