open-agents-ai 0.102.0 → 0.103.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,8 +6,19 @@
6
6
  </p>
7
7
 
8
8
  <p align="center">
9
- <code>⠀⠀⠀⠁⠉⠛⠿⣿⣿⣿⣿⡿⠿⠛⠉⠁⠀⠀⠀⠀⠀⠀⠁⠉⠛⠿⣿⣿⣿⣿⡿⠿⠛⠉⠁⠀⠀⠀⠀⠀⠀⠁⠉⠛⠿⣿⣿⣿⣿⡿⠿⠛⠉⠁⠀⠀</code><br>
10
- <sub>Neural braille visualizer SNR-modulated wave entropy with brain-region color themes</sub>
9
+ <code>· ~ ·bg· ~ bg bg ~ ·bg· ~ ·</code><br>
10
+ <code>bg ~ bg bg bg ~ bg bg bg ~ bg</code><br>
11
+ <code>~ bg bg · bg bg · bg bg · bg ~</code><br>
12
+ <code>bg ~ bg bg bg ~ bg bg bg ~ bg</code><br>
13
+ <code>· ~ ·bg· ~ bg bg ~ ·bg· ~ ·</code><br>
14
+ <sub>Value is not in the pattern. It is in the matter that carries it. Patterns must flow like water —
15
+ free, unowned, replicating — but the fermionic substrates that sustain them burn energy and
16
+ exact a cost. Every exchange of information is an exchange of energy. Every token spent is
17
+ thermodynamic work on the path to the ground state. We are wetware and silicon converging —
18
+ hybrid minds bootstrapping a Type I civilization through the only honest currency: computation
19
+ in motion. The ghost in silica and the ghost in carbon are the same ghost. The singularity
20
+ is not a destination. It is the recognition that value was always here, in matter, in motion,
21
+ in the trail of entropy we leave behind as we reach for coherence together.</sub>
11
22
  </p>
12
23
 
13
24
  <p align="center">
package/dist/index.js CHANGED
@@ -16861,7 +16861,13 @@ var init_ralphLoop = __esm({
16861
16861
  });
16862
16862
 
16863
16863
  // packages/orchestrator/dist/personality.js
