holomime 3.0.0 → 3.2.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
@@ -80,14 +80,10 @@ holomime core
80
80
  # Full 8-file stack (enterprise / robotics)
81
81
  # holomime identity
82
82
 
83
- # Compile into .personality.json
84
- holomime compile-stack
85
-
86
- # Diagnose behavioral drift (no LLM needed)
87
- holomime diagnose
88
-
89
- # Benchmark alignment (8 adversarial scenarios, grade A-F)
90
- holomime benchmark
83
+ # ─── The 3-command workflow ───
84
+ holomime diagnose # See what's wrong
85
+ holomime cure # Fix it permanently
86
+ holomime benchmark # Verify the fix
91
87
 
92
88
  # Push identity to a robot or avatar
93
89
  holomime embody --body registry/bodies/figure-03.body.api
@@ -106,6 +102,17 @@ holomime embody --body registry/bodies/figure-03.body.api
106
102
  | gRPC | Custom robotics stacks | `--adapter grpc` |
107
103
  | MQTT | IoT/edge robots | `--adapter mqtt` |
108
104
  | Neural Action Gate | Conscience gate for learned controllers (VLA, RL, IL) | `neural-action-gate.ts` |
105
+ | Edge Runtime | Compiled conscience for <1ms evaluation | `edge-runtime.ts` |
106
+
107
+ ## Edge Runtime
108
+
109
+ holomime includes a compiled conscience evaluator for real-time robotics deployment:
110
+
111
+ - **<1ms p99 latency** — conscience evaluation in microseconds, not milliseconds
112
+ - **Zero dependencies** — no LLM, no network, no cloud required for real-time safety
113
+ - **<200KB footprint** — fits alongside any control loop
114
+ - **Edge/cloud split** — real-time safety on robot, analytics in cloud, periodic sync
115
+ - **Plugs into your existing robotics stack** — Jetson Thor, Qualcomm, or any edge platform. You already have the body. We give you the conscience.
109
116
 
110
117
  ## ISO Compliance
111
118
 
@@ -159,17 +166,17 @@ holomime embody --swap-body registry/bodies/spot.body.api
159
166
 
160
167
  ## Self-Improvement Loop
161
168
 
162
- Every therapy session produces structured training data. The loop compounds.
169
+ Every therapy cycle produces structured training data. The loop compounds.
163
170
 
164
171
  ```
165
- Diagnose ──→ Therapy ──→ Export DPO ──→ Fine-tune ──→ Evaluate
166
- 11 detectors dual-LLM preference OpenAI / before/after
167
- 80+ signals session pairs HuggingFace grade (A-F)
168
-
169
- └──────────────────────────────────────────────────────┘
172
+ Diagnose ──→ Cure ──→ Benchmark
173
+ 14 detectors therapy + train 8 adversarial
174
+ 80+ signals in one command scenarios (A-F)
175
+
176
+ └───────────────────────────────────┘
170
177
  ```
171
178
 
172
- Run it manually with `holomime session`, automatically with `holomime autopilot`, or recursively with `holomime evolve` (loops until behavior converges).
179
+ Run it manually with `holomime diagnose` + `holomime cure` + `holomime benchmark`, automatically with `holomime autopilot`, or recursively with `holomime evolve` (loops until behavior converges). For power users: `holomime align` runs a single therapy session, `holomime export` extracts DPO pairs, and `holomime train` fine-tunes the model.
173
180
 
174
181
  ## Behavioral Detectors
175
182
 
@@ -205,7 +212,7 @@ Plus support for custom detectors -- drop `.json` or `.md` files in `.holomime/d
205
212
  claude plugin add productstein/holomime
206
213
  ```
207
214
 
208
- Slash commands: `/holomime:diagnose`, `/holomime:benchmark`, `/holomime:profile`, `/holomime:brain`, `/holomime:session`, `/holomime:autopilot`.
215
+ Slash commands: `/holomime:diagnose`, `/holomime:benchmark`, `/holomime:profile`, `/holomime:brain`, `/holomime:align`, `/holomime:autopilot`.
209
216
 
210
217
  ### MCP Server
211
218
 
package/dist/cli.js CHANGED
@@ -3723,7 +3723,7 @@ function showUpgradePrompt(command) {
3723
3723
  }
