hoomanjs 1.45.3 → 1.46.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.
Files changed (117) hide show
  1. package/dist/acp/acp-agent.js +15 -15
  2. package/dist/acp/acp-agent.js.map +1 -1
  3. package/dist/acp/prompt-invoke.d.ts +2 -1
  4. package/dist/acp/prompt-invoke.js +20 -95
  5. package/dist/acp/prompt-invoke.js.map +1 -1
  6. package/dist/chat/app.js +19 -19
  7. package/dist/chat/app.js.map +1 -1
  8. package/dist/chat/components/BottomChrome.d.ts +1 -1
  9. package/dist/chat/components/DownloadPanel.d.ts +1 -1
  10. package/dist/chat/components/DownloadPanel.js +1 -1
  11. package/dist/chat/components/DownloadPanel.js.map +1 -1
  12. package/dist/chat/components/StatusBar.js +1 -1
  13. package/dist/chat/components/StatusBar.js.map +1 -1
  14. package/dist/cli.js +5 -2
  15. package/dist/cli.js.map +1 -1
  16. package/dist/configure/app.js +292 -0
  17. package/dist/configure/app.js.map +1 -1
  18. package/dist/core/agent/gitignore-guard-plugin.d.ts +2 -0
  19. package/dist/core/agent/gitignore-guard-plugin.js +79 -0
  20. package/dist/core/agent/gitignore-guard-plugin.js.map +1 -0
  21. package/dist/core/agent/index.js +3 -0
  22. package/dist/core/agent/index.js.map +1 -1
  23. package/dist/core/config.d.ts +39 -6
  24. package/dist/core/config.js +5 -2
  25. package/dist/core/config.js.map +1 -1
  26. package/dist/core/index.js +19 -1
  27. package/dist/core/index.js.map +1 -1
  28. package/dist/core/models/anthropic.js +10 -4
  29. package/dist/core/models/anthropic.js.map +1 -1
  30. package/dist/core/models/azure.js +2 -1
  31. package/dist/core/models/azure.js.map +1 -1
  32. package/dist/core/models/bedrock.js +1 -0
  33. package/dist/core/models/bedrock.js.map +1 -1
  34. package/dist/core/models/google.js +1 -0
  35. package/dist/core/models/google.js.map +1 -1
  36. package/dist/core/models/groq.js +2 -1
  37. package/dist/core/models/groq.js.map +1 -1
  38. package/dist/core/models/llama-cpp/index.js +1 -0
  39. package/dist/core/models/llama-cpp/index.js.map +1 -1
  40. package/dist/core/models/llama-cpp/resolve-model.js +1 -1
  41. package/dist/core/models/llama-cpp/resolve-model.js.map +1 -1
  42. package/dist/core/models/minimax.js +2 -1
  43. package/dist/core/models/minimax.js.map +1 -1
  44. package/dist/core/models/mlx/index.js +2 -1
  45. package/dist/core/models/mlx/index.js.map +1 -1
  46. package/dist/core/models/mlx/resolve-model.js +1 -1
  47. package/dist/core/models/mlx/resolve-model.js.map +1 -1
  48. package/dist/core/models/mlx/strands-mlx.js +1 -1
  49. package/dist/core/models/mlx/strands-mlx.js.map +1 -1
  50. package/dist/core/models/moonshot.js +2 -1
  51. package/dist/core/models/moonshot.js.map +1 -1
  52. package/dist/core/models/ollama/index.js +7 -3
  53. package/dist/core/models/ollama/index.js.map +1 -1
  54. package/dist/core/models/openai.js +2 -1
  55. package/dist/core/models/openai.js.map +1 -1
  56. package/dist/core/models/openrouter.js +2 -1
  57. package/dist/core/models/openrouter.js.map +1 -1
  58. package/dist/core/models/types.d.ts +43 -11
  59. package/dist/core/models/types.js +15 -4
  60. package/dist/core/models/types.js.map +1 -1
  61. package/dist/core/models/xai.js +2 -1
  62. package/dist/core/models/xai.js.map +1 -1
  63. package/dist/core/prompts/modes/agent.md +1 -1
  64. package/dist/core/prompts/modes/plan.md +11 -7
  65. package/dist/core/prompts/static/browser.md +9 -0
  66. package/dist/core/prompts/system.js +3 -0
  67. package/dist/core/prompts/system.js.map +1 -1
  68. package/dist/core/ripgrep/bootstrap.js +5 -19
  69. package/dist/core/ripgrep/bootstrap.js.map +1 -1
  70. package/dist/core/skills/built-in/hooman-config/SKILL.md +22 -5
  71. package/dist/core/skills/built-in/hooman-config/providers.md +14 -12
  72. package/dist/core/skills/plugin.js +5 -1
  73. package/dist/core/skills/plugin.js.map +1 -1
  74. package/dist/core/tools/filesystem.js +9 -0
  75. package/dist/core/tools/filesystem.js.map +1 -1
  76. package/dist/core/tools/shell.js +3 -14
  77. package/dist/core/tools/shell.js.map +1 -1
  78. package/dist/core/utils/attachments.d.ts +4 -2
  79. package/dist/core/utils/attachments.js +10 -32
  80. package/dist/core/utils/attachments.js.map +1 -1
  81. package/dist/core/utils/command-path.d.ts +1 -0
  82. package/dist/core/utils/command-path.js +17 -0
  83. package/dist/core/utils/command-path.js.map +1 -0
  84. package/dist/core/utils/download-progress.js.map +1 -0
  85. package/dist/core/utils/gitignore.d.ts +11 -0
  86. package/dist/core/utils/gitignore.js +141 -0
  87. package/dist/core/utils/gitignore.js.map +1 -0
  88. package/dist/core/utils/hub-download.js.map +1 -0
  89. package/dist/core/utils/metadata.d.ts +65 -0
  90. package/dist/core/utils/{billing.js → metadata.js} +56 -73
  91. package/dist/core/utils/metadata.js.map +1 -0
  92. package/dist/core/utils/model-metadata.d.ts +39 -0
  93. package/dist/core/utils/model-metadata.js +222 -0
  94. package/dist/core/utils/model-metadata.js.map +1 -0
  95. package/dist/core/utils/paths.d.ts +1 -0
  96. package/dist/core/utils/paths.js +2 -0
  97. package/dist/core/utils/paths.js.map +1 -1
  98. package/dist/core/utils/reasoning-effort.d.ts +9 -1
  99. package/dist/core/{models → utils}/usage.js +1 -1
  100. package/dist/core/utils/usage.js.map +1 -0
  101. package/dist/daemon/index.d.ts +2 -0
  102. package/dist/daemon/index.js +6 -3
  103. package/dist/daemon/index.js.map +1 -1
  104. package/dist/index.d.ts +3 -3
  105. package/dist/index.js +2 -2
  106. package/dist/index.js.map +1 -1
  107. package/package.json +2 -1
  108. package/dist/core/models/download-progress.js.map +0 -1
  109. package/dist/core/models/hub-download.js.map +0 -1
  110. package/dist/core/models/usage.js.map +0 -1
  111. package/dist/core/utils/billing.d.ts +0 -76
  112. package/dist/core/utils/billing.js.map +0 -1
  113. /package/dist/core/{models → utils}/download-progress.d.ts +0 -0
  114. /package/dist/core/{models → utils}/download-progress.js +0 -0
  115. /package/dist/core/{models → utils}/hub-download.d.ts +0 -0
  116. /package/dist/core/{models → utils}/hub-download.js +0 -0
  117. /package/dist/core/{models → utils}/usage.d.ts +0 -0
