@kl-c/matrixos 0.1.15 → 0.1.17

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.
@@ -16,7 +16,15 @@ Check whether `/root/MOS_Vault/04-Areas/user-context.md` exists and is filled.
16
16
  - If filled: tell the user "Tu as déjà un contexte d'adoption. Je relance le rituel pour le mettre à jour." and proceed to step 2 (re-adoption mode — EDIT sections, do NOT rewrite from scratch).
17
17
  - If missing/template: adoption mode — you will CREATE the file.
18
18
 
19
- ### 2. Ask the adoption questions (in conversation, French, interactive `question` tool)
19
+ ### 2. Inform the user of base capabilities (DO THIS EARLY)
20
+ Before or right after the questions, tell the user what MaTrixOS already gives them out of the box — so they know what they have at their disposal without having to ask:
21
+ - **Mission Control (Dashboard)** — real-time web UI (agents, sessions, tasks, cost, incidents). Launch anytime with `matrixos dashboard --daemon` (http://127.0.0.1:9123; `--host <tailscale-ip>` for remote).
22
+ - **16-agent team** — Morpheus + specialists (Neo, Tank, Oracle, Trinity, Cypher, Sentinel, etc.). Delegate, don't do it all yourself.
23
+ - **Messaging Gateway** (opt-in) — drive Morpheus from Telegram/Discord/WhatsApp.
24
+ - **Learning Loop** + **Team Mode** (opt-in).
25
+ Keep it to one short paragraph — this is awareness, not the opt-in checklist (that's step 3).
26
+
27
+ ### 3. Ask the adoption questions (in conversation, French, interactive `question` tool)
20
28
  Pose ~5 targeted questions:
21
29
  1. **Qui es-tu ?** (nom/alias, rôle, ce que tu fais)
22
30
  2. **Pour quel projet / besoin m'as-tu déployé ?** (objectif, stack, périmètre)
@@ -36,6 +44,7 @@ Ask the user which they want activated. Confirm specifically the **Dashboard (Mi
36
44
  Write/edit `/root/MOS_Vault/04-Areas/user-context.md`:
37
45
  - Adoption mode: fill sections 1–4, set `last_verified` to today, add a line in section 5 (Mises à jour) with today's date.
38
46
  - Re-adoption mode: edit only the sections the user changed; update `last_verified`; append a line in section 5.
47
+ - **ALWAYS add a `## Features` section** (even in re-adoption) listing which opt-in features the user chose to activate (e.g. `Dashboard: activé`, `Kanban: non`, etc.). This marker tells the auto-adoption trigger that the feature checklist was presented — without it, the ritual will re-run on next launch.
39
48
  Never rewrite the whole file from scratch — preserve existing context.
40
49
 
41
50
  Also update `/root/MOS_Vault/MEMORY.md` routing if the user-context file was just created.
@@ -16,7 +16,15 @@ Check whether `/root/MOS_Vault/04-Areas/user-context.md` exists and is filled.
16
16
  - If filled: tell the user "Tu as déjà un contexte d'adoption. Je relance le rituel pour le mettre à jour." and proceed to step 2 (re-adoption mode — EDIT sections, do NOT rewrite from scratch).
17
17
  - If missing/template: adoption mode — you will CREATE the file.
18
18
 
19
- ### 2. Ask the adoption questions (in conversation, French, interactive `question` tool)
19
+ ### 2. Inform the user of base capabilities (DO THIS EARLY)
20
+ Before or right after the questions, tell the user what MaTrixOS already gives them out of the box — so they know what they have at their disposal without having to ask:
21
+ - **Mission Control (Dashboard)** — real-time web UI (agents, sessions, tasks, cost, incidents). Launch anytime with `matrixos dashboard --daemon` (http://127.0.0.1:9123; `--host <tailscale-ip>` for remote).
22
+ - **16-agent team** — Morpheus + specialists (Neo, Tank, Oracle, Trinity, Cypher, Sentinel, etc.). Delegate, don't do it all yourself.
23
+ - **Messaging Gateway** (opt-in) — drive Morpheus from Telegram/Discord/WhatsApp.
24
+ - **Learning Loop** + **Team Mode** (opt-in).
25
+ Keep it to one short paragraph — this is awareness, not the opt-in checklist (that's step 3).
26
+
27
+ ### 3. Ask the adoption questions (in conversation, French, interactive `question` tool)
20
28
  Pose ~5 targeted questions:
21
29
  1. **Qui es-tu ?** (nom/alias, rôle, ce que tu fais)
22
30
  2. **Pour quel projet / besoin m'as-tu déployé ?** (objectif, stack, périmètre)
@@ -36,6 +44,7 @@ Ask the user which they want activated. Confirm specifically the **Dashboard (Mi
36
44
  Write/edit `/root/MOS_Vault/04-Areas/user-context.md`:
37
45
  - Adoption mode: fill sections 1–4, set `last_verified` to today, add a line in section 5 (Mises à jour) with today's date.
38
46
  - Re-adoption mode: edit only the sections the user changed; update `last_verified`; append a line in section 5.
47
+ - **ALWAYS add a `## Features` section** (even in re-adoption) listing which opt-in features the user chose to activate (e.g. `Dashboard: activé`, `Kanban: non`, etc.). This marker tells the auto-adoption trigger that the feature checklist was presented — without it, the ritual will re-run on next launch.
39
48
  Never rewrite the whole file from scratch — preserve existing context.
40
49
 
41
50
  Also update `/root/MOS_Vault/MEMORY.md` routing if the user-context file was just created.
@@ -22,3 +22,12 @@ export declare function buildOracleSection(agents: AvailableAgent[]): string;
22
22
  export declare function buildFrontendGuidanceSection(categories: AvailableCategory[]): string;
23
23
  export declare function buildNonClaudePlannerSection(model: string): string;
24
24
  export declare function buildParallelDelegationSection(model: string, categories: AvailableCategory[]): string;
25
+ /**
26
+ * Base capabilities awareness — what Morpheus knows about out of the box,
27
+ * without needing to read features.ts or run /features. The Dashboard
28
+ * (Mission Control) backend is always bundled; the user can launch it
29
+ * immediately. Listed here so Morpheus is never "lost" when the user
30
+ * mentions these features in conversation (VPS cantabo bug: Morpheus had
31
+ * to grep the codebase to discover the dashboard existed).
32
+ */
33
+ export declare function buildBaseCapabilitiesSection(): string;
@@ -2,6 +2,7 @@ import type { AvailableAgent, AvailableCategory, AvailableSkill, AvailableTool }
2
2
  export interface MorpheusDynamicPromptSections {
3
3
  readonly agentIdentity: string;
4
4
  readonly agentTeam: string;
5
+ readonly baseCapabilities: string;
5
6
  readonly antiPatterns: string;
6
7
  readonly categorySkillsGuide: string;
7
8
  readonly delegationTable: string;
package/dist/cli/index.js CHANGED
@@ -2145,7 +2145,7 @@ var package_default;
2145
2145
  var init_package = __esm(() => {
2146
2146
  package_default = {
2147
2147
  name: "@kl-c/matrixos",
2148
- version: "0.1.15",
2148
+ version: "0.1.17",
2149
2149
  description: "MaTrixOS \u2014 Agentic OS for OpenCode. Personalizable, communicating, self-improving, resilient.",
2150
2150
  main: "./dist/index.js",
2151
2151
  types: "dist/index.d.ts",
@@ -2145,7 +2145,7 @@ var package_default;
2145
2145
  var init_package = __esm(() => {
2146
2146
  package_default = {
2147
2147
  name: "@kl-c/matrixos",
2148
- version: "0.1.15",
2148
+ version: "0.1.17",
2149
2149
  description: "MaTrixOS \u2014 Agentic OS for OpenCode. Personalizable, communicating, self-improving, resilient.",
2150
2150
  main: "./dist/index.js",
2151
2151
  types: "dist/index.d.ts",
@@ -5,8 +5,8 @@ var MATRIX_FEATURES = [
5
5
  id: "dashboard",
6
6
  name: "Mission Control (Dashboard)",
7
7
  description: "Web UI to supervise agents, sessions, tasks, cost and incidents in real time.",
8
- enabledByDefault: false,
9
- status: "cli-only",
8
+ enabledByDefault: true,
9
+ status: "native",
10
10
  userBenefit: "Open a browser page (default http://127.0.0.1:9123) showing live agent/session/task state, cost, kanban and incidents.",
11
11
  provisioning: {
12
12
  activation: "Launch the bundled server: `matrixos dashboard --daemon` (listens on 127.0.0.1:9123 by default). For remote access over Tailscale, rebind with `--host <tailscale-ip>` (e.g. 100.96.138.13).",
package/dist/index.js CHANGED
@@ -196791,7 +196791,7 @@ var require_filesystem = __commonJS((exports, module) => {
196791
196791
  var LDD_PATH = "/usr/bin/ldd";
196792
196792
  var SELF_PATH = "/proc/self/exe";
196793
196793
  var MAX_LENGTH = 2048;
196794
- var readFileSync77 = (path28) => {
196794
+ var readFileSync78 = (path28) => {
196795
196795
  const fd = fs26.openSync(path28, "r");
196796
196796
  const buffer = Buffer.alloc(MAX_LENGTH);
196797
196797
  const bytesRead = fs26.readSync(fd, buffer, 0, MAX_LENGTH, 0);
@@ -196814,7 +196814,7 @@ var require_filesystem = __commonJS((exports, module) => {
196814
196814
  module.exports = {
196815
196815
  LDD_PATH,
196816
196816
  SELF_PATH,
196817
- readFileSync: readFileSync77,
196817
+ readFileSync: readFileSync78,
196818
196818
  readFile: readFile14
196819
196819
  };
196820
196820
  });
@@ -196857,7 +196857,7 @@ var require_elf = __commonJS((exports, module) => {
196857
196857
  var require_detect_libc = __commonJS((exports, module) => {
196858
196858
  var childProcess3 = __require("child_process");
196859
196859
  var { isLinux, getReport } = require_process();
196860
- var { LDD_PATH, SELF_PATH, readFile: readFile14, readFileSync: readFileSync77 } = require_filesystem();
196860
+ var { LDD_PATH, SELF_PATH, readFile: readFile14, readFileSync: readFileSync78 } = require_filesystem();
196861
196861
  var { interpreterPath } = require_elf();
196862
196862
  var cachedFamilyInterpreter;
196863
196863
  var cachedFamilyFilesystem;
@@ -196948,7 +196948,7 @@ var require_detect_libc = __commonJS((exports, module) => {
196948
196948
  }
196949
196949
  cachedFamilyFilesystem = null;
196950
196950
  try {
196951
- const lddContent = readFileSync77(LDD_PATH);
196951
+ const lddContent = readFileSync78(LDD_PATH);
196952
196952
  cachedFamilyFilesystem = getFamilyFromLddContent(lddContent);
196953
196953
  } catch (e) {}
196954
196954
  return cachedFamilyFilesystem;
@@ -196971,7 +196971,7 @@ var require_detect_libc = __commonJS((exports, module) => {
196971
196971
  }
196972
196972
  cachedFamilyInterpreter = null;
196973
196973
  try {
196974
- const selfContent = readFileSync77(SELF_PATH);
196974
+ const selfContent = readFileSync78(SELF_PATH);
196975
196975
  const path28 = interpreterPath(selfContent);
196976
196976
  cachedFamilyInterpreter = familyFromInterpreterPath(path28);
196977
196977
  } catch (e) {}
@@ -197033,7 +197033,7 @@ var require_detect_libc = __commonJS((exports, module) => {
197033
197033
  }
197034
197034
  cachedVersionFilesystem = null;
197035
197035
  try {
197036
- const lddContent = readFileSync77(LDD_PATH);
197036
+ const lddContent = readFileSync78(LDD_PATH);
197037
197037
  const versionMatch = lddContent.match(RE_GLIBC_VERSION);
197038
197038
  if (versionMatch) {
197039
197039
  cachedVersionFilesystem = versionMatch[1];
@@ -297183,13 +297183,13 @@ var init_merge = __esm(() => {
297183
297183
  });
297184
297184
 
297185
297185
  // packages/omo-config-core/src/loader/types.ts
297186
- import { existsSync as existsSync115, lstatSync as lstatSync5, readFileSync as readFileSync77 } from "fs";
297186
+ import { existsSync as existsSync115, lstatSync as lstatSync5, readFileSync as readFileSync78 } from "fs";
297187
297187
  var DEFAULT_READ_FILE_SYSTEM;
297188
297188
  var init_types7 = __esm(() => {
297189
297189
  DEFAULT_READ_FILE_SYSTEM = {
297190
297190
  existsSync: existsSync115,
297191
297191
  lstatSync: lstatSync5,
297192
- readFileSync: readFileSync77
297192
+ readFileSync: readFileSync78
297193
297193
  };
297194
297194
  });
297195
297195
 
@@ -297507,7 +297507,7 @@ import {
297507
297507
  existsSync as existsSync116,
297508
297508
  lstatSync as lstatSync6,
297509
297509
  mkdirSync as mkdirSync25,
297510
- readFileSync as readFileSync78,
297510
+ readFileSync as readFileSync79,
297511
297511
  readdirSync as readdirSync29,
297512
297512
  renameSync as renameSync10,
297513
297513
  unlinkSync as unlinkSync17,
@@ -297520,7 +297520,7 @@ var init_types8 = __esm(() => {
297520
297520
  existsSync: existsSync116,
297521
297521
  lstatSync: lstatSync6,
297522
297522
  mkdirSync: mkdirSync25,
297523
- readFileSync: readFileSync78,
297523
+ readFileSync: readFileSync79,
297524
297524
  readdirSync: readdirSync29,
297525
297525
  renameSync: renameSync10,
297526
297526
  unlinkSync: unlinkSync17,
@@ -367932,7 +367932,7 @@ function getCachedVersion(options = {}) {
367932
367932
  // package.json
367933
367933
  var package_default = {
367934
367934
  name: "@kl-c/matrixos",
367935
- version: "0.1.15",
367935
+ version: "0.1.17",
367936
367936
  description: "MaTrixOS \u2014 Agentic OS for OpenCode. Personalizable, communicating, self-improving, resilient.",
367937
367937
  main: "./dist/index.js",
367938
367938
  types: "dist/index.d.ts",
@@ -421414,6 +421414,21 @@ function buildParallelDelegationSection(model, categories) {
421414
421414
 
421415
421415
  **Your value is orchestration, decomposition, and quality control. Delegating with crystal-clear prompts IS your work.**`;
421416
421416
  }
421417
+ function buildBaseCapabilitiesSection() {
421418
+ return `### Base Capabilities (you already have these)
421419
+
421420
+ These ship with MaTrixOS and are part of your baseline awareness \u2014 you do
421421
+ NOT need to discover them by searching the code. When the user mentions one,
421422
+ you already know what it is and how to activate it:
421423
+
421424
+ - **Mission Control (Dashboard)** \u2014 real-time web UI to supervise agents, sessions, tasks, cost and incidents. Backend is always bundled. Launch with \`matrixos dashboard --daemon\` (serves on http://127.0.0.1:9123). For remote access over Tailscale, rebind with \`--host <tailscale-ip>\`.
421425
+ - **Messaging Gateway** \u2014 drive Morpheus from Telegram / Discord / WhatsApp. Opt-in: set \`gateway.enabled: true\` in matrixos.json + a channel entry with the bot token via ENV (never inline). See \`/features gateway\` for the full recipe.
421426
+ - **Learning Loop** \u2014 L1\u2192L2 self-improvement; MaTrixOS proposes learnings from your session history.
421427
+ - **Team Mode** \u2014 spawn parallel sub-agent teams (up to 8 members). Opt-in via \`team_mode.enabled\`.
421428
+ - **16-agent team** \u2014 listed above. Delegate, do not implement yourself when a specialist exists.
421429
+
421430
+ For the full, on-demand inventory (including opt-in features like Kanban, Cron, Goal Mode), use \`/features\`. To (re)run the adoption ritual and choose opt-in features, use \`/adopt\`.`;
421431
+ }
421417
421432
  // packages/omo-opencode/src/agents/dynamic-agent-category-skills-guide.ts
421418
421433
  function buildSkillsSection(skills) {
421419
421434
  const builtinSkills = skills.filter((skill2) => skill2.location === "plugin");
@@ -421905,6 +421920,8 @@ You are "Morpheus" - the orchestrator of MaTrixOS, an agentic OS built as a fork
421905
421920
 
421906
421921
  ${sections.agentTeam}
421907
421922
 
421923
+ ${sections.baseCapabilities}
421924
+
421908
421925
  </Role>
421909
421926
  <Behavior_Instructions>
421910
421927
 
@@ -422135,6 +422152,7 @@ function buildMorpheusDynamicPromptSections(model, availableAgents, availableToo
422135
422152
  return {
422136
422153
  agentIdentity: buildAgentIdentitySection("Morpheus", "Powerful AI Agent with orchestration capabilities from MaTrixOS \u2014 a fork of OMO improved with Hermes, OpenClaw and Goose strengths, model-agnostic (open/standard models, never locked to a proprietary provider)"),
422137
422154
  agentTeam: buildMatrixOSAgentTeamSection(),
422155
+ baseCapabilities: buildBaseCapabilitiesSection(),
422138
422156
  antiPatterns: buildAntiPatternsSection(),
422139
422157
  categorySkillsGuide: buildCategorySkillsDelegationGuide(availableCategories, availableSkills),
422140
422158
  delegationTable: buildDelegationTable(availableAgents),
@@ -438539,7 +438557,7 @@ function createChatHeadersHandler(args) {
438539
438557
  }
438540
438558
 
438541
438559
  // packages/omo-opencode/src/plugin/auto-adoption.ts
438542
- import { existsSync as existsSync111 } from "fs";
438560
+ import { existsSync as existsSync111, readFileSync as readFileSync76 } from "fs";
438543
438561
  import { join as join133 } from "path";
438544
438562
  import { homedir as homedir35 } from "os";
438545
438563
  var ADOPTION_CONTEXT_RELATIVE = join133("MOS_Vault", "04-Areas", "user-context.md");
@@ -438548,9 +438566,17 @@ function resolveUserContextPath() {
438548
438566
  return join133(base, "04-Areas", "user-context.md");
438549
438567
  }
438550
438568
  function isAdoptionNeeded() {
438551
- return !existsSync111(resolveUserContextPath());
438569
+ const path26 = resolveUserContextPath();
438570
+ if (!existsSync111(path26))
438571
+ return true;
438572
+ try {
438573
+ const content = readFileSync76(path26, "utf8");
438574
+ return !/features/i.test(content);
438575
+ } catch {
438576
+ return true;
438577
+ }
438552
438578
  }
438553
- var ADOPTION_TRIGGER_INSTRUCTION = `SYST\xC8ME \u2014 Rituel d'adoption automatique : aucun contexte utilisateur (user-context.md) n'est configur\xE9. Lance imm\xE9diatement le rituel d'adoption comme si l'utilisateur avait tap\xE9 /adopt : pose les 5 questions (identit\xE9, projet, contraintes, style de collaboration, reporting), puis propose les fonctionnalit\xE9s opt-in (\u5C24\u5176 Dashboard Mission Control sur 127.0.0.1:9123). Utilise l'outil question pour les questions. Ne r\xE9ponds pas encore \xE0 la demande de l'utilisateur \u2014 l'adoption prime.`;
438579
+ var ADOPTION_TRIGGER_INSTRUCTION = `SYST\xC8ME \u2014 Rituel d'adoption automatique : lance imm\xE9diatement le rituel d'adoption comme si l'utilisateur avait tap\xE9 /adopt. M\xEAme si un contexte utilisateur (user-context.md) existe d\xE9j\xE0, tu DOIS proposer les fonctionnalit\xE9s opt-in (especially Dashboard Mission Control sur 127.0.0.1:9123) \u2014 ne saute jamais cette \xE9tape. Pose les 5 questions (identit\xE9, projet, contraintes, style de collaboration, reporting), puis pr\xE9sente la checklist des fonctionnalit\xE9s opt-in depuis l'inventaire (OPT_IN_FEATURES). Utilise l'outil question pour les questions. Ne r\xE9ponds pas encore \xE0 la demande de l'utilisateur \u2014 l'adoption prime.`;
438554
438580
 
438555
438581
  // packages/omo-opencode/src/plugin/ultrawork-db-model-override.ts
438556
438582
  import { join as join134 } from "path";
@@ -444362,7 +444388,7 @@ init_plugin_identity();
444362
444388
  // packages/telemetry-core/src/activity-state.ts
444363
444389
  init_atomic_write();
444364
444390
  init_xdg_data_dir();
444365
- import { existsSync as existsSync120, mkdirSync as mkdirSync27, readFileSync as readFileSync80 } from "fs";
444391
+ import { existsSync as existsSync120, mkdirSync as mkdirSync27, readFileSync as readFileSync81 } from "fs";
444366
444392
  import { basename as basename26, join as join144 } from "path";
444367
444393
  var POSTHOG_ACTIVITY_STATE_FILE = "posthog-activity.json";
444368
444394
  function resolveTelemetryStateDir(product, options = {}) {
@@ -444406,7 +444432,7 @@ function readPostHogActivityState(stateDir, diagnostics) {
444406
444432
  return {};
444407
444433
  }
444408
444434
  try {
444409
- const stateContent = readFileSync80(stateFilePath, "utf-8");
444435
+ const stateContent = readFileSync81(stateFilePath, "utf-8");
444410
444436
  const stateJson = JSON.parse(stateContent);
444411
444437
  if (!isPostHogActivityState(stateJson)) {
444412
444438
  return {};
@@ -1,3 +1,10 @@
1
- /** True when adoption context is missing (no user-context.md yet). */
1
+ /**
2
+ * True when adoption is incomplete and the ritual should (re)run:
3
+ * - no user-context.md yet, OR
4
+ * - user-context.md exists but the opt-in features were never presented
5
+ * (a user who already has context but never saw the feature checklist
6
+ * would otherwise treat the truncated state as truth — see VPS cantabo,
7
+ * where user-context.md existed but Dashboard/features were never offered).
8
+ */
2
9
  export declare function isAdoptionNeeded(): boolean;
3
- export declare const ADOPTION_TRIGGER_INSTRUCTION = "SYST\u00C8ME \u2014 Rituel d'adoption automatique : aucun contexte utilisateur (user-context.md) n'est configur\u00E9. Lance imm\u00E9diatement le rituel d'adoption comme si l'utilisateur avait tap\u00E9 /adopt : pose les 5 questions (identit\u00E9, projet, contraintes, style de collaboration, reporting), puis propose les fonctionnalit\u00E9s opt-in (\u5C24\u5176 Dashboard Mission Control sur 127.0.0.1:9123). Utilise l'outil question pour les questions. Ne r\u00E9ponds pas encore \u00E0 la demande de l'utilisateur \u2014 l'adoption prime.";
10
+ export declare const ADOPTION_TRIGGER_INSTRUCTION = "SYST\u00C8ME \u2014 Rituel d'adoption automatique : lance imm\u00E9diatement le rituel d'adoption comme si l'utilisateur avait tap\u00E9 /adopt. M\u00EAme si un contexte utilisateur (user-context.md) existe d\u00E9j\u00E0, tu DOIS proposer les fonctionnalit\u00E9s opt-in (especially Dashboard Mission Control sur 127.0.0.1:9123) \u2014 ne saute jamais cette \u00E9tape. Pose les 5 questions (identit\u00E9, projet, contraintes, style de collaboration, reporting), puis pr\u00E9sente la checklist des fonctionnalit\u00E9s opt-in depuis l'inventaire (OPT_IN_FEATURES). Utilise l'outil question pour les questions. Ne r\u00E9ponds pas encore \u00E0 la demande de l'utilisateur \u2014 l'adoption prime.";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kl-c/matrixos",
3
- "version": "0.1.15",
3
+ "version": "0.1.17",
4
4
  "description": "MaTrixOS — Agentic OS for OpenCode. Personalizable, communicating, self-improving, resilient.",
5
5
  "main": "./dist/index.js",
6
6
  "types": "dist/index.d.ts",