@femtomc/mu-agent 26.2.120 → 26.3.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"operator.d.ts","sourceRoot":"","sources":["../src/operator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"operator.d.ts","sourceRoot":"","sources":["../src/operator.ts"],"names":[],"mappings":"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"}
package/dist/operator.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { UiDocSchema, normalizeUiDocs } from "@femtomc/mu-core";
2
2
  import { appendJsonl, getStorePaths } from "@femtomc/mu-core/node";
3
3
  import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
4
- import { dirname, join } from "node:path";
4
+ import { dirname, isAbsolute, join } from "node:path";
5
5
  import { z } from "zod";
6
6
  import { CommandContextResolver } from "./command_context.js";
7
7
  import { createMuSession } from "./session_factory.js";
@@ -255,6 +255,71 @@ function nonEmptyString(value) {
255
255
  const trimmed = value.trim();
256
256
  return trimmed.length > 0 ? trimmed : null;
257
257
  }
258
+ function autonomousSessionIdOverride(metadata) {
259
+ const source = nonEmptyString(metadata.source);
260
+ if (source !== "autonomous_ingress") {
261
+ return null;
262
+ }
263
+ return nonEmptyString(metadata.operator_session_id);
264
+ }
265
+ function autonomousTurnEnvironment(metadata) {
266
+ const source = nonEmptyString(metadata.source);
267
+ if (source !== "autonomous_ingress") {
268
+ return {};
269
+ }
270
+ const out = {
271
+ MU_AUTONOMOUS_INGRESS_SOURCE: source,
272
+ };
273
+ const wakeSource = nonEmptyString(metadata.wake_source);
274
+ const wakeId = nonEmptyString(metadata.wake_id);
275
+ const programId = nonEmptyString(metadata.program_id);
276
+ const sourceTsMs = metadata.source_ts_ms;
277
+ if (wakeSource) {
278
+ out.MU_AUTONOMOUS_WAKE_SOURCE = wakeSource;
279
+ }
280
+ if (wakeId) {
281
+ out.MU_AUTONOMOUS_WAKE_ID = wakeId;
282
+ }
283
+ if (programId) {
284
+ out.MU_AUTONOMOUS_PROGRAM_ID = programId;
285
+ }
286
+ if (typeof sourceTsMs === "number" && Number.isFinite(sourceTsMs)) {
287
+ out.MU_AUTONOMOUS_SOURCE_TS_MS = String(Math.trunc(sourceTsMs));
288
+ }
289
+ return out;
290
+ }
291
+ function resolveRepoPath(repoRoot, candidate) {
292
+ return isAbsolute(candidate) ? candidate : join(repoRoot, candidate);
293
+ }
294
+ function autonomousOperatorSessionOverrides(metadata, repoRoot) {
295
+ const source = nonEmptyString(metadata.source);
296
+ if (source !== "autonomous_ingress") {
297
+ return {};
298
+ }
299
+ const provider = nonEmptyString(metadata.operator_provider);
300
+ const model = nonEmptyString(metadata.operator_model);
301
+ const thinking = nonEmptyString(metadata.operator_thinking);
302
+ const sessionFileRaw = nonEmptyString(metadata.operator_session_file);
303
+ const sessionDirRaw = nonEmptyString(metadata.operator_session_dir);
304
+ const sessionFile = sessionFileRaw ? resolveRepoPath(repoRoot, sessionFileRaw) : undefined;
305
+ const sessionDir = sessionDirRaw ? resolveRepoPath(repoRoot, sessionDirRaw) : undefined;
306
+ return {
307
+ ...(provider ? { provider } : {}),
308
+ ...(model ? { model } : {}),
309
+ ...(thinking ? { thinking } : {}),
310
+ ...(sessionFile ? { sessionFile } : {}),
311
+ ...(sessionDir ? { sessionDir } : {}),
312
+ };
313
+ }
314
+ function operatorSessionProfileKey(opts) {
315
+ return JSON.stringify({
316
+ provider: opts.provider ?? null,
317
+ model: opts.model ?? null,
318
+ thinking: opts.thinking ?? null,
319
+ sessionFile: opts.sessionFile ?? null,
320
+ sessionDir: opts.sessionDir ?? null,
321
+ });
322
+ }
258
323
  function isUiToolName(toolName) {
259
324
  const normalized = toolName.trim().toLowerCase();
260
325
  return normalized === "mu_ui";
@@ -385,6 +450,10 @@ export class MessagingOperatorRuntime {
385
450
  this.#conversationSessionStore = opts.conversationSessionStore ?? null;
386
451
  }
387
452
  async #resolveSessionId(inbound, binding) {
453
+ const explicitSessionId = autonomousSessionIdOverride(inbound.metadata);
454
+ if (explicitSessionId) {
455
+ return explicitSessionId;
456
+ }
388
457
  const key = conversationKey(inbound, binding);
389
458
  const existing = this.#sessionByConversation.get(key);
390
459
  if (existing) {
@@ -629,6 +698,7 @@ export class PiMessagingOperatorBackend {
629
698
  #sessionDirForRepoRoot;
630
699
  #sessions = new Map();
631
700
  #activePromptCountsBySession = new Map();
701
+ #autonomousTurnEnvBySession = new Map();
632
702
  constructor(opts = {}) {
633
703
  this.#provider = opts.provider;
634
704
  this.#model = opts.model;
@@ -655,6 +725,7 @@ export class PiMessagingOperatorBackend {
655
725
  }
656
726
  this.#sessions.delete(sessionId);
657
727
  this.#activePromptCountsBySession.delete(sessionId);
728
+ this.#autonomousTurnEnvBySession.delete(sessionId);
658
729
  try {
659
730
  entry.session.dispose();
660
731
  }
@@ -689,10 +760,24 @@ export class PiMessagingOperatorBackend {
689
760
  }
690
761
  this.#activePromptCountsBySession.set(sessionId, current - 1);
691
762
  }
692
- #sessionPersistence(repoRoot, sessionId) {
763
+ #sessionPersistence(repoRoot, sessionId, overrides) {
693
764
  if (!this.#persistSessions) {
694
765
  return undefined;
695
766
  }
767
+ if (overrides.sessionFile) {
768
+ return {
769
+ mode: "open",
770
+ sessionDir: overrides.sessionDir,
771
+ sessionFile: overrides.sessionFile,
772
+ };
773
+ }
774
+ if (overrides.sessionDir) {
775
+ return {
776
+ mode: "open",
777
+ sessionDir: overrides.sessionDir,
778
+ sessionFile: join(overrides.sessionDir, `${sessionFileStem(sessionId)}.jsonl`),
779
+ };
780
+ }
696
781
  const sessionDir = this.#sessionDirForRepoRoot(repoRoot);
697
782
  const sessionFile = join(sessionDir, `${sessionFileStem(sessionId)}.jsonl`);
698
783
  return {
@@ -701,15 +786,40 @@ export class PiMessagingOperatorBackend {
701
786
  sessionFile,
702
787
  };
703
788
  }
704
- async #createSession(repoRoot, sessionId, nowMs) {
789
+ async #createSession(repoRoot, sessionId, nowMs, overrides) {
790
+ const provider = overrides.provider ?? this.#provider;
791
+ const model = overrides.model ?? this.#model;
792
+ const thinking = overrides.thinking ?? this.#thinking;
793
+ const profileKey = operatorSessionProfileKey({
794
+ provider,
795
+ model,
796
+ thinking,
797
+ sessionFile: overrides.sessionFile,
798
+ sessionDir: overrides.sessionDir,
799
+ });
705
800
  const session = await this.#sessionFactory({
706
801
  cwd: repoRoot,
707
802
  systemPrompt: this.#systemPrompt,
708
- provider: this.#provider,
709
- model: this.#model,
710
- thinking: this.#thinking,
803
+ provider,
804
+ model,
805
+ thinking,
711
806
  extensionPaths: this.#extensionPaths,
712
- session: this.#sessionPersistence(repoRoot, sessionId),
807
+ session: this.#sessionPersistence(repoRoot, sessionId, overrides),
808
+ bashToolOptions: {
809
+ spawnHook: (context) => {
810
+ const turnEnv = this.#autonomousTurnEnvBySession.get(sessionId);
811
+ if (!turnEnv || Object.keys(turnEnv).length === 0) {
812
+ return context;
813
+ }
814
+ return {
815
+ ...context,
816
+ env: {
817
+ ...context.env,
818
+ ...turnEnv,
819
+ },
820
+ };
821
+ },
822
+ },
713
823
  });
714
824
  await session.bindExtensions({
715
825
  commandContextActions: {
@@ -727,20 +837,28 @@ export class PiMessagingOperatorBackend {
727
837
  repoRoot,
728
838
  createdAtMs: nowMs,
729
839
  lastUsedAtMs: nowMs,
840
+ profileKey,
730
841
  };
731
842
  }
732
- async #resolveSession(sessionId, repoRoot) {
843
+ async #resolveSession(sessionId, repoRoot, overrides) {
733
844
  const nowMs = Math.trunc(this.#nowMs());
734
845
  this.#pruneSessions(nowMs);
846
+ const requestedProfileKey = operatorSessionProfileKey({
847
+ provider: overrides.provider ?? this.#provider,
848
+ model: overrides.model ?? this.#model,
849
+ thinking: overrides.thinking ?? this.#thinking,
850
+ sessionFile: overrides.sessionFile,
851
+ sessionDir: overrides.sessionDir,
852
+ });
735
853
  const existing = this.#sessions.get(sessionId);
736
- if (existing && existing.repoRoot === repoRoot) {
854
+ if (existing && existing.repoRoot === repoRoot && existing.profileKey === requestedProfileKey) {
737
855
  existing.lastUsedAtMs = nowMs;
738
856
  return existing;
739
857
  }
740
- if (existing && existing.repoRoot !== repoRoot) {
858
+ if (existing) {
741
859
  this.#disposeSession(sessionId);
742
860
  }
743
- const created = await this.#createSession(repoRoot, sessionId, nowMs);
861
+ const created = await this.#createSession(repoRoot, sessionId, nowMs, overrides);
744
862
  this.#sessions.set(sessionId, created);
745
863
  this.#pruneSessions(nowMs);
746
864
  return created;
@@ -792,11 +910,19 @@ export class PiMessagingOperatorBackend {
792
910
  }
793
911
  }
794
912
  async runTurn(input) {
795
- const sessionRecord = await this.#resolveSession(input.sessionId, input.inbound.repo_root);
913
+ const overrides = autonomousOperatorSessionOverrides(input.inbound.metadata, input.inbound.repo_root);
914
+ const sessionRecord = await this.#resolveSession(input.sessionId, input.inbound.repo_root, overrides);
796
915
  const session = sessionRecord.session;
797
916
  let assistantText = "";
798
917
  let capturedCommand = null;
799
918
  let capturedUiDocs = [];
919
+ const turnEnv = autonomousTurnEnvironment(input.inbound.metadata);
920
+ if (Object.keys(turnEnv).length > 0) {
921
+ this.#autonomousTurnEnvBySession.set(input.sessionId, turnEnv);
922
+ }
923
+ else {
924
+ this.#autonomousTurnEnvBySession.delete(input.sessionId);
925
+ }
800
926
  const unsub = session.subscribe((event) => {
801
927
  // Capture assistant text for fallback responses.
802
928
  if (event?.type === "message_end" && event?.message?.role === "assistant") {
@@ -881,6 +1007,7 @@ export class PiMessagingOperatorBackend {
881
1007
  }
882
1008
  finally {
883
1009
  this.#decrementActivePrompt(input.sessionId);
1010
+ this.#autonomousTurnEnvBySession.delete(input.sessionId);
884
1011
  unsub();
885
1012
  sessionRecord.lastUsedAtMs = Math.trunc(this.#nowMs());
886
1013
  }
@@ -1,3 +1,4 @@
1
+ import type { BashToolOptions } from "@mariozechner/pi-coding-agent";
1
2
  export type MuSessionPersistenceMode = "in-memory" | "continue-recent" | "new" | "open";
2
3
  export type MuSessionPersistenceOpts = {
3
4
  mode?: MuSessionPersistenceMode;
@@ -12,6 +13,7 @@ export type CreateMuSessionOpts = {
12
13
  thinking?: string;
13
14
  extensionPaths?: string[];
14
15
  session?: MuSessionPersistenceOpts;
16
+ bashToolOptions?: BashToolOptions;
15
17
  };
16
18
  export type MuSession = {
17
19
  subscribe: (listener: (event: any) => void) => () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"session_factory.d.ts","sourceRoot":"","sources":["../src/session_factory.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,wBAAwB,GAAG,WAAW,GAAG,iBAAiB,GAAG,KAAK,GAAG,MAAM,CAAC;AAExF,MAAM,MAAM,wBAAwB,GAAG;IACtC,IAAI,CAAC,EAAE,wBAAwB,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,wBAAwB,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACvB,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IAC1D,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,qBAAqB,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvF,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,cAAc,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE;QAChB,SAAS,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;KAChC,CAAC;CACF,CAAC;AAsCF,wBAAsB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,CAuDnF"}
1
+ {"version":3,"file":"session_factory.d.ts","sourceRoot":"","sources":["../src/session_factory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAIrE,MAAM,MAAM,wBAAwB,GAAG,WAAW,GAAG,iBAAiB,GAAG,KAAK,GAAG,MAAM,CAAC;AAExF,MAAM,MAAM,wBAAwB,GAAG;IACtC,IAAI,CAAC,EAAE,wBAAwB,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,wBAAwB,CAAC;IACnC,eAAe,CAAC,EAAE,eAAe,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACvB,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IAC1D,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,qBAAqB,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvF,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,cAAc,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE;QAChB,SAAS,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;KAChC,CAAC;CACF,CAAC;AAsCF,wBAAsB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,CAuDnF"}
@@ -46,7 +46,7 @@ export async function createMuSession(opts) {
46
46
  });
47
47
  await resourceLoader.reload();
48
48
  const tools = [
49
- createBashTool(opts.cwd),
49
+ createBashTool(opts.cwd, opts.bashToolOptions),
50
50
  createReadTool(opts.cwd),
51
51
  createWriteTool(opts.cwd),
52
52
  createEditTool(opts.cwd),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@femtomc/mu-agent",
3
- "version": "26.2.120",
3
+ "version": "26.3.2",
4
4
  "description": "Shared operator runtime for mu assistant sessions and serve extensions.",
5
5
  "keywords": [
6
6
  "mu",
@@ -24,7 +24,7 @@
24
24
  "themes/**"
25
25
  ],
26
26
  "dependencies": {
27
- "@femtomc/mu-core": "26.2.120",
27
+ "@femtomc/mu-core": "26.3.2",
28
28
  "@mariozechner/pi-agent-core": "^0.54.2",
29
29
  "@mariozechner/pi-ai": "^0.54.2",
30
30
  "@mariozechner/pi-coding-agent": "^0.54.2",