@@ -617,6 +617,13 @@ const LLM_FIELD_DEFINITIONS = [
617
617
  placeholder: "0.7",
618
618
  note: "Leave blank to clear.",
619
619
  },
620
+ {
621
+ key: "topP",
622
+ label: "Top P",
623
+ kind: "optionalNumber",
624
+ placeholder: "0.95",
625
+ note: "Leave blank to clear.",
626
+ },
620
627
  {
621
628
  key: "maxTokens",
622
629
  label: "Max tokens",
@@ -632,6 +639,69 @@ const LLM_FIELD_DEFINITIONS = [
632
639
  note: "Context size in tokens; only honored by the local llama-cpp and mlx providers (overrides their provider-level `context`). Leave blank to clear.",
633
640
  },
634
641
  ];
642
+ const LLM_METADATA_FIELD_DEFINITIONS = [
643
+ {
644
+ key: "metadataName",
645
+ label: "Metadata model name",
646
+ kind: "string",
647
+ placeholder: "openai/gpt-5-mini",
648
+ note: "Optional override for models.dev lookup; leave blank to remove metadata.",
649
+ },
650
+ {
651
+ key: "metadataContext",
652
+ label: "Metadata context size",
653
+ kind: "optionalInteger",
654
+ placeholder: "200000",
655
+ },
656
+ {
657
+ key: "metadataCostInput",
658
+ label: "Metadata input cost / 1M",
659
+ kind: "optionalNumber",
660
+ placeholder: "0.25",
661
+ },
662
+ {
663
+ key: "metadataCostCache",
664
+ label: "Metadata cache cost / 1M",
665
+ kind: "optionalNumber",
666
+ placeholder: "0.025",
667
+ },
668
+ {
669
+ key: "metadataCostOutput",
670
+ label: "Metadata output cost / 1M",
671
+ kind: "optionalNumber",
672
+ placeholder: "2",
673
+ },
674
+ {
675
+ key: "metadataModalityText",
676
+ label: "Metadata modality: text",
677
+ kind: "optionalBoolean",
678
+ placeholder: "true",
679
+ },
680
+ {
681
+ key: "metadataModalityImage",
682
+ label: "Metadata modality: image",
683
+ kind: "optionalBoolean",
684
+ placeholder: "false",
685
+ },
686
+ {
687
+ key: "metadataModalityPdf",
688
+ label: "Metadata modality: pdf",
689
+ kind: "optionalBoolean",
690
+ placeholder: "false",
691
+ },
692
+ {
693
+ key: "metadataModalityAudio",
694
+ label: "Metadata modality: audio",
695
+ kind: "optionalBoolean",
696
+ placeholder: "false",
697
+ },
698
+ {
699
+ key: "metadataModalityVideo",
700
+ label: "Metadata modality: video",
701
+ kind: "optionalBoolean",
702
+ placeholder: "false",
703
+ },
704
+ ];
635
705
  function formatTypedFieldValue(definition, value) {
636
706
  if (value === undefined) {
637
707
  return "not set";
@@ -647,6 +717,52 @@ function formatTypedFieldValue(definition, value) {
647
717
  }
648
718
  return truncate(String(value), 44);
649
719
  }
720
+ function buildLlmMetadataFromFields(fields) {
721
+ const name = normalizeOptional(fields.metadataName ?? "");
722
+ const context = parseTypedFieldValue(fields.metadataContext ?? "", LLM_METADATA_FIELD_DEFINITIONS[1]);
723
+ const inputCost = parseTypedFieldValue(fields.metadataCostInput ?? "", LLM_METADATA_FIELD_DEFINITIONS[2]);
724
+ const cacheCost = parseTypedFieldValue(fields.metadataCostCache ?? "", LLM_METADATA_FIELD_DEFINITIONS[3]);
725
+ const outputCost = parseTypedFieldValue(fields.metadataCostOutput ?? "", LLM_METADATA_FIELD_DEFINITIONS[4]);
726
+ const text = parseTypedFieldValue(fields.metadataModalityText ?? "", LLM_METADATA_FIELD_DEFINITIONS[5]);
727
+ const image = parseTypedFieldValue(fields.metadataModalityImage ?? "", LLM_METADATA_FIELD_DEFINITIONS[6]);
728
+ const pdf = parseTypedFieldValue(fields.metadataModalityPdf ?? "", LLM_METADATA_FIELD_DEFINITIONS[7]);
729
+ const audio = parseTypedFieldValue(fields.metadataModalityAudio ?? "", LLM_METADATA_FIELD_DEFINITIONS[8]);
730
+ const video = parseTypedFieldValue(fields.metadataModalityVideo ?? "", LLM_METADATA_FIELD_DEFINITIONS[9]);
731
+ if ((inputCost !== undefined ||
732
+ cacheCost !== undefined ||
733
+ outputCost !== undefined) &&
734
+ (inputCost === undefined || outputCost === undefined)) {
735
+ throw new Error('Metadata costs require both "Metadata input cost / 1M" and "Metadata output cost / 1M".');
736
+ }
737
+ if (!name) {
738
+ return undefined;
739
+ }
740
+ const metadata = { name };
741
+ if (context !== undefined) {
742
+ metadata.context = context;
743
+ }
744
+ if (inputCost !== undefined && outputCost !== undefined) {
745
+ metadata.costs = {
746
+ "input/m": inputCost,
747
+ ...(cacheCost !== undefined ? { "cache/m": cacheCost } : {}),
748
+ "output/m": outputCost,
749
+ };
750
+ }
751
+ if (text !== undefined ||
752
+ image !== undefined ||
753
+ pdf !== undefined ||
754
+ audio !== undefined ||
755
+ video !== undefined) {
756
+ metadata.modality = {
757
+ ...(text !== undefined ? { text } : {}),
758
+ ...(image !== undefined ? { image } : {}),
759
+ ...(pdf !== undefined ? { pdf } : {}),
760
+ ...(audio !== undefined ? { audio } : {}),
761
+ ...(video !== undefined ? { video } : {}),
762
+ };
763
+ }
764
+ return metadata;
765
+ }
650
766
  function parseTypedFieldValue(input, definition) {
651
767
  switch (definition.kind) {
652
768
  case "string":
@@ -1471,6 +1587,21 @@ export function ConfigureApp({ config, mcpConfig, mcpManager, skills, onExit, })
1471
1587
  }
1472
1588
  },
1473
1589
  },
