juno-code 1.0.50 → 1.0.51

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/index.d.mts CHANGED
@@ -19,6 +19,8 @@ interface JunoTaskConfig {
19
19
  defaultSubagent: SubagentType;
20
20
  defaultMaxIterations: number;
21
21
  defaultModel?: string;
22
+ /** Optional per-subagent default model overrides */
23
+ defaultModels?: Partial<Record<SubagentType, string>>;
22
24
  defaultBackend: BackendType;
23
25
  mainTask?: string;
24
26
  logLevel: LogLevel;
@@ -91,6 +93,7 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
91
93
  defaultBackend: z.ZodEnum<["shell"]>;
92
94
  defaultMaxIterations: z.ZodNumber;
93
95
  defaultModel: z.ZodOptional<z.ZodString>;
96
+ defaultModels: z.ZodOptional<z.ZodRecord<z.ZodEnum<["claude", "cursor", "codex", "gemini", "pi"]>, z.ZodString>>;
94
97
  mainTask: z.ZodOptional<z.ZodString>;
95
98
  logLevel: z.ZodEnum<["error", "warn", "info", "debug", "trace"]>;
96
99
  logFile: z.ZodOptional<z.ZodString>;
@@ -118,9 +121,11 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
118
121
  skipHooks: z.ZodOptional<z.ZodBoolean>;
119
122
  }, "strict", z.ZodTypeAny, {
120
123
  defaultSubagent?: "claude" | "cursor" | "codex" | "gemini" | "pi";
121
- defaultBackend?: "shell";
122
- defaultMaxIterations?: number;
123
124
  defaultModel?: string;
125
+ defaultModels?: Partial<Record<"claude" | "cursor" | "codex" | "gemini" | "pi", string>>;
126
+ defaultMaxIterations?: number;
127
+ defaultBackend?: "shell";
128
+ mainTask?: string;
124
129
  logLevel?: "error" | "warn" | "info" | "debug" | "trace";
125
130
  logFile?: string;
126
131
  verbose?: number;
@@ -135,7 +140,6 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
135
140
  headlessMode?: boolean;
136
141
  workingDirectory?: string;
137
142
  sessionDirectory?: string;
138
- mainTask?: string;
139
143
  envFilePath?: string;
140
144
  envFileCopied?: boolean;
141
145
  hooks?: Partial<Record<"START_RUN" | "START_ITERATION" | "END_ITERATION" | "END_RUN" | "ON_STALE", {
@@ -144,9 +148,11 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
144
148
  skipHooks?: boolean;
145
149
  }, {
146
150
  defaultSubagent?: "claude" | "cursor" | "codex" | "gemini" | "pi";
147
- defaultBackend?: "shell";
148
- defaultMaxIterations?: number;
149
151
  defaultModel?: string;
152
+ defaultModels?: Partial<Record<"claude" | "cursor" | "codex" | "gemini" | "pi", string>>;
153
+ defaultMaxIterations?: number;
154
+ defaultBackend?: "shell";
155
+ mainTask?: string;
150
156
  logLevel?: "error" | "warn" | "info" | "debug" | "trace";
151
157
  logFile?: string;
152
158
  verbose?: unknown;
@@ -161,7 +167,6 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
161
167
  headlessMode?: boolean;
162
168
  workingDirectory?: string;
163
169
  sessionDirectory?: string;
164
- mainTask?: string;
165
170
  envFilePath?: string;
166
171
  envFileCopied?: boolean;
167
172
  hooks?: Partial<Record<"START_RUN" | "START_ITERATION" | "END_ITERATION" | "END_RUN" | "ON_STALE", {
@@ -732,6 +737,8 @@ interface ExecutionRequest {
732
737
  readonly continueConversation?: boolean;
733
738
  /** Extended thinking level (forwarded to shell backend --thinking flag) */
734
739
  readonly thinking?: string;
740
+ /** Run Pi subagent in interactive live mode (forwarded to shell backend --live flag) */
741
+ readonly live?: boolean;
735
742
  }
736
743
  /**
737
744
  * Execution result interface for completed executions
@@ -1188,6 +1195,7 @@ declare function createExecutionRequest(options: {
1188
1195
  resume?: string;
1189
1196
  continueConversation?: boolean;
1190
1197
  thinking?: string;
1198
+ live?: boolean;
1191
1199
  }): ExecutionRequest;
1192
1200
 
1193
1201
  /** Session metadata */
@@ -2026,6 +2034,7 @@ declare const ConfigValidationSchema: z.ZodObject<{
2026
2034
  defaultBackend: z.ZodEnum<["shell"]>;
2027
2035
  defaultMaxIterations: z.ZodNumber;
2028
2036
  defaultModel: z.ZodOptional<z.ZodString>;
2037
+ defaultModels: z.ZodOptional<z.ZodRecord<z.ZodEnum<["claude", "cursor", "codex", "gemini", "pi"]>, z.ZodString>>;
2029
2038
  mainTask: z.ZodOptional<z.ZodString>;
2030
2039
  logLevel: z.ZodEnum<["error", "warn", "info", "debug", "trace"]>;
2031
2040
  logFile: z.ZodOptional<z.ZodString>;
@@ -2053,9 +2062,11 @@ declare const ConfigValidationSchema: z.ZodObject<{
2053
2062
  skipHooks: z.ZodOptional<z.ZodBoolean>;
2054
2063
  }, "strict", z.ZodTypeAny, {
2055
2064
  defaultSubagent?: "claude" | "cursor" | "codex" | "gemini" | "pi";
2056
- defaultBackend?: "shell";
2057
- defaultMaxIterations?: number;
2058
2065
  defaultModel?: string;
2066
+ defaultModels?: Partial<Record<"claude" | "cursor" | "codex" | "gemini" | "pi", string>>;
2067
+ defaultMaxIterations?: number;
2068
+ defaultBackend?: "shell";
2069
+ mainTask?: string;
2059
2070
  logLevel?: "error" | "warn" | "info" | "debug" | "trace";
2060
2071
  logFile?: string;
2061
2072
  verbose?: number;
@@ -2070,7 +2081,6 @@ declare const ConfigValidationSchema: z.ZodObject<{
2070
2081
  headlessMode?: boolean;
2071
2082
  workingDirectory?: string;
2072
2083
  sessionDirectory?: string;
2073
- mainTask?: string;
2074
2084
  envFilePath?: string;
2075
2085
  envFileCopied?: boolean;
2076
2086
  hooks?: Partial<Record<"START_RUN" | "START_ITERATION" | "END_ITERATION" | "END_RUN" | "ON_STALE", {
@@ -2079,9 +2089,11 @@ declare const ConfigValidationSchema: z.ZodObject<{
2079
2089
  skipHooks?: boolean;
2080
2090
  }, {
2081
2091
  defaultSubagent?: "claude" | "cursor" | "codex" | "gemini" | "pi";
2082
- defaultBackend?: "shell";
2083
- defaultMaxIterations?: number;
2084
2092
  defaultModel?: string;
2093
+ defaultModels?: Partial<Record<"claude" | "cursor" | "codex" | "gemini" | "pi", string>>;
2094
+ defaultMaxIterations?: number;
2095
+ defaultBackend?: "shell";
2096
+ mainTask?: string;
2085
2097
  logLevel?: "error" | "warn" | "info" | "debug" | "trace";
2086
2098
  logFile?: string;
2087
2099
  verbose?: unknown;
@@ -2096,7 +2108,6 @@ declare const ConfigValidationSchema: z.ZodObject<{
2096
2108
  headlessMode?: boolean;
2097
2109
  workingDirectory?: string;
2098
2110
  sessionDirectory?: string;
2099
- mainTask?: string;
2100
2111
  envFilePath?: string;
2101
2112
  envFileCopied?: boolean;
2102
2113
  hooks?: Partial<Record<"START_RUN" | "START_ITERATION" | "END_ITERATION" | "END_RUN" | "ON_STALE", {
package/dist/index.d.ts CHANGED
@@ -19,6 +19,8 @@ interface JunoTaskConfig {
19
19
  defaultSubagent: SubagentType;
20
20
  defaultMaxIterations: number;
21
21
  defaultModel?: string;
22
+ /** Optional per-subagent default model overrides */
23
+ defaultModels?: Partial<Record<SubagentType, string>>;
22
24
  defaultBackend: BackendType;
23
25
  mainTask?: string;
24
26
  logLevel: LogLevel;
@@ -91,6 +93,7 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
91
93
  defaultBackend: z.ZodEnum<["shell"]>;
92
94
  defaultMaxIterations: z.ZodNumber;
93
95
  defaultModel: z.ZodOptional<z.ZodString>;
96
+ defaultModels: z.ZodOptional<z.ZodRecord<z.ZodEnum<["claude", "cursor", "codex", "gemini", "pi"]>, z.ZodString>>;
94
97
  mainTask: z.ZodOptional<z.ZodString>;
95
98
  logLevel: z.ZodEnum<["error", "warn", "info", "debug", "trace"]>;
96
99
  logFile: z.ZodOptional<z.ZodString>;
@@ -118,9 +121,11 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
118
121
  skipHooks: z.ZodOptional<z.ZodBoolean>;
119
122
  }, "strict", z.ZodTypeAny, {
120
123
  defaultSubagent?: "claude" | "cursor" | "codex" | "gemini" | "pi";
121
- defaultBackend?: "shell";
122
- defaultMaxIterations?: number;
123
124
  defaultModel?: string;
125
+ defaultModels?: Partial<Record<"claude" | "cursor" | "codex" | "gemini" | "pi", string>>;
126
+ defaultMaxIterations?: number;
127
+ defaultBackend?: "shell";
128
+ mainTask?: string;
124
129
  logLevel?: "error" | "warn" | "info" | "debug" | "trace";
125
130
  logFile?: string;
126
131
  verbose?: number;
@@ -135,7 +140,6 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
135
140
  headlessMode?: boolean;
136
141
  workingDirectory?: string;
137
142
  sessionDirectory?: string;
138
- mainTask?: string;
139
143
  envFilePath?: string;
140
144
  envFileCopied?: boolean;
141
145
  hooks?: Partial<Record<"START_RUN" | "START_ITERATION" | "END_ITERATION" | "END_RUN" | "ON_STALE", {
@@ -144,9 +148,11 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
144
148
  skipHooks?: boolean;
145
149
  }, {
146
150
  defaultSubagent?: "claude" | "cursor" | "codex" | "gemini" | "pi";
147
- defaultBackend?: "shell";
148
- defaultMaxIterations?: number;
149
151
  defaultModel?: string;
152
+ defaultModels?: Partial<Record<"claude" | "cursor" | "codex" | "gemini" | "pi", string>>;
153
+ defaultMaxIterations?: number;
154
+ defaultBackend?: "shell";
155
+ mainTask?: string;
150
156
  logLevel?: "error" | "warn" | "info" | "debug" | "trace";
151
157
  logFile?: string;
152
158
  verbose?: unknown;
@@ -161,7 +167,6 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
161
167
  headlessMode?: boolean;
162
168
  workingDirectory?: string;
163
169
  sessionDirectory?: string;
164
- mainTask?: string;
165
170
  envFilePath?: string;
166
171
  envFileCopied?: boolean;
167
172
  hooks?: Partial<Record<"START_RUN" | "START_ITERATION" | "END_ITERATION" | "END_RUN" | "ON_STALE", {
@@ -732,6 +737,8 @@ interface ExecutionRequest {
732
737
  readonly continueConversation?: boolean;
733
738
  /** Extended thinking level (forwarded to shell backend --thinking flag) */
734
739
  readonly thinking?: string;
740
+ /** Run Pi subagent in interactive live mode (forwarded to shell backend --live flag) */
741
+ readonly live?: boolean;
735
742
  }
736
743
  /**
737
744
  * Execution result interface for completed executions
@@ -1188,6 +1195,7 @@ declare function createExecutionRequest(options: {
1188
1195
  resume?: string;
1189
1196
  continueConversation?: boolean;
1190
1197
  thinking?: string;
1198
+ live?: boolean;
1191
1199
  }): ExecutionRequest;
1192
1200
 
1193
1201
  /** Session metadata */
@@ -2026,6 +2034,7 @@ declare const ConfigValidationSchema: z.ZodObject<{
2026
2034
  defaultBackend: z.ZodEnum<["shell"]>;
2027
2035
  defaultMaxIterations: z.ZodNumber;
2028
2036
  defaultModel: z.ZodOptional<z.ZodString>;
2037
+ defaultModels: z.ZodOptional<z.ZodRecord<z.ZodEnum<["claude", "cursor", "codex", "gemini", "pi"]>, z.ZodString>>;
2029
2038
  mainTask: z.ZodOptional<z.ZodString>;
2030
2039
  logLevel: z.ZodEnum<["error", "warn", "info", "debug", "trace"]>;
2031
2040
  logFile: z.ZodOptional<z.ZodString>;
@@ -2053,9 +2062,11 @@ declare const ConfigValidationSchema: z.ZodObject<{
2053
2062
  skipHooks: z.ZodOptional<z.ZodBoolean>;
2054
2063
  }, "strict", z.ZodTypeAny, {
2055
2064
  defaultSubagent?: "claude" | "cursor" | "codex" | "gemini" | "pi";
2056
- defaultBackend?: "shell";
2057
- defaultMaxIterations?: number;
2058
2065
  defaultModel?: string;
2066
+ defaultModels?: Partial<Record<"claude" | "cursor" | "codex" | "gemini" | "pi", string>>;
2067
+ defaultMaxIterations?: number;
2068
+ defaultBackend?: "shell";
2069
+ mainTask?: string;
2059
2070
  logLevel?: "error" | "warn" | "info" | "debug" | "trace";
2060
2071
  logFile?: string;
2061
2072
  verbose?: number;
@@ -2070,7 +2081,6 @@ declare const ConfigValidationSchema: z.ZodObject<{
2070
2081
  headlessMode?: boolean;
2071
2082
  workingDirectory?: string;
2072
2083
  sessionDirectory?: string;
2073
- mainTask?: string;
2074
2084
  envFilePath?: string;
2075
2085
  envFileCopied?: boolean;
2076
2086
  hooks?: Partial<Record<"START_RUN" | "START_ITERATION" | "END_ITERATION" | "END_RUN" | "ON_STALE", {
@@ -2079,9 +2089,11 @@ declare const ConfigValidationSchema: z.ZodObject<{
2079
2089
  skipHooks?: boolean;
2080
2090
  }, {
2081
2091
  defaultSubagent?: "claude" | "cursor" | "codex" | "gemini" | "pi";
2082
- defaultBackend?: "shell";
2083
- defaultMaxIterations?: number;
2084
2092
  defaultModel?: string;
2093
+ defaultModels?: Partial<Record<"claude" | "cursor" | "codex" | "gemini" | "pi", string>>;
2094
+ defaultMaxIterations?: number;
2095
+ defaultBackend?: "shell";
2096
+ mainTask?: string;
2085
2097
  logLevel?: "error" | "warn" | "info" | "debug" | "trace";
2086
2098
  logFile?: string;
2087
2099
  verbose?: unknown;
@@ -2096,7 +2108,6 @@ declare const ConfigValidationSchema: z.ZodObject<{
2096
2108
  headlessMode?: boolean;
2097
2109
  workingDirectory?: string;
2098
2110
  sessionDirectory?: string;
2099
- mainTask?: string;
2100
2111
  envFilePath?: string;
2101
2112
  envFileCopied?: boolean;
2102
2113
  hooks?: Partial<Record<"START_RUN" | "START_ITERATION" | "END_ITERATION" | "END_RUN" | "ON_STALE", {
package/dist/index.js CHANGED
@@ -62,7 +62,7 @@ var __export = (target, all) => {
62
62
  exports.version = void 0;
63
63
  var init_version = __esm({
64
64
  "src/version.ts"() {
65
- exports.version = "1.0.50";
65
+ exports.version = "1.0.51";
66
66
  }
67
67
  });
68
68
 
@@ -1025,6 +1025,9 @@ var init_shell_backend = __esm({
1025
1025
  if (isPython && subagentType === "pi" && request.arguments?.project_path) {
1026
1026
  args.push("--cd", String(request.arguments.project_path));
1027
1027
  }
1028
+ if (isPython && subagentType === "pi" && request.arguments?.live === true) {
1029
+ args.push("--live");
1030
+ }
1028
1031
  if (isPython && this.config.debug) {
1029
1032
  args.push("--verbose");
1030
1033
  }
@@ -1042,12 +1045,19 @@ var init_shell_backend = __esm({
1042
1045
  `Environment variables: ${Object.keys(env2).filter((k) => k.startsWith("JUNO_") || k.startsWith("PI_")).join(", ")}`
1043
1046
  );
1044
1047
  }
1048
+ const isPiLiveMode = isPython && subagentType === "pi" && request.arguments?.live === true;
1049
+ const shouldAttachLiveTerminal = isPiLiveMode && process.stdout.isTTY === true;
1050
+ if (this.config.debug && isPiLiveMode) {
1051
+ engineLogger.debug(
1052
+ `Pi live mode stdio: ${shouldAttachLiveTerminal ? "inherit (interactive TTY or stdout-tty fallback)" : "pipe (headless/non-TTY)"}`
1053
+ );
1054
+ }
1045
1055
  const child = child_process.spawn(command, args, {
1046
1056
  env: env2,
1047
1057
  cwd: this.config.workingDirectory,
1048
- stdio: ["pipe", "pipe", "pipe"]
1058
+ stdio: shouldAttachLiveTerminal ? "inherit" : ["pipe", "pipe", "pipe"]
1049
1059
  });
1050
- if (child.stdin) {
1060
+ if (!shouldAttachLiveTerminal && child.stdin) {
1051
1061
  child.stdin.end();
1052
1062
  }
1053
1063
  let stdout2 = "";
@@ -1735,6 +1745,16 @@ function getDefaultHooksJson(indent = 2) {
1735
1745
  return JSON.stringify(DEFAULT_HOOKS, null, indent);
1736
1746
  }
1737
1747
 
1748
+ // src/core/subagent-models.ts
1749
+ init_version();
1750
+ var SUBAGENT_DEFAULT_MODELS = {
1751
+ claude: ":sonnet",
1752
+ codex: ":codex",
1753
+ gemini: ":pro",
1754
+ cursor: "auto",
1755
+ pi: ":pi"
1756
+ };
1757
+
1738
1758
  // src/core/config.ts
1739
1759
  var ENV_VAR_MAPPING = {
1740
1760
  // Core settings
@@ -1784,6 +1804,7 @@ var JunoTaskConfigSchema = zod.z.object({
1784
1804
  defaultBackend: BackendTypeSchema.describe("Default backend to use for task execution"),
1785
1805
  defaultMaxIterations: zod.z.number().int().min(1).max(1e3).describe("Default maximum number of iterations for task execution"),
1786
1806
  defaultModel: zod.z.string().optional().describe("Default model to use for the subagent"),
1807
+ defaultModels: zod.z.record(SubagentTypeSchema, zod.z.string()).optional().describe("Optional per-subagent default model overrides"),
1787
1808
  // Project metadata
1788
1809
  mainTask: zod.z.string().optional().describe("Main task objective for the project"),
1789
1810
  // Logging settings
@@ -1839,6 +1860,7 @@ var DEFAULT_CONFIG = {
1839
1860
  defaultSubagent: "claude",
1840
1861
  defaultBackend: "shell",
1841
1862
  defaultMaxIterations: 1,
1863
+ defaultModels: { ...SUBAGENT_DEFAULT_MODELS },
1842
1864
  // Logging settings
1843
1865
  logLevel: "info",
1844
1866
  verbose: 1,
@@ -2154,7 +2176,7 @@ function parseEnvFileContent(content) {
2154
2176
  const quote = value[0];
2155
2177
  value = value.slice(1, -1);
2156
2178
  if (quote === '"') {
2157
- value = value.replace(/\\n/g, "\n").replace(/\\r/g, "\r").replace(/\\t/g, " ");
2179
+ value = value.replace(/\\n/g, "\n").replace(/\\r/g, "\r").replace(/\\t/g, " ").replace(/\\"/g, '"').replace(/\\\\/g, "\\");
2158
2180
  }
2159
2181
  } else {
2160
2182
  const inlineCommentIndex = value.indexOf(" #");
@@ -2243,13 +2265,16 @@ async function ensureHooksConfig(baseDir) {
2243
2265
  }
2244
2266
  if (!existingConfig.defaultModel) {
2245
2267
  const subagent = existingConfig.defaultSubagent || "claude";
2246
- const modelDefaults = {
2247
- claude: ":sonnet",
2248
- codex: ":codex",
2249
- gemini: ":pro",
2250
- cursor: "auto"
2251
- };
2252
- existingConfig.defaultModel = modelDefaults[subagent] || ":sonnet";
2268
+ existingConfig.defaultModel = SUBAGENT_DEFAULT_MODELS[subagent] || SUBAGENT_DEFAULT_MODELS.claude;
2269
+ needsUpdate = true;
2270
+ }
2271
+ if (!existingConfig.defaultModels || typeof existingConfig.defaultModels !== "object" || Array.isArray(existingConfig.defaultModels)) {
2272
+ const baseDefaults = { ...SUBAGENT_DEFAULT_MODELS };
2273
+ const subagent = existingConfig.defaultSubagent || "claude";
2274
+ if (typeof existingConfig.defaultModel === "string") {
2275
+ baseDefaults[subagent] = existingConfig.defaultModel;
2276
+ }
2277
+ existingConfig.defaultModels = baseDefaults;
2253
2278
  needsUpdate = true;
2254
2279
  }
2255
2280
  if (existingConfig.defaultMaxIterations === 50) {
@@ -3122,6 +3147,7 @@ var ExecutionEngine = class extends events.EventEmitter {
3122
3147
  continueConversation: context.request.continueConversation
3123
3148
  },
3124
3149
  ...context.request.thinking !== void 0 && { thinking: context.request.thinking },
3150
+ ...context.request.live !== void 0 && { live: context.request.live },
3125
3151
  iteration: iterationNumber
3126
3152
  },
3127
3153
  timeout: context.request.timeoutMs || this.engineConfig.config.mcpTimeout,
@@ -3717,6 +3743,9 @@ function createExecutionRequest(options) {
3717
3743
  if (options.thinking !== void 0) {
3718
3744
  result.thinking = options.thinking;
3719
3745
  }
3746
+ if (options.live !== void 0) {
3747
+ result.live = options.live;
3748
+ }
3720
3749
  return result;
3721
3750
  }
3722
3751