@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.
- package/dist/operator.d.ts.map +1 -1
- package/dist/operator.js +139 -12
- package/dist/session_factory.d.ts +2 -0
- package/dist/session_factory.d.ts.map +1 -1
- package/dist/session_factory.js +1 -1
- package/package.json +2 -2
package/dist/operator.d.ts.map
CHANGED
|
@@ -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
|
|
709
|
-
model
|
|
710
|
-
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
|
|
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
|
|
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":"
|
|
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"}
|
package/dist/session_factory.js
CHANGED
|
@@ -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
|
|
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
|
|
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",
|