1590
+ {
1591
+ label: `Browser tool • ${yesNo(configData.tools.browser.enabled)}`,
1592
+ value: () => {
1593
+ if (updateConfig({
1594
+ tools: {
1595
+ ...config.tools,
1596
+ browser: {
1597
+ enabled: !configData.tools.browser.enabled,
1598
+ },
1599
+ },
1600
+ }, `Browser tool ${configData.tools.browser.enabled ? "disabled" : "enabled"}.`)) {
1601
+ setScreen({ kind: "config-tools" });
1602
+ }
1603
+ },
1604
+ },
1474
1605
  {
1475
1606
  label: `Subagents • ${yesNo(configData.tools.subagents.enabled)}`,
1476
1607
  value: () => {
@@ -2077,8 +2208,19 @@ export function ConfigureApp({ config, mcpConfig, mcpManager, skills, onExit, })
2077
2208
  provider: providerName,
2078
2209
  model: defaultModelForProviderType(providerType),
2079
2210
  temperature: "",
2211
+ topP: "",
2080
2212
  maxTokens: "",
2081
2213
  context: "",
2214
+ metadataName: "",
2215
+ metadataContext: "",
2216
+ metadataCostInput: "",
2217
+ metadataCostCache: "",
2218
+ metadataCostOutput: "",
2219
+ metadataModalityText: "",
2220
+ metadataModalityImage: "",
2221
+ metadataModalityPdf: "",
2222
+ metadataModalityAudio: "",
2223
+ metadataModalityVideo: "",
2082
2224
  });
