mu-agent 0.1.0 → 0.1.3

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/kyrn/bin/mu.mjs CHANGED
@@ -102,7 +102,10 @@ export function usage(platform) {
102
102
  " mu -c | -r continue the last session | pick one to resume",
103
103
  " mu judge <cmd> the local judge (Laya): setup | start | stop | status | run",
104
104
  " mu ledger [n] [--json] what the judge decided in the last n sessions",
105
+ " mu import --list | <file>... bring Claude Code and Codex conversations into mu (mu import --help)",
105
106
  " mu doctor check the installation",
107
+ " mu auth <cmd> subscription sign-in for the desktop app, as JSON lines:",
108
+ " status | login <provider> | logout <provider>",
106
109
  ` mu link | unlink put the \`mu\` command on your PATH (${linkDir}) | remove it`,
107
110
  " mu migrate [--dry-run] once: move the home from before the rename, ~/.kyrn, to ~/.mu",
108
111
  " mu help | version",
@@ -313,12 +316,14 @@ export function layoutOf({ root, platform, exists }) {
313
316
  return exists(path.join(root, "dist", "bundle", "cli.js")) ? "package" : "repo";
314
317
  }
315
318
 
316
- /** The two files the npm package runs. */
319
+ /** The files the npm package runs: pi, the judgment layer, the sign-in of `mu auth` and the importer of `mu import`. */
317
320
  export function packageEntries({ root, platform }) {
318
321
  const path = pathFor(platform);
319
322
  return {
320
323
  cli: path.join(root, "dist", "bundle", "cli.js"),
321
324
  extension: path.join(root, "judge", "dist", "kyrn-judge.js"),
325
+ auth: path.join(root, "judge", "dist", "auth.js"),
326
+ import: path.join(root, "judge", "dist", "import.js"),
322
327
  };
323
328
  }
324
329
 
@@ -505,6 +510,43 @@ export function planLaunch({ platform, env, argv, root, home, execPath, fs, canE
505
510
  };
506
511
  }
507
512
 
513
+ // ---------------------------------------------------------------------------------------------------------
514
+ // mu auth
515
+ // ---------------------------------------------------------------------------------------------------------
516
+
517
+ /** What `mu auth` answers itself. Every other `auth` command (check, print-api-key, ...) is pi's own. */
518
+ export const AUTH_COMMANDS = ["status", "login", "logout"];
519
+
520
+ /**
521
+ * `mu auth status | login <provider> | logout <provider>`: the sign-in the desktop app runs, with pi's own OAuth
522
+ * flows and credential store (packages/kyrn-judge/src/auth). It is pi's code, so it runs the way pi does here:
523
+ * through tsx in a checkout, built in the package. It reads no key, so no .env is read for it.
524
+ */
525
+ export function planAuth({ platform, env, argv, root, home, execPath, fs, canExec = false }) {
526
+ const path = pathFor(platform);
527
+ let entry;
528
+ if (layoutOf({ root, platform, exists: fs.exists }) === "package") {
529
+ const { auth } = packageEntries({ root, platform });
530
+ if (!fs.exists(auth)) {
531
+ return { error: `This mu-agent package is incomplete (${auth} is missing). Reinstall it: npm i -g mu-agent` };
532
+ }
533
+ entry = [auth];
534
+ } else {
535
+ const tsx = resolveTsx({ root, platform, exists: fs.exists, readFile: fs.readFile });
536
+ if (!tsx) return { error: installHint({ root, platform }) };
537
+ const main = path.join(root, "packages", "kyrn-judge", "src", "auth", "main.ts");
538
+ entry = [tsx, "--tsconfig", path.join(root, "tsconfig.json"), main];
539
+ }
540
+ const agentDir = agentDirFor({ env, muDir: muHome({ home, platform, isDir: fs.isDir }), platform });
541
+ const childEnv = {};
542
+ for (const [key, value] of Object.entries(env)) {
543
+ if (typeof value === "string") childEnv[key] = value;
544
+ }
545
+ childEnv.MU_AGENT_DIR = agentDir;
546
+ const strategy = launchStrategy({ platform, env, canExec });
547
+ return { command: execPath, args: [...entry, ...argv], env: childEnv, strategy, agentDir };
548
+ }
549
+
508
550
  // ---------------------------------------------------------------------------------------------------------
509
551
  // mu judge
510
552
  // ---------------------------------------------------------------------------------------------------------
@@ -518,6 +560,44 @@ export function planJudge({ platform, env, argv, bin, wsl = false }) {
518
560
  return { kind: "unsupported", message: support.message };
519
561
  }
520
562
 
563
+ // ---------------------------------------------------------------------------------------------------------
564
+ // mu import
565
+ // ---------------------------------------------------------------------------------------------------------
566
+
567
+ /**
568
+ * `mu import`: Claude Code and Codex conversations into mu's sessions (packages/kyrn-judge/src/import). The importer
569
+ * needs nothing but Node: the npm package runs its build, judge/dist/import.js, and a checkout its TypeScript with
570
+ * Node's own type stripping (on by default from 22.18). A runtime that does not strip types (`stripsTypes` false;
571
+ * an Electron that runs mu as Node may not) takes the sources through tsx, as pi runs in a checkout.
572
+ */
573
+ export function planImport({ platform, env, argv, root, home, execPath, fs, stripsTypes = true }) {
574
+ const path = pathFor(platform);
575
+ let entry;
576
+ if (layoutOf({ root, platform, exists: fs.exists }) === "package") {
577
+ const built = packageEntries({ root, platform }).import;
578
+ if (!fs.exists(built)) {
579
+ return { error: `This mu-agent package has no mu import (${built} is missing). Update it: npm i -g mu-agent` };
580
+ }
581
+ entry = [built];
582
+ } else {
583
+ const source = path.join(root, "packages", "kyrn-judge", "src", "import", "cli.ts");
584
+ if (!fs.exists(source)) return { error: `mu import is missing from this checkout (${source})` };
585
+ if (stripsTypes) entry = ["--disable-warning=ExperimentalWarning", source];
586
+ else {
587
+ const tsx = resolveTsx({ root, platform, exists: fs.exists, readFile: fs.readFile });
588
+ if (!tsx) return { error: installHint({ root, platform }) };
589
+ entry = [tsx, "--tsconfig", path.join(root, "tsconfig.json"), source];
590
+ }
591
+ }
592
+ const agentDir = agentDirFor({ env, muDir: muHome({ home, platform, isDir: fs.isDir }), platform });
593
+ const childEnv = {};
594
+ for (const [key, value] of Object.entries(env)) if (typeof value === "string") childEnv[key] = value;
595
+ childEnv.MU_CODING_AGENT_DIR = agentDir;
596
+ childEnv.KYRN_CODING_AGENT_DIR = agentDir;
597
+ childEnv.PI_CODING_AGENT_DIR = agentDir;
598
+ return { command: execPath, args: [...entry, ...argv], env: childEnv, agentDir };
599
+ }
600
+
521
601
  // ---------------------------------------------------------------------------------------------------------
522
602
  // mu link | unlink
523
603
  // ---------------------------------------------------------------------------------------------------------
@@ -958,6 +1038,26 @@ export async function main(argv = process.argv.slice(2)) {
958
1038
  out(usage(platform));
959
1039
  return 0;
960
1040
  }
1041
+ if (command === "auth" && AUTH_COMMANDS.includes(rest[0])) {
1042
+ const plan = planAuth({
1043
+ platform,
1044
+ env,
1045
+ argv: rest,
1046
+ root,
1047
+ home,
1048
+ execPath: process.execPath,
1049
+ canExec,
1050
+ fs: { exists: existsSync, isDir, readFile: readText },
1051
+ });
1052
+ if (plan.error) {
1053
+ // The one reader is the desktop app, which reads stdout line by line.
1054
+ out(JSON.stringify({ type: "error", message: plan.error }));
1055
+ return 1;
1056
+ }
1057
+ // A fresh home has no agent folder yet, and the credential store is written into it.
1058
+ mkdirSync(plan.agentDir, { recursive: true });
1059
+ return handOver(plan);
1060
+ }
961
1061
  if (command === "migrate") {
962
1062
  return migrate({
963
1063
  platform,
@@ -1007,6 +1107,23 @@ export async function main(argv = process.argv.slice(2)) {
1007
1107
  if (command === "ledger") {
1008
1108
  return handOver({ command: process.execPath, args: [path.join(bin, "kyrn-ledger"), ...rest], env, strategy });
1009
1109
  }
1110
+ if (command === "import") {
1111
+ const plan = planImport({
1112
+ platform,
1113
+ env,
1114
+ argv: rest,
1115
+ root,
1116
+ home,
1117
+ execPath: process.execPath,
1118
+ stripsTypes: Boolean(process.features.typescript),
1119
+ fs: { exists: existsSync, isDir, readFile: readText },
1120
+ });
1121
+ if (plan.error) {
1122
+ err(plan.error);
1123
+ return 1;
1124
+ }
1125
+ return handOver({ command: plan.command, args: plan.args, env: plan.env, strategy });
1126
+ }
1010
1127
  if (command === "doctor") {
1011
1128
  const link = linkPath({ platform, env, home });
1012
1129
  return handOver({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mu-agent",
3
- "version": "0.1.0",
3
+ "version": "0.1.3",
4
4
  "description": "mu: a coding agent that thinks before it acts. A small, fast judge makes the routine calls; the big model keeps its attention for the work. Built on pi.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -20,13 +20,13 @@
20
20
  "judge",
21
21
  "pi"
22
22
  ],
23
- "homepage": "https://github.com/qybaihe/MU",
23
+ "homepage": "https://github.com/qybaihe/mu",
24
24
  "repository": {
25
25
  "type": "git",
26
- "url": "git+https://github.com/qybaihe/MU.git"
26
+ "url": "git+https://github.com/qybaihe/mu.git"
27
27
  },
28
28
  "bugs": {
29
- "url": "https://github.com/qybaihe/MU/issues"
29
+ "url": "https://github.com/qybaihe/mu/issues"
30
30
  },
31
31
  "license": "MIT",
32
32
  "engines": {
@@ -40,6 +40,6 @@
40
40
  "muBuild": {
41
41
  "pi": "0.86.0",
42
42
  "judge": "0.1.0",
43
- "commit": "d5e481d01"
43
+ "commit": "4d90ca9a8"
44
44
  }
45
45
  }
@@ -1,2 +0,0 @@
1
- import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
2
- import{AgentSession,AgentSessionRuntime,ArminComponent,AssistantMessageComponent,BashExecutionComponent,BorderedLoader,BranchSummaryMessageComponent,CONFIG_DIR_NAME,CURRENT_SESSION_VERSION,CompactionSummaryMessageComponent,Container,CredentialSynchronizationError,CustomEditor,CustomMessageComponent,DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,DefaultPackageManager,DefaultResourceLoader,DynamicBorder,ExtensionEditorComponent,ExtensionInputComponent,ExtensionRunner,ExtensionSelectorComponent,FooterComponent,InteractiveMode,LoginDialogComponent,ModelRegistry,ModelRuntime,ModelSelectorComponent,OAuthSelectorComponent,ProjectTrustStore,RpcClient,SelectList,SessionManager,SessionSelectorComponent,SettingsManager,SettingsSelectorComponent,SkillInvocationMessageComponent,Theme,ThinkingSelectorComponent,ToolExecutionComponent,TreeSelectorComponent,UserMessageComponent,UserMessageSelectorComponent,VERSION,buildContextEntries,buildSessionContext,calculateContextTokens,collectEntriesForBranchSummary,compact,convertToLlm,convertToPng,copyToClipboard,createAgentSession,createAgentSessionFromServices,createAgentSessionRuntime,createAgentSessionServices,createBashTool,createBashToolDefinition,createCodingTools,createEditTool,createEditToolDefinition,createEventBus,createExtensionRuntime,createFindTool,createFindToolDefinition,createGrepTool,createGrepToolDefinition,createLocalBashOperations,createLocalPowerShellOperations,createLsTool,createLsToolDefinition,createPowerShellTool,createPowerShellToolDefinition,createReadOnlyTools,createReadTool,createReadToolDefinition,createSyntheticSourceInfo,createWriteTool,createWriteToolDefinition,defineTool,detectSupportedImageMimeTypeFromFile,discoverAndLoadExtensions,estimateTokens,findCutPoint,findTurnStartIndex,formatDimensionNote,formatSize,formatSkillsForPrompt,generateBranchSummary,generateDiffString,generateSummary,generateSummaryWithUsage,generateUnifiedPatch,getAgentDir,getAvailableThemes,getDocsPath,getExamplesPath,getLanguageFromPath,getLastAssistantUsage,getLatestCompactionEntry,getMarkdownTheme,getPackageDir,getPowerShellConfig,getReadmePath,getSelectListTheme,getSettingsListTheme,getShellConfig,hasTrustRequiringProjectResources,highlightCode,initTheme,isBashToolResult,isEditToolResult,isFindToolResult,isGrepToolResult,isLsToolResult,isPowerShellToolResult,isReadToolResult,isToolCallEventType,isWriteToolResult,keyHint,keyText,loadProjectContextFiles,loadSkills,loadSkillsFromDir,main,migrateSessionEntries,parseArgs,parseFrontmatter,parseSessionEntries,parseSkillBlock,prepareBranchEntries,rawKeyHint,readStoredCredential,renderDiff,resizeImage,resolveCliModel,resolveModelScopeWithDiagnostics,runPrintMode,runRpcMode,serializeConversation,sessionEntryToContextMessages,shouldCompact,stripFrontmatter,truncateHead,truncateLine,truncateTail,truncateToVisualLines,withFileMutationQueue,wrapRegisteredTool,wrapRegisteredTools}from"./chunk-QB4HYZZE.js";import{__export}from"./chunk-4L3WN2XY.js";var dist_exports={};__export(dist_exports,{AgentSession:()=>AgentSession,AgentSessionRuntime:()=>AgentSessionRuntime,ArminComponent:()=>ArminComponent,AssistantMessageComponent:()=>AssistantMessageComponent,BashExecutionComponent:()=>BashExecutionComponent,BorderedLoader:()=>BorderedLoader,BranchSummaryMessageComponent:()=>BranchSummaryMessageComponent,CONFIG_DIR_NAME:()=>CONFIG_DIR_NAME,CURRENT_SESSION_VERSION:()=>CURRENT_SESSION_VERSION,CompactionSummaryMessageComponent:()=>CompactionSummaryMessageComponent,CredentialSynchronizationError:()=>CredentialSynchronizationError,CustomEditor:()=>CustomEditor,CustomMessageComponent:()=>CustomMessageComponent,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES,DefaultPackageManager:()=>DefaultPackageManager,DefaultResourceLoader:()=>DefaultResourceLoader,DynamicBorder:()=>DynamicBorder,ExtensionEditorComponent:()=>ExtensionEditorComponent,ExtensionInputComponent:()=>ExtensionInputComponent,ExtensionRunner:()=>ExtensionRunner,ExtensionSelectorComponent:()=>ExtensionSelectorComponent,FooterComponent:()=>FooterComponent,InteractiveMode:()=>InteractiveMode,LoginDialogComponent:()=>LoginDialogComponent,ModelRegistry:()=>ModelRegistry,ModelRuntime:()=>ModelRuntime,ModelSelectorComponent:()=>ModelSelectorComponent,OAuthSelectorComponent:()=>OAuthSelectorComponent,ProjectTrustStore:()=>ProjectTrustStore,RpcClient:()=>RpcClient,SessionManager:()=>SessionManager,SessionSelectorComponent:()=>SessionSelectorComponent,SettingsManager:()=>SettingsManager,SettingsSelectorComponent:()=>SettingsSelectorComponent,ShowImagesSelectorComponent:()=>ShowImagesSelectorComponent,SkillInvocationMessageComponent:()=>SkillInvocationMessageComponent,Theme:()=>Theme,ThemeSelectorComponent:()=>ThemeSelectorComponent,ThinkingSelectorComponent:()=>ThinkingSelectorComponent,ToolExecutionComponent:()=>ToolExecutionComponent,TreeSelectorComponent:()=>TreeSelectorComponent,UserMessageComponent:()=>UserMessageComponent,UserMessageSelectorComponent:()=>UserMessageSelectorComponent,VERSION:()=>VERSION,buildContextEntries:()=>buildContextEntries,buildSessionContext:()=>buildSessionContext,calculateContextTokens:()=>calculateContextTokens,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary,compact:()=>compact,convertToLlm:()=>convertToLlm,convertToPng:()=>convertToPng,copyToClipboard:()=>copyToClipboard,createAgentSession:()=>createAgentSession,createAgentSessionFromServices:()=>createAgentSessionFromServices,createAgentSessionRuntime:()=>createAgentSessionRuntime,createAgentSessionServices:()=>createAgentSessionServices,createBashTool:()=>createBashTool,createBashToolDefinition:()=>createBashToolDefinition,createCodingTools:()=>createCodingTools,createEditTool:()=>createEditTool,createEditToolDefinition:()=>createEditToolDefinition,createEventBus:()=>createEventBus,createExtensionRuntime:()=>createExtensionRuntime,createFindTool:()=>createFindTool,createFindToolDefinition:()=>createFindToolDefinition,createGrepTool:()=>createGrepTool,createGrepToolDefinition:()=>createGrepToolDefinition,createLocalBashOperations:()=>createLocalBashOperations,createLocalPowerShellOperations:()=>createLocalPowerShellOperations,createLsTool:()=>createLsTool,createLsToolDefinition:()=>createLsToolDefinition,createPowerShellTool:()=>createPowerShellTool,createPowerShellToolDefinition:()=>createPowerShellToolDefinition,createReadOnlyTools:()=>createReadOnlyTools,createReadTool:()=>createReadTool,createReadToolDefinition:()=>createReadToolDefinition,createSyntheticSourceInfo:()=>createSyntheticSourceInfo,createWriteTool:()=>createWriteTool,createWriteToolDefinition:()=>createWriteToolDefinition,defineTool:()=>defineTool,detectSupportedImageMimeTypeFromFile:()=>detectSupportedImageMimeTypeFromFile,discoverAndLoadExtensions:()=>discoverAndLoadExtensions,estimateTokens:()=>estimateTokens,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatDimensionNote:()=>formatDimensionNote,formatSize:()=>formatSize,formatSkillsForPrompt:()=>formatSkillsForPrompt,generateBranchSummary:()=>generateBranchSummary,generateDiffString:()=>generateDiffString,generateSummary:()=>generateSummary,generateSummaryWithUsage:()=>generateSummaryWithUsage,generateUnifiedPatch:()=>generateUnifiedPatch,getAgentDir:()=>getAgentDir,getDocsPath:()=>getDocsPath,getExamplesPath:()=>getExamplesPath,getLanguageFromPath:()=>getLanguageFromPath,getLastAssistantUsage:()=>getLastAssistantUsage,getLatestCompactionEntry:()=>getLatestCompactionEntry,getMarkdownTheme:()=>getMarkdownTheme,getPackageDir:()=>getPackageDir,getPowerShellConfig:()=>getPowerShellConfig,getReadmePath:()=>getReadmePath,getSelectListTheme:()=>getSelectListTheme,getSettingsListTheme:()=>getSettingsListTheme,getShellConfig:()=>getShellConfig,hasTrustRequiringProjectResources:()=>hasTrustRequiringProjectResources,highlightCode:()=>highlightCode,initTheme:()=>initTheme,isBashToolResult:()=>isBashToolResult,isEditToolResult:()=>isEditToolResult,isFindToolResult:()=>isFindToolResult,isGrepToolResult:()=>isGrepToolResult,isLsToolResult:()=>isLsToolResult,isPowerShellToolResult:()=>isPowerShellToolResult,isReadToolResult:()=>isReadToolResult,isToolCallEventType:()=>isToolCallEventType,isWriteToolResult:()=>isWriteToolResult,keyHint:()=>keyHint,keyText:()=>keyText,loadProjectContextFiles:()=>loadProjectContextFiles,loadSkills:()=>loadSkills,loadSkillsFromDir:()=>loadSkillsFromDir,main:()=>main,migrateSessionEntries:()=>migrateSessionEntries,parseArgs:()=>parseArgs,parseFrontmatter:()=>parseFrontmatter,parseSessionEntries:()=>parseSessionEntries,parseSkillBlock:()=>parseSkillBlock,prepareBranchEntries:()=>prepareBranchEntries,rawKeyHint:()=>rawKeyHint,readStoredCredential:()=>readStoredCredential,renderDiff:()=>renderDiff,resizeImage:()=>resizeImage,resolveCliModel:()=>resolveCliModel,resolveModelScopeWithDiagnostics:()=>resolveModelScopeWithDiagnostics,runPrintMode:()=>runPrintMode,runRpcMode:()=>runRpcMode,serializeConversation:()=>serializeConversation,sessionEntryToContextMessages:()=>sessionEntryToContextMessages,shouldCompact:()=>shouldCompact,stripFrontmatter:()=>stripFrontmatter,truncateHead:()=>truncateHead,truncateLine:()=>truncateLine,truncateTail:()=>truncateTail,truncateToVisualLines:()=>truncateToVisualLines,withFileMutationQueue:()=>withFileMutationQueue,wrapRegisteredTool:()=>wrapRegisteredTool,wrapRegisteredTools:()=>wrapRegisteredTools});var SHOW_IMAGES_SELECT_LIST_LAYOUT={minPrimaryColumnWidth:12,maxPrimaryColumnWidth:32},ShowImagesSelectorComponent=class extends Container{selectList;constructor(currentValue,onSelect,onCancel){super();let items=[{value:"yes",label:"Yes",description:"Show images inline in terminal"},{value:"no",label:"No",description:"Show text placeholder instead"}];this.addChild(new DynamicBorder),this.selectList=new SelectList(items,5,getSelectListTheme(),SHOW_IMAGES_SELECT_LIST_LAYOUT),this.selectList.setSelectedIndex(currentValue?0:1),this.selectList.onSelect=item=>{onSelect(item.value==="yes")},this.selectList.onCancel=()=>{onCancel()},this.addChild(this.selectList),this.addChild(new DynamicBorder)}getSelectList(){return this.selectList}};var THEME_SELECT_LIST_LAYOUT={minPrimaryColumnWidth:12,maxPrimaryColumnWidth:32},ThemeSelectorComponent=class extends Container{selectList;onPreview;constructor(currentTheme,onSelect,onCancel,onPreview){super(),this.onPreview=onPreview;let themes=getAvailableThemes(),themeItems=themes.map(name=>({value:name,label:name,description:name===currentTheme?"(current)":void 0}));this.addChild(new DynamicBorder),this.selectList=new SelectList(themeItems,10,getSelectListTheme(),THEME_SELECT_LIST_LAYOUT);let currentIndex=themes.indexOf(currentTheme);currentIndex!==-1&&this.selectList.setSelectedIndex(currentIndex),this.selectList.onSelect=item=>{onSelect(item.value)},this.selectList.onCancel=()=>{onCancel()},this.selectList.onSelectionChange=item=>{this.onPreview(item.value)},this.addChild(this.selectList),this.addChild(new DynamicBorder)}getSelectList(){return this.selectList}};export{ShowImagesSelectorComponent,ThemeSelectorComponent,dist_exports};