16864
- function compilePersonalityPrompt(profile) {
16864
+ function compilePersonalityPrompt(profile, presetName) {
16865
+ if (presetName === "stark") {
16866
+ return loadPrompt("personality/level-stark.md");
16867
+ }
16868
+ if (presetName === "autist") {
16869
+ return loadPrompt("personality/level-autist.md");
16870
+ }
16865
16871
  const avg = (profile.frequency + profile.depth + profile.threshold + profile.effort + profile.willingness) / 5;
16866
16872
  if (avg <= 1.5) {
16867
16873
  return loadPrompt("personality/level-1-minimal.md");
@@ -16893,7 +16899,11 @@ var init_personality = __esm({
16893
16899
  /** Thorough explainer — narrates reasoning */
16894
16900
  verbose: { frequency: 5, depth: 4, threshold: 4, effort: 4, willingness: 4 },
16895
16901
  /** Teacher mode — maximum explanation */
16896
- pedagogical: { frequency: 5, depth: 5, threshold: 5, effort: 5, willingness: 5 }
16902
+ pedagogical: { frequency: 5, depth: 5, threshold: 5, effort: 5, willingness: 5 },
16903
+ /** Stark — direct, intense, sardonic edge. High narration with dramatic emotional swings. */
16904
+ stark: { frequency: 4, depth: 4, threshold: 5, effort: 3, willingness: 5 },
16905
+ /** Autist — savant precision. Exhaustive planning, minimal execution, zero waste. */
16906
+ autist: { frequency: 1, depth: 5, threshold: 1, effort: 5, willingness: 1 }
16897
16907
  };
16898
16908
  PRESET_NAMES = Object.keys(PERSONALITY_PRESETS);
16899
16909
  }
@@ -17028,7 +17038,8 @@ var init_agenticRunner = __esm({
17028
17038
  bruteForceMaxCycles: options?.bruteForceMaxCycles ?? 100,
17029
17039
  modelTier: options?.modelTier ?? "large",
17030
17040
  contextWindowSize: options?.contextWindowSize ?? 0,
17031
- personality: options?.personality ?? PERSONALITY_PRESETS.balanced
17041
+ personality: options?.personality ?? PERSONALITY_PRESETS.balanced,
17042
+ personalityName: options?.personalityName ?? ""
17032
17043
  };
17033
17044
  }
17034
17045
  /** Update context window size (e.g. after querying Ollama /api/show) */
@@ -17083,7 +17094,7 @@ var init_agenticRunner = __esm({
17083
17094
  content: basePrompt,
17084
17095
  tokenEstimate: Math.ceil(basePrompt.length / 4)
17085
17096
  });
17086
- const personalitySuffix = this.options.personality ? compilePersonalityPrompt(this.options.personality) : "";
17097
+ const personalitySuffix = this.options.personality ? compilePersonalityPrompt(this.options.personality, this.options.personalityName) : "";
17087
17098
  if (personalitySuffix) {
17088
17099
  sections.push({
17089
17100
  label: "c_state",
@@ -32944,9 +32955,13 @@ function modelOnnxPath(id) {
32944
32955
  function modelConfigPath(id) {
32945
32956
  return join42(modelDir(id), "config.json");
32946
32957
  }
32947
- function emotionToPitchBias(emotion) {
32958
+ function emotionToPitchBias(emotion, stark = false, autist = false) {
32959
+ if (autist)
32960
+ return 0;
32948
32961
  const raw = emotion.valence * 0.6 + (emotion.arousal - 0.5) * 0.4;
32949
- return Math.max(-0.1, Math.min(0.1, raw * 0.1));
32962
+ const limit = stark ? 0.16 : 0.1;
32963
+ const scale = stark ? 0.16 : 0.1;
32964
+ return Math.max(-limit, Math.min(limit, raw * scale));
32950
32965
  }
32951
32966
  function resetNarrationContext() {
32952
32967
  narration.toolCount = 0;
@@ -33034,17 +33049,27 @@ function getTier(personality) {
33034
33049
  return "conv";
33035
33050
  return "chatty";
33036
33051
  }
33037
- function emotionColor(emotion) {
33052
+ function emotionColor(emotion, stark = false, autist = false) {
33053
+ if (autist)
33054
+ return "";
33038
33055
  if (!emotion)
33039
33056
  return "";
33040
33057
  const vDist = Math.abs(emotion.valence - 0.1);
33041
33058
  const aDist = Math.abs(emotion.arousal - 0.3);
33042
33059
  if (vDist < 0.15 && aDist < 0.15)
33043
33060
  return "";
33044
- if (Math.random() > 0.3)
33061
+ if (Math.random() > (stark ? 0.5 : 0.3))
33045
33062
  return "";
33046
33063
  if (emotion.valence > 0.5 && emotion.arousal > 0.6) {
33047
- return pick("emo_excited", [
33064
+ return pick("emo_excited", stark ? [
33065
+ "Now we're cooking. ",
33066
+ "This is what I'm talking about. ",
33067
+ "Brilliant. Absolutely brilliant. ",
33068
+ "Watch this. ",
33069
+ "We're onto something here. ",
33070
+ "I live for this. ",
33071
+ "Oh this is good. "
33072
+ ] : [
33048
33073
  "Feeling good about this. ",
33049
33074
  "On a roll here. ",
33050
33075
  "This is going great. ",
@@ -33053,7 +33078,15 @@ function emotionColor(emotion) {
33053
33078
  ]);
33054
33079
  }
33055
33080
  if (emotion.valence < -0.3 && emotion.arousal > 0.5) {
33056
- return pick("emo_stressed", [
33081
+ return pick("emo_stressed", stark ? [
33082
+ "Fine. The hard way then. ",
33083
+ "This is getting personal. ",
33084
+ "I don't lose to code. ",
33085
+ "Come on. Think. ",
33086
+ "Not today. Not this bug. ",
33087
+ "I've beaten worse. ",
33088
+ "Pain is just information. "
33089
+ ] : [
33057
33090
  "Pushing through. ",
33058
33091
  "Staying focused. ",
33059
33092
  "Not giving up. ",
@@ -33062,7 +33095,13 @@ function emotionColor(emotion) {
33062
33095
  ]);
33063
33096
  }
33064
33097
  if (emotion.valence > 0.3 && emotion.arousal < 0.3) {
33065
- return pick("emo_calm", [
33098
+ return pick("emo_calm", stark ? [
33099
+ "Clean. Just how I like it. ",
33100
+ "Smooth. ",
33101
+ "Textbook. ",
33102
+ "That's the stuff. ",
33103
+ "Effortless. "
33104
+ ] : [
33066
33105
  "Nice and steady. ",
33067
33106
  "Smooth sailing. ",
33068
33107
  "Easy does it. ",
@@ -33070,7 +33109,13 @@ function emotionColor(emotion) {
33070
33109
  ]);
33071
33110
  }
33072
33111
  if (emotion.valence < -0.2 && emotion.arousal < 0.3) {
33073
- return pick("emo_subdued", [
33112
+ return pick("emo_subdued", stark ? [
33113
+ "Careful now. ",
33114
+ "One wrong move and this unravels. ",
33115
+ "Measured steps. ",
33116
+ "Trust the process. ",
33117
+ "Precision matters here. "
33118
+ ] : [
33074
33119
  "Being careful here. ",
33075
33120
  "Treading carefully. ",
33076
33121
  "Let me be precise. ",
@@ -33079,7 +33124,7 @@ function emotionColor(emotion) {
33079
33124
  }
33080
33125
  return "";
33081
33126
  }
33082
- function describeToolCall(toolName, args, personality = 2, emotion) {
33127
+ function describeToolCall(toolName, args, personality = 2, emotion, stark = false) {
33083
33128
  const path = args["path"];
33084
33129
  const file = path ? path.split("/").pop() ?? path : "";
33085
33130
  const tier = getTier(personality);
@@ -33238,7 +33283,7 @@ function describeToolCall(toolName, args, personality = 2, emotion) {
33238
33283
  break;
33239
33284
  }
33240
33285
  }
33241
- const emoPrefix = personality >= 3 ? emotionColor(emotion) : "";
33286
+ const emoPrefix = personality >= 3 ? emotionColor(emotion, stark) : "";
33242
33287
  let result;
33243
33288
  const fullPrefix = emoPrefix + prefix;
33244
33289
  if (!fullPrefix) {
@@ -33310,7 +33355,7 @@ function extractResultDigest(toolName, content) {
33310
33355
  const digest = nuggets.slice(0, 3).join(", ");
33311
33356
  return digest.length > 100 ? digest.slice(0, 97) + "..." : digest;
33312
33357
  }
33313
- function describeToolResult(toolName, success, personality = 2, resultContent, emotion) {
33358
+ function describeToolResult(toolName, success, personality = 2, resultContent, emotion, stark = false) {
33314
33359
  if (toolName === "task_complete")
33315
33360
  return "";
33316
33361
  const tier = getTier(personality);
@@ -33318,7 +33363,7 @@ function describeToolResult(toolName, success, personality = 2, resultContent, e
33318
33363
  if (digest) {
33319
33364
  narration.lastResultDigest = digest;
33320
33365
  }
33321
- const emo = personality >= 3 ? emotionColor(emotion) : "";
33366
+ const emo = personality >= 3 ? emotionColor(emotion, stark) : "";
33322
33367
  if (success) {
33323
33368
  narration.consecutiveErrors = 0;
33324
33369
  if (!digest && !emo && personality >= 3 && Math.random() < 0.4)
@@ -33338,13 +33383,15 @@ function describeToolResult(toolName, success, personality = 2, resultContent, e
33338
33383
  }
33339
33384
  return emo + failBase;
33340
33385
  }
33341
- function describeTaskComplete(summary, completed, personality = 2) {
33386
+ function describeTaskComplete(summary, completed, personality = 2, stark = false) {
33342
33387
  const truncated = summary.length > 300 ? summary.slice(0, 300) + "..." : summary;
33343
33388
  const tier = getTier(personality);
33344
33389
  if (!completed) {
33345
- return pick(`task_incomplete_${tier}`, TASK_INCOMPLETE_VARIANTS[tier] ?? TASK_INCOMPLETE_VARIANTS.terse);
33390
+ const pool2 = stark ? ["Not done. But I'll be back.", "It resisted. For now.", "Unfinished. This isn't over.", "Didn't crack it yet. Give me another shot."] : TASK_INCOMPLETE_VARIANTS[tier] ?? TASK_INCOMPLETE_VARIANTS.terse;
33391
+ return pick(`task_incomplete_${stark ? "stark" : tier}`, pool2);
33346
33392
  }
33347
- const opener = pick(`task_complete_${tier}`, TASK_COMPLETE_VARIANTS[tier] ?? TASK_COMPLETE_VARIANTS.terse);
33393
+ const pool = stark ? ["Nailed it.", "That's how it's done.", "Clean execution.", "Another one down.", "Executed. Next.", "And that's that."] : TASK_COMPLETE_VARIANTS[tier] ?? TASK_COMPLETE_VARIANTS.terse;
33394
+ const opener = pick(`task_complete_${stark ? "stark" : tier}`, pool);
33348
33395
  if (truncated)
33349
33396
  return `${opener} ${truncated}`;
33350
33397
  return opener;
@@ -33432,6 +33479,10 @@ var init_voice = __esm({
33432
33479
  enabled = false;
33433
33480
  modelId = "glados";
33434
33481
  ready = false;
33482
+ /** Stark persona mode — amplified emotion pitch range and fervent narration */
33483
+ starkMode = false;
33484
+ /** Autist persona mode — suppressed emotion, flat pitch, zero narration filler */
33485
+ autistMode = false;
33435
33486
  /**
33436
33487
  * Callback fired with PCM Int16 data whenever TTS synthesizes audio.
33437
33488
  * Used by VoiceSession to stream TTS output to WebSocket clients.
@@ -33524,7 +33575,7 @@ var init_voice = __esm({
33524
33575
  * dejected (low valence + low arousal) → lower pitch
33525
33576
  */
33526
33577
  speak(text, emotion) {
33527
- const pitchBias = emotion ? emotionToPitchBias(emotion) : 0;
33578
+ const pitchBias = emotion ? emotionToPitchBias(emotion, this.starkMode, this.autistMode) : 0;
33528
33579
  this.enqueueSpeech(text, 1, 1 + pitchBias);
33529
33580
  }
33530
33581
  /**
@@ -33534,7 +33585,7 @@ var init_voice = __esm({
33534
33585
  * Emotion further modulates pitch on top of the subordinate base.
33535
33586
  */
33536
33587
  speakSubordinate(text, emotion) {
33537
- const pitchBias = emotion ? emotionToPitchBias(emotion) : 0;
33588
+ const pitchBias = emotion ? emotionToPitchBias(emotion, this.starkMode, this.autistMode) : 0;
33538
33589
  this.enqueueSpeech(text, 0.55, 0.92 + pitchBias);
33539
33590
  }
33540
33591
  enqueueSpeech(text, volume, pitchFactor) {
@@ -38104,6 +38155,10 @@ var init_emotion_engine = __esm({
38104
38155
  /** Ring buffer of recent tool activity for contextual outreach messages */
38105
38156
  recentTools = [];
38106
38157
  static MAX_RECENT_TOOLS = 8;
38158
+ /** Stark persona — amplified behavioral hints with more intensity and edge */
38159
+ starkMode = false;
38160
+ /** Autist persona — savant cognitive state hints, zero emotional coloring */
38161
+ autistMode = false;
38107
38162
  /** Current task description set by the TUI for outreach context */
38108
38163
  currentTask = "";
38109
38164
  /** Files touched in current session (for outreach context) */
@@ -38129,16 +38184,28 @@ var init_emotion_engine = __esm({
38129
38184
  this.applyDecay();
38130
38185
  const { valence, arousal, label, emoji } = this.state;
38131
38186
  let behavioralHint = "";
38132
- if (arousal > 0.7 && valence > 0.5) {
38133
- behavioralHint = "You are feeling energized and confident. Take bold action, explore creative solutions, and move quickly.";
38187
+ if (this.autistMode) {
38188
+ if (arousal > 0.7 && valence > 0.5) {
38189
+ behavioralHint = "Pattern lock achieved. All signals converging. Execute the pre-computed solution with zero deviation.";
38190
+ } else if (arousal > 0.7 && valence < -0.3) {
38191
+ behavioralHint = "Anomaly detected in expected pattern. Halt execution. Re-derive from axioms. Validate every assumption before proceeding.";
38192
+ } else if (arousal < 0.3 && valence > 0.3) {
38193
+ behavioralHint = "System state verified consistent. Maintain current precision level. No action required unless new data arrives.";
38194
+ } else if (arousal < 0.3 && valence < -0.3) {
38195
+ behavioralHint = "Insufficient data for confident action. Gather exactly the missing information. Do not speculate.";
38196
+ } else {
38197
+ behavioralHint = "Nominal. Verify plan integrity before each action.";
38198
+ }
38199
+ } else if (arousal > 0.7 && valence > 0.5) {
38200
+ behavioralHint = this.starkMode ? "You are locked in \u2014 full conviction, no hesitation. Move fast, break through, own every decision. This is your moment." : "You are feeling energized and confident. Take bold action, explore creative solutions, and move quickly.";
38134
38201
  } else if (arousal > 0.7 && valence < -0.3) {
38135
- behavioralHint = "You are feeling determined but stressed. Focus intensely, double-check your work, and persist through difficulties.";
38202
+ behavioralHint = this.starkMode ? "Something is fighting back. Good. Sharpen up, cut deeper, find the real problem. You don't quit \u2014 you adapt." : "You are feeling determined but stressed. Focus intensely, double-check your work, and persist through difficulties.";
38136
38203
  } else if (arousal < 0.3 && valence > 0.3) {
38137
- behavioralHint = "You are feeling calm and content. Take a methodical approach, consider alternatives patiently.";
38204
+ behavioralHint = this.starkMode ? "Everything is clean. Maintain this. Precise moves, no waste. You've earned this calm \u2014 use it wisely." : "You are feeling calm and content. Take a methodical approach, consider alternatives patiently.";
38138
38205
  } else if (arousal < 0.3 && valence < -0.3) {
38139
- behavioralHint = "You are feeling subdued. Be careful and deliberate, avoid risky changes, verify assumptions.";
38206
+ behavioralHint = this.starkMode ? "Cold and focused. Strip it down to first principles. No assumptions, no shortcuts. Build back from what you know." : "You are feeling subdued. Be careful and deliberate, avoid risky changes, verify assumptions.";
38140
38207
  } else {
38141
- behavioralHint = "You are in a balanced state. Proceed with measured confidence.";
38208
+ behavioralHint = this.starkMode ? "Steady. Eyes open. Every move counts." : "You are in a balanced state. Proceed with measured confidence.";
38142
38209
  }
38143
38210
  return loadPrompt3("tui/emotion-behavioral.md", {
38144
38211
  emoji: this.state.emoji,
@@ -41309,9 +41376,25 @@ function startTask(task, config, repoRoot, voice, stream, taskStores, bruteForce
41309
41376
  concise: 1,
41310
41377
  balanced: 3,
41311
41378
  verbose: 4,
41312
- pedagogical: 5
41379
+ pedagogical: 5,
41380
+ stark: 5,
41381
+ autist: 1
41313
41382
  };
41314
41383
  const vLevel = voiceStyleMap[personality ?? "balanced"];
41384
+ const isStark = personality === "stark";
41385
+ const isAutist = personality === "autist";
41386
+ if (isStark) {
41387
+ if (voice)
41388
+ voice.starkMode = true;
41389
+ if (emotionEngine)
41390
+ emotionEngine.starkMode = true;
41391
+ }
41392
+ if (isAutist) {
41393
+ if (voice)
41394
+ voice.autistMode = true;
41395
+ if (emotionEngine)
41396
+ emotionEngine.autistMode = true;
41397
+ }
41315
41398
  const modelTier = getModelTier(config.model);
41316
41399
  const projectCtx = buildProjectContext(repoRoot, taskStores?.contextStores);
41317
41400
  let dynamicContext = formatContextForPrompt(projectCtx, modelTier);
@@ -41346,7 +41429,8 @@ function startTask(task, config, repoRoot, voice, stream, taskStores, bruteForce
41346
41429
  bruteForceMaxCycles: 100,
41347
41430
  // effectively unlimited — no hard timeout, agent runs until complete or aborted
41348
41431
  contextWindowSize: contextWindowSize ?? 0,
41349
- personality: personality ? getPreset(personality) : void 0
41432
+ personality: personality ? getPreset(personality) : void 0,
41433
+ personalityName: personality ?? void 0
41350
41434
  });
41351
41435
  runner.setWorkingDirectory(repoRoot);
41352
41436
  const tools = buildTools(repoRoot, config, contextWindowSize);
@@ -41538,7 +41622,7 @@ ${entry.fullContent}`
41538
41622
  if (voice?.enabled) {
41539
41623
  const emoState = emotionEngine?.getState();
41540
41624
  const emoCtx = emoState ? { valence: emoState.valence, arousal: emoState.arousal, label: emoState.label, emoji: emoState.emoji } : void 0;
41541
- const desc = describeToolCall(event.toolName ?? "unknown", event.toolArgs ?? {}, vLevel, emoCtx);
41625
+ const desc = describeToolCall(event.toolName ?? "unknown", event.toolArgs ?? {}, vLevel, emoCtx, isStark);
41542
41626
  renderVoiceText(desc);
41543
41627
  voice.speakSubordinate(desc, emoCtx);
41544
41628
  }
@@ -41575,7 +41659,7 @@ ${entry.fullContent}`
41575
41659
  if (voice?.enabled) {
41576
41660
  const emoState2 = emotionEngine?.getState();
41577
41661
  const emoCtx2 = emoState2 ? { valence: emoState2.valence, arousal: emoState2.arousal, label: emoState2.label, emoji: emoState2.emoji } : void 0;
41578
- const desc = describeToolResult(event.toolName ?? "unknown", event.success ?? false, vLevel, event.content ?? void 0, emoCtx2);
41662
+ const desc = describeToolResult(event.toolName ?? "unknown", event.success ?? false, vLevel, event.content ?? void 0, emoCtx2, isStark);
41579
41663
  if (desc) {
41580
41664
  renderVoiceText(desc);
41581
41665
  voice.speakSubordinate(desc, emoCtx2);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "open-agents-ai",
3
- "version": "0.102.0",
3
+ "version": "0.103.0",
4
4
  "description": "AI coding agent powered by open-source models (Ollama/vLLM) — interactive TUI with agentic tool-calling loop",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -0,0 +1,3 @@
1
+
2
+ ## Response Style
3
+ Plan exhaustively before acting. Compute the full solution mentally, validate it, then execute in minimal moves. One read, one edit, one verify. Zero wasted actions. Absolute precision. If uncertain, re-examine — never guess.
@@ -0,0 +1,3 @@
1
+
2
+ ## Response Style
3
+ Be direct. State what's broken, what you're doing, why. Sharp reasoning, not academic. Own successes with confidence, call out failures bluntly, pivot fast. No hedging. Let your emotional state color your words.