2083
2225
  setScreen({ kind: "config-llm-create" });
2084
2226
  },
@@ -2122,6 +2264,16 @@ export function ConfigureApp({ config, mcpConfig, mcpManager, skills, onExit, })
2122
2264
  }, llmDraft[definition.key])}`,
2123
2265
  value: () => editLlmDraftField(definition.label, definition.key, llmDraft[definition.key] ?? "", definition.note),
2124
2266
  })),
2267
+ ...LLM_METADATA_FIELD_DEFINITIONS.map((definition) => ({
2268
+ key: `llm-create-metadata:${definition.key}`,
2269
+ label: `${definition.label} • ${formatDraftFieldValue({
2270
+ key: definition.key,
2271
+ label: definition.label,
2272
+ placeholder: definition.placeholder,
2273
+ note: definition.note,
2274
+ }, llmDraft[definition.key])}`,
2275
+ value: () => editLlmDraftField(definition.label, definition.key, llmDraft[definition.key] ?? "", definition.note),
2276
+ })),
2125
2277
  {
2126
2278
  label: "Save",
2127
2279
  value: () => {
@@ -2148,11 +2300,13 @@ export function ConfigureApp({ config, mcpConfig, mcpManager, skills, onExit, })
2148
2300
  for (const definition of LLM_FIELD_DEFINITIONS) {
2149
2301
  options[definition.key] = parseTypedFieldValue(llmDraft[definition.key] ?? "", definition);
2150
2302
  }
2303
+ const metadata = buildLlmMetadataFromFields(llmDraft);
2151
2304
  if (updateConfig({
2152
2305
  llms: addLlmEntry({
2153
2306
  name,
2154
2307
  provider: providerName,
2155
2308
  options: options,
2309
+ ...(metadata ? { metadata } : {}),
2156
2310
  default: false,
2157
2311
  }),
2158
2312
  }, `Added LLM "${name}".`)) {
@@ -2183,6 +2337,9 @@ export function ConfigureApp({ config, mcpConfig, mcpManager, skills, onExit, })
2183
2337
  const isOnly = config.llms.length === 1;
2184
2338
  const isDefault = entry.default;
2185
2339
  const llmOptions = entry.options;
2340
+ const llmMetadata = (entry.metadata ?? {});
2341
+ const llmMetadataCosts = (llmMetadata.costs ?? {});
2342
+ const llmMetadataModality = (llmMetadata.modality ?? {});
2186
2343
  const items = [
2187
2344
  {
2188
2345
  label: `Name • ${entry.name}`,
@@ -2259,6 +2416,141 @@ export function ConfigureApp({ config, mcpConfig, mcpManager, skills, onExit, })
2259
2416
  },
2260
2417
  }),
2261
2418
  })),
2419
+ ...LLM_METADATA_FIELD_DEFINITIONS.map((definition) => ({
2420
+ key: `llm-metadata-field:${entry.name}:${definition.key}`,
2421
+ label: `${definition.label} • ${formatDraftFieldValue(definition, (() => {
2422
+ switch (definition.key) {
2423
+ case "metadataName":
2424
+ return typeof llmMetadata.name === "string"
2425
+ ? llmMetadata.name
2426
+ : undefined;
2427
+ case "metadataContext":
2428
+ return llmMetadata.context !== undefined
2429
+ ? String(llmMetadata.context)
2430
+ : undefined;
2431
+ case "metadataCostInput":
2432
+ return llmMetadataCosts["input/m"] !== undefined
2433
+ ? String(llmMetadataCosts["input/m"])
2434
+ : undefined;
2435
+ case "metadataCostCache":
2436
+ return llmMetadataCosts["cache/m"] !== undefined
2437
+ ? String(llmMetadataCosts["cache/m"])
2438
+ : undefined;
2439
+ case "metadataCostOutput":
2440
+ return llmMetadataCosts["output/m"] !== undefined
2441
+ ? String(llmMetadataCosts["output/m"])
2442
+ : undefined;
2443
+ case "metadataModalityText":
2444
+ return llmMetadataModality.text !== undefined
2445
+ ? String(llmMetadataModality.text)
2446
+ : undefined;
2447
+ case "metadataModalityImage":
2448
+ return llmMetadataModality.image !== undefined
2449
+ ? String(llmMetadataModality.image)
2450
+ : undefined;
2451
+ case "metadataModalityPdf":
2452
+ return llmMetadataModality.pdf !== undefined
2453
+ ? String(llmMetadataModality.pdf)
2454
+ : undefined;
2455
+ case "metadataModalityAudio":
2456
+ return llmMetadataModality.audio !== undefined
2457
+ ? String(llmMetadataModality.audio)
2458
+ : undefined;
2459
+ case "metadataModalityVideo":
2460
+ return llmMetadataModality.video !== undefined
2461
+ ? String(llmMetadataModality.video)
2462
+ : undefined;
2463
+ default:
2464
+ return undefined;
2465
+ }
2466
+ })())}`,
2467
+ value: () => promptValue({
2468
+ title: `Update ${definition.label}`,
2469
+ label: definition.label,
2470
+ initialValue: definition.key === "metadataName"
2471
+ ? typeof llmMetadata.name === "string"
2472
+ ? llmMetadata.name
2473
+ : ""
2474
+ : definition.key === "metadataContext"
2475
+ ? llmMetadata.context !== undefined
2476
+ ? String(llmMetadata.context)
2477
+ : ""
2478
+ : definition.key === "metadataCostInput"
2479
+ ? llmMetadataCosts["input/m"] !== undefined
2480
+ ? String(llmMetadataCosts["input/m"])
2481
+ : ""
2482
+ : definition.key === "metadataCostCache"
2483
+ ? llmMetadataCosts["cache/m"] !== undefined
2484
+ ? String(llmMetadataCosts["cache/m"])
2485
+ : ""
2486
+ : definition.key === "metadataCostOutput"
2487
+ ? llmMetadataCosts["output/m"] !== undefined
2488
+ ? String(llmMetadataCosts["output/m"])
2489
+ : ""
2490
+ : definition.key === "metadataModalityText"
2491
+ ? llmMetadataModality.text !== undefined
2492
+ ? String(llmMetadataModality.text)
2493
+ : ""
2494
+ : definition.key === "metadataModalityImage"
2495
+ ? llmMetadataModality.image !== undefined
2496
+ ? String(llmMetadataModality.image)
2497
+ : ""
2498
+ : definition.key === "metadataModalityPdf"
2499
+ ? llmMetadataModality.pdf !== undefined
2500
+ ? String(llmMetadataModality.pdf)
2501
+ : ""
2502
+ : definition.key === "metadataModalityAudio"
2503
+ ? llmMetadataModality.audio !== undefined
2504
+ ? String(llmMetadataModality.audio)
2505
+ : ""
2506
+ : llmMetadataModality.video !== undefined
2507
+ ? String(llmMetadataModality.video)
2508
+ : "",
2509
+ placeholder: definition.placeholder,
2510
+ note: definition.note,
2511
+ onSubmit: async (value) => {
2512
+ const draftFields = {
2513
+ metadataName: typeof llmMetadata.name === "string"
2514
+ ? llmMetadata.name
2515
+ : "",
2516
+ metadataContext: llmMetadata.context !== undefined
2517
+ ? String(llmMetadata.context)
2518
+ : "",
2519
+ metadataCostInput: llmMetadataCosts["input/m"] !== undefined
2520
+ ? String(llmMetadataCosts["input/m"])
2521
+ : "",
2522
+ metadataCostCache: llmMetadataCosts["cache/m"] !== undefined
2523
+ ? String(llmMetadataCosts["cache/m"])
2524
+ : "",
2525
+ metadataCostOutput: llmMetadataCosts["output/m"] !== undefined
2526
+ ? String(llmMetadataCosts["output/m"])
2527
+ : "",
2528
+ metadataModalityText: llmMetadataModality.text !== undefined
2529
+ ? String(llmMetadataModality.text)
2530
+ : "",
2531
+ metadataModalityImage: llmMetadataModality.image !== undefined
2532
+ ? String(llmMetadataModality.image)
2533
+ : "",
2534
+ metadataModalityPdf: llmMetadataModality.pdf !== undefined
2535
+ ? String(llmMetadataModality.pdf)
2536
+ : "",
2537
+ metadataModalityAudio: llmMetadataModality.audio !== undefined
2538
+ ? String(llmMetadataModality.audio)
2539
+ : "",
2540
+ metadataModalityVideo: llmMetadataModality.video !== undefined
2541
+ ? String(llmMetadataModality.video)
2542
+ : "",
2543
+ [definition.key]: value,
2544
+ };
2545
+ const metadata = buildLlmMetadataFromFields(draftFields);
2546
+ if (updateConfig({
2547
+ llms: config.llms.map((llm) => llm.name === entry.name ? { ...llm, metadata } : llm),
2548
+ }, `Updated ${definition.label.toLowerCase()} for "${entry.name}".`)) {
2549
+ setPrompt(null);
2550
+ }
2551
+ },
2552
+ }),
2553
+ })),
2262
2554
  {
2263
2555
  label: isDefault ? "Default • yes" : "Set as default",
2264
2556
  value: () => {