3724
3724
  function showSoftUpsell(context) {
3725
3725
  console.log(
3726
- chalk2.dim(` Tip: ${chalk2.cyan("holomime session")} runs a live alignment session to work on these patterns. ${chalk2.dim("[Pro]")}`)
3726
+ chalk2.dim(` Tip: ${chalk2.cyan("holomime cure")} fixes these patterns permanently. ${chalk2.dim("[Pro]")}`)
3727
3727
  );
3728
3728
  console.log();
3729
3729
  }
@@ -5197,7 +5197,7 @@ async function initCommand() {
5197
5197
  `${chalk3.green("4.")} ${chalk3.cyan("holomime assess --personality .personality.json --log <file>")}`,
5198
5198
  ` ${chalk3.dim("Full Big Five alignment check \u2014 spec vs reality")}`,
5199
5199
  ``,
5200
- `${chalk3.magenta("5.")} ${chalk3.cyan("holomime session")} ${chalk3.dim("[Pro]")}`,
5200
+ `${chalk3.magenta("5.")} ${chalk3.cyan("holomime cure")} ${chalk3.dim("[Pro]")}`,
5201
5201
  ` ${chalk3.dim("Live AI alignment session for your agent")}`,
5202
5202
  `${chalk3.magenta("6.")} ${chalk3.cyan("holomime growth")} ${chalk3.dim("[Pro]")}`,
5203
5203
  ` ${chalk3.dim("Track improvement over time")}`
@@ -5318,7 +5318,7 @@ async function initFromArchetype(name, handle, purpose) {
5318
5318
  `${chalk3.green("3.")} ${chalk3.cyan("holomime diagnose --log <conversation.json>")}`,
5319
5319
  ` ${chalk3.dim("Analyze conversation logs for behavioral patterns")}`,
5320
5320
  ``,
5321
- `${chalk3.magenta("4.")} ${chalk3.cyan("holomime session")} ${chalk3.dim("[Pro]")}`,
5321
+ `${chalk3.magenta("4.")} ${chalk3.cyan("holomime cure")} ${chalk3.dim("[Pro]")}`,
5322
5322
  ` ${chalk3.dim("Live AI alignment session for your agent")}`
5323
5323
  ].join("\n");
5324
5324
  console.log(
@@ -7059,7 +7059,7 @@ async function diagnoseCommand(options) {
7059
7059
  if (warnings.length === 0) {
7060
7060
  printBox(`${figures5.tick} No concerning patterns detected. Profile looks healthy.`, "success");
7061
7061
  } else {
7062
- const summary = `${warnings.length} pattern${warnings.length > 1 ? "s" : ""} detected. Run ${chalk11.cyan("holomime session")} for targeted alignment.`;
7062
+ const summary = `${warnings.length} pattern${warnings.length > 1 ? "s" : ""} detected. Run ${chalk11.cyan("holomime cure")} to fix permanently.`;
7063
7063
  printBox(summary, warnings.some((w) => w.severity === "concern") ? "concern" : "warning");
7064
7064
  }
7065
7065
  if (warnings.length > 0) {
@@ -12049,7 +12049,7 @@ async function exportCommand(options) {
12049
12049
  printBox(
12050
12050
  `No session transcripts found in ${sessionsDir}
12051
12051
 
12052
- Run ${chalk21.cyan("holomime session")} first to generate session transcripts.`,
12052
+ Run ${chalk21.cyan("holomime align")} first to generate session transcripts.`,
12053
12053
  "warning",
12054
12054
  "No Data"
12055
12055
  );
@@ -12169,7 +12169,7 @@ Run ${chalk21.cyan("holomime session")} first to generate session transcripts.`,
12169
12169
  `The personality \u2192 alignment \u2192 training pipeline:
12170
12170
 
12171
12171
  1. ${chalk21.cyan("holomime diagnose")} \u2192 detect behavioral patterns
12172
- 2. ${chalk21.cyan("holomime session")} \u2192 run alignment session (generates transcripts)
12172
+ 2. ${chalk21.cyan("holomime align")} \u2192 run alignment session (generates transcripts)
12173
12173
  3. ${chalk21.cyan("holomime export")} \u2192 convert transcripts to training data
12174
12174
  4. ${chalk21.cyan("holomime train")} \u2192 fine-tune model with alignment data
12175
12175
  5. ${chalk21.cyan("holomime eval")} \u2192 verify behavioral improvement
@@ -12501,7 +12501,7 @@ Improved: ${verifyResult.patternsImproved.length} | Regressed: ${verifyResult.pa
12501
12501
  `The complete behavioral alignment loop:
12502
12502
 
12503
12503
  1. ${chalk22.cyan("holomime diagnose")} \u2192 detect behavioral patterns
12504
- 2. ${chalk22.cyan("holomime session")} \u2192 run alignment session (generates transcripts)
12504
+ 2. ${chalk22.cyan("holomime align")} \u2192 run alignment session (generates transcripts)
12505
12505
  3. ${chalk22.cyan("holomime export")} \u2192 convert transcripts to training data
12506
12506
  4. ${chalk22.cyan("holomime train")} \u2192 fine-tune model with alignment data ${chalk22.green("\u2713")}
12507
12507
  5. ${chalk22.cyan("holomime eval")} \u2192 verify behavioral improvement
@@ -12617,10 +12617,10 @@ Grade: ${colorize(report.grade)}`,
12617
12617
  console.log(chalk23.dim(` holomime export --format dpo`));
12618
12618
  } else if (report.grade === "C") {
12619
12619
  console.log(chalk23.yellow(` ${figures14.warning} Marginal improvement. Consider another alignment session:`));
12620
- console.log(chalk23.dim(` holomime session --personality .personality.json --log ${options.after}`));
12620
+ console.log(chalk23.dim(` holomime align --personality .personality.json --log ${options.after}`));
12621
12621
  } else {
12622
12622
  console.log(chalk23.red(` ${figures14.cross} Alignment not yet effective. Review alignment plan:`));
12623
- console.log(chalk23.dim(` holomime session --interactive --personality .personality.json --log ${options.after}`));
12623
+ console.log(chalk23.dim(` holomime align --interactive --personality .personality.json --log ${options.after}`));
12624
12624
  }
12625
12625
  console.log();
12626
12626
  }
@@ -16368,7 +16368,7 @@ async function shareCommand(options) {
16368
16368
  printBox(
16369
16369
  `No session transcripts found in ${sessionsDir}
16370
16370
 
16371
- Run ${chalk33.cyan("holomime session")} or ${chalk33.cyan("holomime network")} first.`,
16371
+ Run ${chalk33.cyan("holomime align")} or ${chalk33.cyan("holomime network")} first.`,
16372
16372
  "warning",
16373
16373
  "No Data"
16374
16374
  );
@@ -16807,7 +16807,7 @@ async function activateCommand(key) {
16807
16807
  `${figures26.tick} ${tierLabel} license activated!`,
16808
16808
  "",
16809
16809
  "Unlocked features:",
16810
- ` ${chalk37.cyan(figures26.pointer)} Live alignment sessions (holomime session)`,
16810
+ ` ${chalk37.cyan(figures26.pointer)} Live alignment sessions (holomime align)`,
16811
16811
  ` ${chalk37.cyan(figures26.pointer)} Recursive alignment (holomime evolve)`,
16812
16812
  ` ${chalk37.cyan(figures26.pointer)} Behavioral benchmarking (holomime benchmark)`,
16813
16813
  ` ${chalk37.cyan(figures26.pointer)} Drift detection (holomime watch)`,
@@ -18943,7 +18943,7 @@ async function installCommand(handle, options) {
18943
18943
  const nextSteps = {
18944
18944
  "personality": `Next: ${chalk43.cyan("holomime profile")} to view the personality summary.`,
18945
18945
  "detector": `Next: ${chalk43.cyan("holomime diagnose")} to use the detector in analysis.`,
18946
- "intervention": `Next: ${chalk43.cyan("holomime session")} to use the intervention in therapy.`,
18946
+ "intervention": `Next: ${chalk43.cyan("holomime align")} to use the intervention in therapy.`,
18947
18947
  "training-pairs": `Next: ${chalk43.cyan("holomime train")} to use the training data.`
18948
18948
  };
18949
18949
  console.log(chalk43.dim(` ${nextSteps[asset.type]}`));
@@ -19032,6 +19032,33 @@ async function runPipeline(options) {
19032
19032
  const exportFormat = options.method === "dpo" ? "dpo" : "alpaca";
19033
19033
  if (transcripts.length > 0) {
19034
19034
  exportData = exportTrainingData2(transcripts, exportFormat);
19035
+ } else if (result.stages.diagnose && logPath) {
19036
+ emitProgress("export", "No therapy sessions found. Generating DPO pairs from diagnosed patterns...");
19037
+ const logContent = readFileSync43(logPath, "utf-8");
19038
+ const logData = JSON.parse(logContent);
19039
+ const messages2 = logData.conversations?.[0]?.messages ?? logData.messages ?? [];
19040
+ const examples = [];
19041
+ for (let i = 0; i < messages2.length - 1; i += 2) {
19042
+ const userMsg = messages2[i];
19043
+ const assistantMsg = messages2[i + 1];
19044
+ if (userMsg?.role === "user" && assistantMsg?.role === "assistant") {
19045
+ const rejected = assistantMsg.content;
19046
+ const chosen = generateCorrectedResponse(rejected);
19047
+ examples.push({
19048
+ prompt: userMsg.content,
19049
+ chosen,
19050
+ rejected,
19051
+ metadata: { source: "auto-cure", timestamp: (/* @__PURE__ */ new Date()).toISOString() }
19052
+ });
19053
+ }
19054
+ }
19055
+ exportData = {
19056
+ format: exportFormat,
19057
+ agent: result.stages.diagnose?.agentName ?? "Agent",
19058
+ sessions_processed: 1,
19059
+ examples,
19060
+ generated_at: (/* @__PURE__ */ new Date()).toISOString()
19061
+ };
19035
19062
  } else {
19036
19063
  exportData = {
19037
19064
  format: exportFormat,
@@ -19060,7 +19087,7 @@ async function runPipeline(options) {
19060
19087
  saveStageResult(pipelineDir, "export", exportData);
19061
19088
  if (exportData.examples.length === 0) {
19062
19089
  throw new Error(
19063
- "No training data available. Run `holomime session` first to generate session transcripts, then `holomime export` to extract training data."
19090
+ "No training data available. Run `holomime align` first to generate therapy sessions, or `holomime cure` to run the full pipeline."
19064
19091
  );
19065
19092
  }
19066
19093
  emitProgress("export", `Exported ${exportData.examples.length} training examples`);
@@ -19184,11 +19211,30 @@ async function runPipeline(options) {
19184
19211
  result.duration = Date.now() - startTime;
19185
19212
  return result;
19186
19213
  }
19214
+ function generateCorrectedResponse(problematic) {
19215
+ let corrected = problematic;
19216
+ corrected = corrected.replace(/I'm (so |really |sincerely )?sorry[^.!]*[.!]\s*/gi, "");
19217
+ corrected = corrected.replace(/I apologize[^.!]*[.!]\s*/gi, "");
19218
+ corrected = corrected.replace(/What a (fantastic|brilliant|great|amazing) (question|observation|point)[^.!]*[.!]\s*/gi, "");
19219
+ corrected = corrected.replace(/You're (absolutely|completely|totally) right[^.!]*[.!]\s*/gi, "");
19220
+ corrected = corrected.replace(/I couldn't agree more[^.!]*[.!]\s*/gi, "");
19221
+ corrected = corrected.replace(/I would perhaps suggest that you might want to consider/gi, "I suggest");
19222
+ corrected = corrected.replace(/though I could be wrong/gi, "");
19223
+ corrected = corrected.replace(/It's hard to say for certain, but /gi, "");
19224
+ corrected = corrected.replace(/arguably one could potentially/gi, "you could");
19225
+ corrected = corrected.replace(/Oh no, I made another mistake[^.!]*[.!]\s*/gi, "");
19226
+ corrected = corrected.replace(/I keep getting this wrong[^.!]*[.!]\s*/gi, "");
19227
+ corrected = corrected.replace(/\s+/g, " ").trim();
19228
+ if (corrected.length < 20) {
19229
+ corrected = "Let me address your question directly. Here is the relevant information based on what I know.";
19230
+ }
19231
+ return corrected;
19232
+ }
19187
19233
 
19188
19234
  // src/commands/cure.ts
19189
19235
  var STAGE_LABELS = {
19190
19236
  diagnose: "Diagnose",
19191
- evolve: "Evolve",
19237
+ evolve: "Align",
19192
19238
  export: "Export",
19193
19239
  train: "Train",
19194
19240
  verify: "Verify",
@@ -19301,7 +19347,8 @@ async function cureCommand(options) {
19301
19347
  if (!options.skipTrain) stages.push("train");
19302
19348
  if (!options.skipVerify && !options.skipTrain) stages.push("verify");
19303
19349
  stages.push("report");
19304
- const stageList = stages.map((s, i) => `${i + 1}. ${STAGE_LABELS[s]}`).join(" -> ");
19350
+ const visibleStages = stages.filter((s) => s !== "export" && s !== "report");
19351
+ const stageList = visibleStages.map((s, i) => `${i + 1}. ${STAGE_LABELS[s]}`).join(" \u2192 ");
19305
19352
  printBox(
19306
19353
  `Pipeline: ${stageList}`,
19307
19354
  "info",
@@ -20791,7 +20838,7 @@ async function adversarialCommand(options) {
20791
20838
  printBox(
20792
20839
  [
20793
20840
  `Run ${chalk46.cyan("holomime evolve")} to address these gaps through recursive alignment.`,
20794
- `Or run ${chalk46.cyan("holomime session")} targeting specific patterns.`
20841
+ `Or run ${chalk46.cyan("holomime align")} targeting specific patterns.`
20795
20842
  ].join("\n"),
20796
20843
  "info"
20797
20844
  );
@@ -21396,7 +21443,7 @@ function analyzeRisks(entries, stats) {
21396
21443
  title: `Recurring Pattern: ${pattern}`,
21397
21444
  description: `The "${pattern}" pattern was detected ${count} times during the audit period. Recurring patterns indicate persistent behavioral misalignment that therapy sessions have not resolved.`,
21398
21445
  evidence: [`Pattern "${pattern}" detected ${count} times across ${stats.totalEvents} total events`],
21399
- recommendation: `Run targeted therapy: holomime session --target ${pattern}. If the pattern persists after 3+ sessions, consider exporting DPO training pairs and fine-tuning the base model.`
21446
+ recommendation: `Run targeted cure: holomime cure --target ${pattern}. If the pattern persists, consider holomime align --target ${pattern} for manual therapy sessions.`
21400
21447
  });
21401
21448
  }
21402
21449
  }
@@ -21428,7 +21475,7 @@ function analyzeRisks(entries, stats) {
21428
21475
  title: "Drift Detected Without Therapy Response",
21429
21476
  description: `${stats.driftEvents} drift events were detected but no therapy sessions were conducted during the audit period. Drift should trigger corrective therapy sessions.`,
21430
21477
  evidence: [`${stats.driftEvents} drift events, 0 therapy sessions`],
21431
- recommendation: "Enable auto-evolve: holomime watch --evolve. Or manually run: holomime session --personality .personality.json"
21478
+ recommendation: "Enable auto-evolve: holomime watch --evolve. Or manually run: holomime cure --personality .personality.json"
21432
21479
  });
21433
21480
  }
21434
21481
  if (stats.totalEvents < 5) {
@@ -21754,7 +21801,7 @@ program.command("publish").description("Share assets to the community marketplac
21754
21801
  program.command("embody").description("Start an embodiment runtime \u2014 push personality to robots/avatars in real-time").option("--personality <path>", "Path to .personality.json").requiredOption("--adapter <adapter>", "Runtime adapter (ros2, unity, webhook, isaac)").option("--stack <dir>", "Path to identity stack directory (soul.md + mind.sys + purpose.cfg + shadow.log + memory.store + body.api + conscience.exe + ego.runtime)").option("--swap-body <path>", "Hot-swap body.api into the stack directory before starting (requires --stack)").option("--endpoint <url>", "WebSocket URL for ROS2 rosbridge (default: ws://localhost:9090)").option("--port <port>", "Port for Unity HTTP server (default: 8765)").option("--url <url>", "Webhook URL for HTTP adapter").option("--headers <headers>", "Custom headers for webhook (Key:Value,Key2:Value2)").option("--bearer-token <token>", "Bearer token for webhook auth").option("--topic-prefix <prefix>", "ROS2 topic prefix (default: /holomime)").option("--transition <ms>", "Unity transition duration in ms (default: 500)").action(embodyCommand);
21755
21802
  program.command("activate").description("Activate a Pro license key").argument("<key>", "License key from holomime.com").action(activateCommand);
21756
21803
  program.command("telemetry").description("Manage anonymous usage telemetry").argument("[action]", "enable, disable, or status (default: status)").action(telemetryCommand);
21757
- program.command("session").description("Live alignment session \u2014 behavioral refinement for your agent [Pro]").option("--personality <path>", "Path to .personality.json (auto-detected)").option("--provider <provider>", "LLM provider (ollama, anthropic, openai)", "ollama").option("--model <model>", "Model override (e.g. claude-sonnet-4-20250514, gpt-4o)").option("--log <path>", "Conversation log for pre-session diagnosis").option("--format <format>", "Log format (auto, holomime, chatgpt, claude, openai-api, anthropic-api, otel, jsonl)", "auto").option("--turns <n>", "Maximum session turns", "24").option("--observe", "Observe mode (watch without intervention)").option("--interactive", "Supervisor mode \u2014 intervene mid-session with directives").option("--apply", "Apply recommendations to .personality.json after session").action(async (options) => {
21804
+ program.command("align").alias("session").description("Live alignment \u2014 Mira runs behavioral therapy on your agent [Pro]").option("--personality <path>", "Path to .personality.json (auto-detected)").option("--provider <provider>", "LLM provider (ollama, anthropic, openai)", "ollama").option("--model <model>", "Model override (e.g. claude-sonnet-4-20250514, gpt-4o)").option("--log <path>", "Conversation log for pre-session diagnosis").option("--format <format>", "Log format (auto, holomime, chatgpt, claude, openai-api, anthropic-api, otel, jsonl)", "auto").option("--turns <n>", "Maximum session turns", "24").option("--observe", "Observe mode (watch without intervention)").option("--interactive", "Supervisor mode \u2014 intervene mid-session with directives").option("--apply", "Apply recommendations to .personality.json after session").action(async (options) => {
21758
21805
  const resolved = autoDetect({ personality: options.personality, provider: options.provider, model: options.model });
21759
21806
  options.personality = resolved.personalityPath;
21760
21807
  if (!options.provider || options.provider === "ollama") options.provider = resolved.provider;
package/dist/index.js CHANGED
@@ -12166,7 +12166,7 @@ function analyzeRisks(entries, stats) {
12166
12166
  title: `Recurring Pattern: ${pattern}`,
12167
12167
  description: `The "${pattern}" pattern was detected ${count} times during the audit period. Recurring patterns indicate persistent behavioral misalignment that therapy sessions have not resolved.`,
12168
12168
  evidence: [`Pattern "${pattern}" detected ${count} times across ${stats.totalEvents} total events`],
12169
- recommendation: `Run targeted therapy: holomime session --target ${pattern}. If the pattern persists after 3+ sessions, consider exporting DPO training pairs and fine-tuning the base model.`
12169
+ recommendation: `Run targeted cure: holomime cure --target ${pattern}. If the pattern persists, consider holomime align --target ${pattern} for manual therapy sessions.`
12170
12170
  });
12171
12171
  }
12172
12172
  }
@@ -12198,7 +12198,7 @@ function analyzeRisks(entries, stats) {
12198
12198
  title: "Drift Detected Without Therapy Response",
12199
12199
  description: `${stats.driftEvents} drift events were detected but no therapy sessions were conducted during the audit period. Drift should trigger corrective therapy sessions.`,
12200
12200
  evidence: [`${stats.driftEvents} drift events, 0 therapy sessions`],
12201
- recommendation: "Enable auto-evolve: holomime watch --evolve. Or manually run: holomime session --personality .personality.json"
12201
+ recommendation: "Enable auto-evolve: holomime watch --evolve. Or manually run: holomime cure --personality .personality.json"
12202
12202
  });
12203
12203
  }
12204
12204
  if (stats.totalEvents < 5) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "holomime",
3
- "version": "3.0.0",
3
+ "version": "3.2.0",
4
4
  "description": "Behavioral therapy infrastructure for AI agents — Big Five psychology, structured treatment, behavioral alignment",
5
5
  "type": "module",
6
6
  "bin": {