happy-coder 0.4.0 → 0.5.0

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.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chalk = require('chalk');
4
- var types$1 = require('./types-eN-YHsuj.cjs');
4
+ var types$1 = require('./types-BBpJNhIN.cjs');
5
5
  var node_crypto = require('node:crypto');
6
6
  var node_child_process = require('node:child_process');
7
7
  var node_path = require('node:path');
@@ -480,6 +480,7 @@ function messageKey(message) {
480
480
  }
481
481
  async function readSessionLog(projectDir, sessionId) {
482
482
  const expectedSessionFile = node_path.join(projectDir, `${sessionId}.jsonl`);
483
+ types$1.logger.debug(`[SESSION_SCANNER] Reading session file: ${expectedSessionFile}`);
483
484
  let file;
484
485
  try {
485
486
  file = await promises$1.readFile(expectedSessionFile, "utf-8");
@@ -1252,6 +1253,12 @@ async function claudeRemote(opts) {
1252
1253
  mcpServers: opts.mcpServers,
1253
1254
  permissionPromptToolName: opts.permissionPromptToolName,
1254
1255
  permissionMode: opts.permissionMode,
1256
+ model: opts.model,
1257
+ fallbackModel: opts.fallbackModel,
1258
+ customSystemPrompt: opts.customSystemPrompt,
1259
+ appendSystemPrompt: opts.appendSystemPrompt,
1260
+ allowedTools: opts.allowedTools,
1261
+ disallowedTools: opts.disallowedTools,
1255
1262
  executable: "node",
1256
1263
  abort: opts.signal,
1257
1264
  pathToClaudeCodeExecutable: (() => {
@@ -1261,7 +1268,7 @@ async function claudeRemote(opts) {
1261
1268
  if (opts.claudeArgs && opts.claudeArgs.length > 0) {
1262
1269
  sdkOptions.executableArgs = [...sdkOptions.executableArgs || [], ...opts.claudeArgs];
1263
1270
  }
1264
- types$1.logger.debug(`[claudeRemote] Starting query with permission mode: ${opts.permissionMode}`);
1271
+ types$1.logger.debug(`[claudeRemote] Starting query with permission mode: ${opts.permissionMode}, model: ${opts.model || "default"}, fallbackModel: ${opts.fallbackModel || "none"}, customSystemPrompt: ${opts.customSystemPrompt ? "set" : "none"}, appendSystemPrompt: ${opts.appendSystemPrompt ? "set" : "none"}, allowedTools: ${opts.allowedTools ? opts.allowedTools.join(",") : "none"}, disallowedTools: ${opts.disallowedTools ? opts.disallowedTools.join(",") : "none"}`);
1265
1272
  let message = new PushableAsyncIterable();
1266
1273
  message.push({
1267
1274
  type: "user",
@@ -1441,9 +1448,9 @@ async function startPermissionResolver(session) {
1441
1448
  if (response.approved) {
1442
1449
  types$1.logger.debug("Plan approved - injecting PLAN_FAKE_RESTART");
1443
1450
  if (response.mode && ["default", "acceptEdits", "bypassPermissions"].includes(response.mode)) {
1444
- session.queue.unshift(PLAN_FAKE_RESTART, response.mode);
1451
+ session.queue.unshift(PLAN_FAKE_RESTART, { permissionMode: response.mode });
1445
1452
  } else {
1446
- session.queue.unshift(PLAN_FAKE_RESTART, "default");
1453
+ session.queue.unshift(PLAN_FAKE_RESTART, { permissionMode: "default" });
1447
1454
  }
1448
1455
  resolve({ approved: false, reason: PLAN_FAKE_REJECT });
1449
1456
  } else {
@@ -2152,7 +2159,13 @@ async function claudeRemoteLauncher(session) {
2152
2159
  }
2153
2160
  },
2154
2161
  permissionPromptToolName: "mcp__permission__" + permissions.server.toolName,
2155
- permissionMode: messageData.mode,
2162
+ permissionMode: messageData.mode.permissionMode,
2163
+ model: messageData.mode.model,
2164
+ fallbackModel: messageData.mode.fallbackModel,
2165
+ customSystemPrompt: messageData.mode.customSystemPrompt,
2166
+ appendSystemPrompt: messageData.mode.appendSystemPrompt,
2167
+ allowedTools: messageData.mode.allowedTools,
2168
+ disallowedTools: messageData.mode.disallowedTools,
2156
2169
  onSessionFound: (sessionId) => {
2157
2170
  sdkToLogConverter.updateSessionId(sessionId);
2158
2171
  session.onSessionFound(sessionId);
@@ -2248,7 +2261,7 @@ async function loop(opts) {
2248
2261
  }
2249
2262
 
2250
2263
  var name = "happy-coder";
2251
- var version = "0.4.0";
2264
+ var version = "0.5.0";
2252
2265
  var description = "Claude Code session sharing CLI";
2253
2266
  var author = "Kirill Dubovitskiy";
2254
2267
  var license = "MIT";
@@ -2828,6 +2841,92 @@ class MessageQueue2 {
2828
2841
  }
2829
2842
  }
2830
2843
 
2844
+ function deterministicStringify(obj, options = {}) {
2845
+ const {
2846
+ undefinedBehavior = "omit",
2847
+ sortArrays = false,
2848
+ replacer,
2849
+ includeSymbols = false
2850
+ } = options;
2851
+ const seen = /* @__PURE__ */ new WeakSet();
2852
+ function processValue(value, key) {
2853
+ if (replacer && key !== void 0) {
2854
+ value = replacer(key, value);
2855
+ }
2856
+ if (value === null) return null;
2857
+ if (value === void 0) {
2858
+ switch (undefinedBehavior) {
2859
+ case "omit":
2860
+ return void 0;
2861
+ case "null":
2862
+ return null;
2863
+ case "throw":
2864
+ throw new Error(`Undefined value at key: ${key}`);
2865
+ }
2866
+ }
2867
+ if (typeof value === "boolean" || typeof value === "number" || typeof value === "string") {
2868
+ return value;
2869
+ }
2870
+ if (value instanceof Date) {
2871
+ return value.toISOString();
2872
+ }
2873
+ if (value instanceof RegExp) {
2874
+ return value.toString();
2875
+ }
2876
+ if (typeof value === "function") {
2877
+ return void 0;
2878
+ }
2879
+ if (typeof value === "symbol") {
2880
+ return includeSymbols ? value.toString() : void 0;
2881
+ }
2882
+ if (typeof value === "bigint") {
2883
+ return value.toString() + "n";
2884
+ }
2885
+ if (seen.has(value)) {
2886
+ throw new Error("Circular reference detected");
2887
+ }
2888
+ seen.add(value);
2889
+ if (Array.isArray(value)) {
2890
+ const processed2 = value.map((item, index) => processValue(item, String(index))).filter((item) => item !== void 0);
2891
+ if (sortArrays) {
2892
+ processed2.sort((a, b) => {
2893
+ const aStr = JSON.stringify(processValue(a));
2894
+ const bStr = JSON.stringify(processValue(b));
2895
+ return aStr.localeCompare(bStr);
2896
+ });
2897
+ }
2898
+ seen.delete(value);
2899
+ return processed2;
2900
+ }
2901
+ if (value.constructor === Object || value.constructor === void 0) {
2902
+ const processed2 = {};
2903
+ const keys = Object.keys(value).sort();
2904
+ for (const k of keys) {
2905
+ const processedValue = processValue(value[k], k);
2906
+ if (processedValue !== void 0) {
2907
+ processed2[k] = processedValue;
2908
+ }
2909
+ }
2910
+ seen.delete(value);
2911
+ return processed2;
2912
+ }
2913
+ try {
2914
+ const plain = { ...value };
2915
+ seen.delete(value);
2916
+ return processValue(plain, key);
2917
+ } catch {
2918
+ seen.delete(value);
2919
+ return String(value);
2920
+ }
2921
+ }
2922
+ const processed = processValue(obj);
2923
+ return JSON.stringify(processed);
2924
+ }
2925
+ function hashObject(obj, options, encoding = "hex") {
2926
+ const jsonString = deterministicStringify(obj, options);
2927
+ return crypto.createHash("sha256").update(jsonString).digest(encoding);
2928
+ }
2929
+
2831
2930
  let caffeinateProcess = null;
2832
2931
  function startCaffeinate() {
2833
2932
  if (process.platform !== "darwin") {
@@ -2991,9 +3090,15 @@ async function start(credentials, options = {}) {
2991
3090
  if (caffeinateStarted) {
2992
3091
  types$1.logger.infoDeveloper("Sleep prevention enabled (macOS)");
2993
3092
  }
2994
- const messageQueue = new MessageQueue2((mode) => mode);
3093
+ const messageQueue = new MessageQueue2((mode) => hashObject(mode));
2995
3094
  registerHandlers(session);
2996
3095
  let currentPermissionMode = options.permissionMode;
3096
+ let currentModel = options.model;
3097
+ let currentFallbackModel = void 0;
3098
+ let currentCustomSystemPrompt = void 0;
3099
+ let currentAppendSystemPrompt = void 0;
3100
+ let currentAllowedTools = void 0;
3101
+ let currentDisallowedTools = void 0;
2997
3102
  session.onUserMessage((message) => {
2998
3103
  let messagePermissionMode = currentPermissionMode;
2999
3104
  if (message.meta?.permissionMode) {
@@ -3008,7 +3113,64 @@ async function start(credentials, options = {}) {
3008
3113
  } else {
3009
3114
  types$1.logger.debug(`[loop] User message received with no permission mode override, using current: ${currentPermissionMode}`);
3010
3115
  }
3011
- messageQueue.push(message.content.text, messagePermissionMode || "default");
3116
+ let messageModel = currentModel;
3117
+ if (message.meta?.hasOwnProperty("model")) {
3118
+ messageModel = message.meta.model || void 0;
3119
+ currentModel = messageModel;
3120
+ types$1.logger.debug(`[loop] Model updated from user message: ${messageModel || "reset to default"}`);
3121
+ } else {
3122
+ types$1.logger.debug(`[loop] User message received with no model override, using current: ${currentModel || "default"}`);
3123
+ }
3124
+ let messageCustomSystemPrompt = currentCustomSystemPrompt;
3125
+ if (message.meta?.hasOwnProperty("customSystemPrompt")) {
3126
+ messageCustomSystemPrompt = message.meta.customSystemPrompt || void 0;
3127
+ currentCustomSystemPrompt = messageCustomSystemPrompt;
3128
+ types$1.logger.debug(`[loop] Custom system prompt updated from user message: ${messageCustomSystemPrompt ? "set" : "reset to none"}`);
3129
+ } else {
3130
+ types$1.logger.debug(`[loop] User message received with no custom system prompt override, using current: ${currentCustomSystemPrompt ? "set" : "none"}`);
3131
+ }
3132
+ let messageFallbackModel = currentFallbackModel;
3133
+ if (message.meta?.hasOwnProperty("fallbackModel")) {
3134
+ messageFallbackModel = message.meta.fallbackModel || void 0;
3135
+ currentFallbackModel = messageFallbackModel;
3136
+ types$1.logger.debug(`[loop] Fallback model updated from user message: ${messageFallbackModel || "reset to none"}`);
3137
+ } else {
3138
+ types$1.logger.debug(`[loop] User message received with no fallback model override, using current: ${currentFallbackModel || "none"}`);
3139
+ }
3140
+ let messageAppendSystemPrompt = currentAppendSystemPrompt;
3141
+ if (message.meta?.hasOwnProperty("appendSystemPrompt")) {
3142
+ messageAppendSystemPrompt = message.meta.appendSystemPrompt || void 0;
3143
+ currentAppendSystemPrompt = messageAppendSystemPrompt;
3144
+ types$1.logger.debug(`[loop] Append system prompt updated from user message: ${messageAppendSystemPrompt ? "set" : "reset to none"}`);
3145
+ } else {
3146
+ types$1.logger.debug(`[loop] User message received with no append system prompt override, using current: ${currentAppendSystemPrompt ? "set" : "none"}`);
3147
+ }
3148
+ let messageAllowedTools = currentAllowedTools;
3149
+ if (message.meta?.hasOwnProperty("allowedTools")) {
3150
+ messageAllowedTools = message.meta.allowedTools || void 0;
3151
+ currentAllowedTools = messageAllowedTools;
3152
+ types$1.logger.debug(`[loop] Allowed tools updated from user message: ${messageAllowedTools ? messageAllowedTools.join(", ") : "reset to none"}`);
3153
+ } else {
3154
+ types$1.logger.debug(`[loop] User message received with no allowed tools override, using current: ${currentAllowedTools ? currentAllowedTools.join(", ") : "none"}`);
3155
+ }
3156
+ let messageDisallowedTools = currentDisallowedTools;
3157
+ if (message.meta?.hasOwnProperty("disallowedTools")) {
3158
+ messageDisallowedTools = message.meta.disallowedTools || void 0;
3159
+ currentDisallowedTools = messageDisallowedTools;
3160
+ types$1.logger.debug(`[loop] Disallowed tools updated from user message: ${messageDisallowedTools ? messageDisallowedTools.join(", ") : "reset to none"}`);
3161
+ } else {
3162
+ types$1.logger.debug(`[loop] User message received with no disallowed tools override, using current: ${currentDisallowedTools ? currentDisallowedTools.join(", ") : "none"}`);
3163
+ }
3164
+ const enhancedMode = {
3165
+ permissionMode: messagePermissionMode || "default",
3166
+ model: messageModel,
3167
+ fallbackModel: messageFallbackModel,
3168
+ customSystemPrompt: messageCustomSystemPrompt,
3169
+ appendSystemPrompt: messageAppendSystemPrompt,
3170
+ allowedTools: messageAllowedTools,
3171
+ disallowedTools: messageDisallowedTools
3172
+ };
3173
+ messageQueue.push(message.content.text, enhancedMode);
3012
3174
  types$1.logger.debugLargeJson("User message pushed to queue:", message);
3013
3175
  });
3014
3176
  await loop({
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import chalk from 'chalk';
2
- import { l as logger, d as backoff, e as delay, R as RawJSONLinesSchema, c as configuration, f as encodeBase64, A as ApiClient, g as encodeBase64Url, h as decodeBase64, j as encrypt, b as initializeConfiguration, i as initLoggerWithGlobalConfiguration } from './types-VkaGP8up.mjs';
2
+ import { l as logger, d as backoff, e as delay, R as RawJSONLinesSchema, c as configuration, f as encodeBase64, A as ApiClient, g as encodeBase64Url, h as decodeBase64, j as encrypt, b as initializeConfiguration, i as initLoggerWithGlobalConfiguration } from './types-DDjn6Ovv.mjs';
3
3
  import { randomUUID, randomBytes } from 'node:crypto';
4
4
  import { spawn, execSync } from 'node:child_process';
5
5
  import { resolve, join, dirname as dirname$1 } from 'node:path';
@@ -459,6 +459,7 @@ function messageKey(message) {
459
459
  }
460
460
  async function readSessionLog(projectDir, sessionId) {
461
461
  const expectedSessionFile = join(projectDir, `${sessionId}.jsonl`);
462
+ logger.debug(`[SESSION_SCANNER] Reading session file: ${expectedSessionFile}`);
462
463
  let file;
463
464
  try {
464
465
  file = await readFile(expectedSessionFile, "utf-8");
@@ -1231,6 +1232,12 @@ async function claudeRemote(opts) {
1231
1232
  mcpServers: opts.mcpServers,
1232
1233
  permissionPromptToolName: opts.permissionPromptToolName,
1233
1234
  permissionMode: opts.permissionMode,
1235
+ model: opts.model,
1236
+ fallbackModel: opts.fallbackModel,
1237
+ customSystemPrompt: opts.customSystemPrompt,
1238
+ appendSystemPrompt: opts.appendSystemPrompt,
1239
+ allowedTools: opts.allowedTools,
1240
+ disallowedTools: opts.disallowedTools,
1234
1241
  executable: "node",
1235
1242
  abort: opts.signal,
1236
1243
  pathToClaudeCodeExecutable: (() => {
@@ -1240,7 +1247,7 @@ async function claudeRemote(opts) {
1240
1247
  if (opts.claudeArgs && opts.claudeArgs.length > 0) {
1241
1248
  sdkOptions.executableArgs = [...sdkOptions.executableArgs || [], ...opts.claudeArgs];
1242
1249
  }
1243
- logger.debug(`[claudeRemote] Starting query with permission mode: ${opts.permissionMode}`);
1250
+ logger.debug(`[claudeRemote] Starting query with permission mode: ${opts.permissionMode}, model: ${opts.model || "default"}, fallbackModel: ${opts.fallbackModel || "none"}, customSystemPrompt: ${opts.customSystemPrompt ? "set" : "none"}, appendSystemPrompt: ${opts.appendSystemPrompt ? "set" : "none"}, allowedTools: ${opts.allowedTools ? opts.allowedTools.join(",") : "none"}, disallowedTools: ${opts.disallowedTools ? opts.disallowedTools.join(",") : "none"}`);
1244
1251
  let message = new PushableAsyncIterable();
1245
1252
  message.push({
1246
1253
  type: "user",
@@ -1420,9 +1427,9 @@ async function startPermissionResolver(session) {
1420
1427
  if (response.approved) {
1421
1428
  logger.debug("Plan approved - injecting PLAN_FAKE_RESTART");
1422
1429
  if (response.mode && ["default", "acceptEdits", "bypassPermissions"].includes(response.mode)) {
1423
- session.queue.unshift(PLAN_FAKE_RESTART, response.mode);
1430
+ session.queue.unshift(PLAN_FAKE_RESTART, { permissionMode: response.mode });
1424
1431
  } else {
1425
- session.queue.unshift(PLAN_FAKE_RESTART, "default");
1432
+ session.queue.unshift(PLAN_FAKE_RESTART, { permissionMode: "default" });
1426
1433
  }
1427
1434
  resolve({ approved: false, reason: PLAN_FAKE_REJECT });
1428
1435
  } else {
@@ -2131,7 +2138,13 @@ async function claudeRemoteLauncher(session) {
2131
2138
  }
2132
2139
  },
2133
2140
  permissionPromptToolName: "mcp__permission__" + permissions.server.toolName,
2134
- permissionMode: messageData.mode,
2141
+ permissionMode: messageData.mode.permissionMode,
2142
+ model: messageData.mode.model,
2143
+ fallbackModel: messageData.mode.fallbackModel,
2144
+ customSystemPrompt: messageData.mode.customSystemPrompt,
2145
+ appendSystemPrompt: messageData.mode.appendSystemPrompt,
2146
+ allowedTools: messageData.mode.allowedTools,
2147
+ disallowedTools: messageData.mode.disallowedTools,
2135
2148
  onSessionFound: (sessionId) => {
2136
2149
  sdkToLogConverter.updateSessionId(sessionId);
2137
2150
  session.onSessionFound(sessionId);
@@ -2227,7 +2240,7 @@ async function loop(opts) {
2227
2240
  }
2228
2241
 
2229
2242
  var name = "happy-coder";
2230
- var version = "0.4.0";
2243
+ var version = "0.5.0";
2231
2244
  var description = "Claude Code session sharing CLI";
2232
2245
  var author = "Kirill Dubovitskiy";
2233
2246
  var license = "MIT";
@@ -2807,6 +2820,92 @@ class MessageQueue2 {
2807
2820
  }
2808
2821
  }
2809
2822
 
2823
+ function deterministicStringify(obj, options = {}) {
2824
+ const {
2825
+ undefinedBehavior = "omit",
2826
+ sortArrays = false,
2827
+ replacer,
2828
+ includeSymbols = false
2829
+ } = options;
2830
+ const seen = /* @__PURE__ */ new WeakSet();
2831
+ function processValue(value, key) {
2832
+ if (replacer && key !== void 0) {
2833
+ value = replacer(key, value);
2834
+ }
2835
+ if (value === null) return null;
2836
+ if (value === void 0) {
2837
+ switch (undefinedBehavior) {
2838
+ case "omit":
2839
+ return void 0;
2840
+ case "null":
2841
+ return null;
2842
+ case "throw":
2843
+ throw new Error(`Undefined value at key: ${key}`);
2844
+ }
2845
+ }
2846
+ if (typeof value === "boolean" || typeof value === "number" || typeof value === "string") {
2847
+ return value;
2848
+ }
2849
+ if (value instanceof Date) {
2850
+ return value.toISOString();
2851
+ }
2852
+ if (value instanceof RegExp) {
2853
+ return value.toString();
2854
+ }
2855
+ if (typeof value === "function") {
2856
+ return void 0;
2857
+ }
2858
+ if (typeof value === "symbol") {
2859
+ return includeSymbols ? value.toString() : void 0;
2860
+ }
2861
+ if (typeof value === "bigint") {
2862
+ return value.toString() + "n";
2863
+ }
2864
+ if (seen.has(value)) {
2865
+ throw new Error("Circular reference detected");
2866
+ }
2867
+ seen.add(value);
2868
+ if (Array.isArray(value)) {
2869
+ const processed2 = value.map((item, index) => processValue(item, String(index))).filter((item) => item !== void 0);
2870
+ if (sortArrays) {
2871
+ processed2.sort((a, b) => {
2872
+ const aStr = JSON.stringify(processValue(a));
2873
+ const bStr = JSON.stringify(processValue(b));
2874
+ return aStr.localeCompare(bStr);
2875
+ });
2876
+ }
2877
+ seen.delete(value);
2878
+ return processed2;
2879
+ }
2880
+ if (value.constructor === Object || value.constructor === void 0) {
2881
+ const processed2 = {};
2882
+ const keys = Object.keys(value).sort();
2883
+ for (const k of keys) {
2884
+ const processedValue = processValue(value[k], k);
2885
+ if (processedValue !== void 0) {
2886
+ processed2[k] = processedValue;
2887
+ }
2888
+ }
2889
+ seen.delete(value);
2890
+ return processed2;
2891
+ }
2892
+ try {
2893
+ const plain = { ...value };
2894
+ seen.delete(value);
2895
+ return processValue(plain, key);
2896
+ } catch {
2897
+ seen.delete(value);
2898
+ return String(value);
2899
+ }
2900
+ }
2901
+ const processed = processValue(obj);
2902
+ return JSON.stringify(processed);
2903
+ }
2904
+ function hashObject(obj, options, encoding = "hex") {
2905
+ const jsonString = deterministicStringify(obj, options);
2906
+ return createHash("sha256").update(jsonString).digest(encoding);
2907
+ }
2908
+
2810
2909
  let caffeinateProcess = null;
2811
2910
  function startCaffeinate() {
2812
2911
  if (process.platform !== "darwin") {
@@ -2970,9 +3069,15 @@ async function start(credentials, options = {}) {
2970
3069
  if (caffeinateStarted) {
2971
3070
  logger.infoDeveloper("Sleep prevention enabled (macOS)");
2972
3071
  }
2973
- const messageQueue = new MessageQueue2((mode) => mode);
3072
+ const messageQueue = new MessageQueue2((mode) => hashObject(mode));
2974
3073
  registerHandlers(session);
2975
3074
  let currentPermissionMode = options.permissionMode;
3075
+ let currentModel = options.model;
3076
+ let currentFallbackModel = void 0;
3077
+ let currentCustomSystemPrompt = void 0;
3078
+ let currentAppendSystemPrompt = void 0;
3079
+ let currentAllowedTools = void 0;
3080
+ let currentDisallowedTools = void 0;
2976
3081
  session.onUserMessage((message) => {
2977
3082
  let messagePermissionMode = currentPermissionMode;
2978
3083
  if (message.meta?.permissionMode) {
@@ -2987,7 +3092,64 @@ async function start(credentials, options = {}) {
2987
3092
  } else {
2988
3093
  logger.debug(`[loop] User message received with no permission mode override, using current: ${currentPermissionMode}`);
2989
3094
  }
2990
- messageQueue.push(message.content.text, messagePermissionMode || "default");
3095
+ let messageModel = currentModel;
3096
+ if (message.meta?.hasOwnProperty("model")) {
3097
+ messageModel = message.meta.model || void 0;
3098
+ currentModel = messageModel;
3099
+ logger.debug(`[loop] Model updated from user message: ${messageModel || "reset to default"}`);
3100
+ } else {
3101
+ logger.debug(`[loop] User message received with no model override, using current: ${currentModel || "default"}`);
3102
+ }
3103
+ let messageCustomSystemPrompt = currentCustomSystemPrompt;
3104
+ if (message.meta?.hasOwnProperty("customSystemPrompt")) {
3105
+ messageCustomSystemPrompt = message.meta.customSystemPrompt || void 0;
3106
+ currentCustomSystemPrompt = messageCustomSystemPrompt;
3107
+ logger.debug(`[loop] Custom system prompt updated from user message: ${messageCustomSystemPrompt ? "set" : "reset to none"}`);
3108
+ } else {
3109
+ logger.debug(`[loop] User message received with no custom system prompt override, using current: ${currentCustomSystemPrompt ? "set" : "none"}`);
3110
+ }
3111
+ let messageFallbackModel = currentFallbackModel;
3112
+ if (message.meta?.hasOwnProperty("fallbackModel")) {
3113
+ messageFallbackModel = message.meta.fallbackModel || void 0;
3114
+ currentFallbackModel = messageFallbackModel;
3115
+ logger.debug(`[loop] Fallback model updated from user message: ${messageFallbackModel || "reset to none"}`);
3116
+ } else {
3117
+ logger.debug(`[loop] User message received with no fallback model override, using current: ${currentFallbackModel || "none"}`);
3118
+ }
3119
+ let messageAppendSystemPrompt = currentAppendSystemPrompt;
3120
+ if (message.meta?.hasOwnProperty("appendSystemPrompt")) {
3121
+ messageAppendSystemPrompt = message.meta.appendSystemPrompt || void 0;
3122
+ currentAppendSystemPrompt = messageAppendSystemPrompt;
3123
+ logger.debug(`[loop] Append system prompt updated from user message: ${messageAppendSystemPrompt ? "set" : "reset to none"}`);
3124
+ } else {
3125
+ logger.debug(`[loop] User message received with no append system prompt override, using current: ${currentAppendSystemPrompt ? "set" : "none"}`);
3126
+ }
3127
+ let messageAllowedTools = currentAllowedTools;
3128
+ if (message.meta?.hasOwnProperty("allowedTools")) {
3129
+ messageAllowedTools = message.meta.allowedTools || void 0;
3130
+ currentAllowedTools = messageAllowedTools;
3131
+ logger.debug(`[loop] Allowed tools updated from user message: ${messageAllowedTools ? messageAllowedTools.join(", ") : "reset to none"}`);
3132
+ } else {
3133
+ logger.debug(`[loop] User message received with no allowed tools override, using current: ${currentAllowedTools ? currentAllowedTools.join(", ") : "none"}`);
3134
+ }
3135
+ let messageDisallowedTools = currentDisallowedTools;
3136
+ if (message.meta?.hasOwnProperty("disallowedTools")) {
3137
+ messageDisallowedTools = message.meta.disallowedTools || void 0;
3138
+ currentDisallowedTools = messageDisallowedTools;
3139
+ logger.debug(`[loop] Disallowed tools updated from user message: ${messageDisallowedTools ? messageDisallowedTools.join(", ") : "reset to none"}`);
3140
+ } else {
3141
+ logger.debug(`[loop] User message received with no disallowed tools override, using current: ${currentDisallowedTools ? currentDisallowedTools.join(", ") : "none"}`);
3142
+ }
3143
+ const enhancedMode = {
3144
+ permissionMode: messagePermissionMode || "default",
3145
+ model: messageModel,
3146
+ fallbackModel: messageFallbackModel,
3147
+ customSystemPrompt: messageCustomSystemPrompt,
3148
+ appendSystemPrompt: messageAppendSystemPrompt,
3149
+ allowedTools: messageAllowedTools,
3150
+ disallowedTools: messageDisallowedTools
3151
+ };
3152
+ messageQueue.push(message.content.text, enhancedMode);
2991
3153
  logger.debugLargeJson("User message pushed to queue:", message);
2992
3154
  });
2993
3155
  await loop({
package/dist/lib.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var types = require('./types-eN-YHsuj.cjs');
3
+ var types = require('./types-BBpJNhIN.cjs');
4
4
  require('axios');
5
5
  require('chalk');
6
6
  require('fs');
package/dist/lib.d.cts CHANGED
@@ -339,12 +339,30 @@ declare const UserMessageSchema: z.ZodObject<{
339
339
  meta: z.ZodOptional<z.ZodObject<{
340
340
  sentFrom: z.ZodOptional<z.ZodString>;
341
341
  permissionMode: z.ZodOptional<z.ZodString>;
342
+ model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
343
+ fallbackModel: z.ZodOptional<z.ZodNullable<z.ZodString>>;
344
+ customSystemPrompt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
345
+ appendSystemPrompt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
346
+ allowedTools: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString, "many">>>;
347
+ disallowedTools: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString, "many">>>;
342
348
  }, "strip", z.ZodTypeAny, {
343
349
  sentFrom?: string | undefined;
344
350
  permissionMode?: string | undefined;
351
+ model?: string | null | undefined;
352
+ fallbackModel?: string | null | undefined;
353
+ customSystemPrompt?: string | null | undefined;
354
+ appendSystemPrompt?: string | null | undefined;
355
+ allowedTools?: string[] | null | undefined;
356
+ disallowedTools?: string[] | null | undefined;
345
357
  }, {
346
358
  sentFrom?: string | undefined;
347
359
  permissionMode?: string | undefined;
360
+ model?: string | null | undefined;
361
+ fallbackModel?: string | null | undefined;
362
+ customSystemPrompt?: string | null | undefined;
363
+ appendSystemPrompt?: string | null | undefined;
364
+ allowedTools?: string[] | null | undefined;
365
+ disallowedTools?: string[] | null | undefined;
348
366
  }>>;
349
367
  }, "strip", z.ZodTypeAny, {
350
368
  content: {
@@ -356,6 +374,12 @@ declare const UserMessageSchema: z.ZodObject<{
356
374
  meta?: {
357
375
  sentFrom?: string | undefined;
358
376
  permissionMode?: string | undefined;
377
+ model?: string | null | undefined;
378
+ fallbackModel?: string | null | undefined;
379
+ customSystemPrompt?: string | null | undefined;
380
+ appendSystemPrompt?: string | null | undefined;
381
+ allowedTools?: string[] | null | undefined;
382
+ disallowedTools?: string[] | null | undefined;
359
383
  } | undefined;
360
384
  }, {
361
385
  content: {
@@ -367,6 +391,12 @@ declare const UserMessageSchema: z.ZodObject<{
367
391
  meta?: {
368
392
  sentFrom?: string | undefined;
369
393
  permissionMode?: string | undefined;
394
+ model?: string | null | undefined;
395
+ fallbackModel?: string | null | undefined;
396
+ customSystemPrompt?: string | null | undefined;
397
+ appendSystemPrompt?: string | null | undefined;
398
+ allowedTools?: string[] | null | undefined;
399
+ disallowedTools?: string[] | null | undefined;
370
400
  } | undefined;
371
401
  }>;
372
402
  type UserMessage = z.infer<typeof UserMessageSchema>;
package/dist/lib.d.mts CHANGED
@@ -339,12 +339,30 @@ declare const UserMessageSchema: z.ZodObject<{
339
339
  meta: z.ZodOptional<z.ZodObject<{
340
340
  sentFrom: z.ZodOptional<z.ZodString>;
341
341
  permissionMode: z.ZodOptional<z.ZodString>;
342
+ model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
343
+ fallbackModel: z.ZodOptional<z.ZodNullable<z.ZodString>>;
344
+ customSystemPrompt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
345
+ appendSystemPrompt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
346
+ allowedTools: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString, "many">>>;
347
+ disallowedTools: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString, "many">>>;
342
348
  }, "strip", z.ZodTypeAny, {
343
349
  sentFrom?: string | undefined;
344
350
  permissionMode?: string | undefined;
351
+ model?: string | null | undefined;
352
+ fallbackModel?: string | null | undefined;
353
+ customSystemPrompt?: string | null | undefined;
354
+ appendSystemPrompt?: string | null | undefined;
355
+ allowedTools?: string[] | null | undefined;
356
+ disallowedTools?: string[] | null | undefined;
345
357
  }, {
346
358
  sentFrom?: string | undefined;
347
359
  permissionMode?: string | undefined;
360
+ model?: string | null | undefined;
361
+ fallbackModel?: string | null | undefined;
362
+ customSystemPrompt?: string | null | undefined;
363
+ appendSystemPrompt?: string | null | undefined;
364
+ allowedTools?: string[] | null | undefined;
365
+ disallowedTools?: string[] | null | undefined;
348
366
  }>>;
349
367
  }, "strip", z.ZodTypeAny, {
350
368
  content: {
@@ -356,6 +374,12 @@ declare const UserMessageSchema: z.ZodObject<{
356
374
  meta?: {
357
375
  sentFrom?: string | undefined;
358
376
  permissionMode?: string | undefined;
377
+ model?: string | null | undefined;
378
+ fallbackModel?: string | null | undefined;
379
+ customSystemPrompt?: string | null | undefined;
380
+ appendSystemPrompt?: string | null | undefined;
381
+ allowedTools?: string[] | null | undefined;
382
+ disallowedTools?: string[] | null | undefined;
359
383
  } | undefined;
360
384
  }, {
361
385
  content: {
@@ -367,6 +391,12 @@ declare const UserMessageSchema: z.ZodObject<{
367
391
  meta?: {
368
392
  sentFrom?: string | undefined;
369
393
  permissionMode?: string | undefined;
394
+ model?: string | null | undefined;
395
+ fallbackModel?: string | null | undefined;
396
+ customSystemPrompt?: string | null | undefined;
397
+ appendSystemPrompt?: string | null | undefined;
398
+ allowedTools?: string[] | null | undefined;
399
+ disallowedTools?: string[] | null | undefined;
370
400
  } | undefined;
371
401
  }>;
372
402
  type UserMessage = z.infer<typeof UserMessageSchema>;
package/dist/lib.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, i as initLoggerWithGlobalConfiguration, b as initializeConfiguration, l as logger } from './types-VkaGP8up.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, i as initLoggerWithGlobalConfiguration, b as initializeConfiguration, l as logger } from './types-DDjn6Ovv.mjs';
2
2
  import 'axios';
3
3
  import 'chalk';
4
4
  import 'fs';
@@ -245,8 +245,20 @@ z.z.object({
245
245
  const MessageMetaSchema = z.z.object({
246
246
  sentFrom: z.z.string().optional(),
247
247
  // Source identifier
248
- permissionMode: z.z.string().optional()
248
+ permissionMode: z.z.string().optional(),
249
249
  // Permission mode for this message
250
+ model: z.z.string().nullable().optional(),
251
+ // Model name for this message (null = reset)
252
+ fallbackModel: z.z.string().nullable().optional(),
253
+ // Fallback model for this message (null = reset)
254
+ customSystemPrompt: z.z.string().nullable().optional(),
255
+ // Custom system prompt for this message (null = reset)
256
+ appendSystemPrompt: z.z.string().nullable().optional(),
257
+ // Append to system prompt for this message (null = reset)
258
+ allowedTools: z.z.array(z.z.string()).nullable().optional(),
259
+ // Allowed tools for this message (null = reset)
260
+ disallowedTools: z.z.array(z.z.string()).nullable().optional()
261
+ // Disallowed tools for this message (null = reset)
250
262
  });
251
263
  z.z.object({
252
264
  session: z.z.object({
@@ -243,8 +243,20 @@ z.object({
243
243
  const MessageMetaSchema = z.object({
244
244
  sentFrom: z.string().optional(),
245
245
  // Source identifier
246
- permissionMode: z.string().optional()
246
+ permissionMode: z.string().optional(),
247
247
  // Permission mode for this message
248
+ model: z.string().nullable().optional(),
249
+ // Model name for this message (null = reset)
250
+ fallbackModel: z.string().nullable().optional(),
251
+ // Fallback model for this message (null = reset)
252
+ customSystemPrompt: z.string().nullable().optional(),
253
+ // Custom system prompt for this message (null = reset)
254
+ appendSystemPrompt: z.string().nullable().optional(),
255
+ // Append to system prompt for this message (null = reset)
256
+ allowedTools: z.array(z.string()).nullable().optional(),
257
+ // Allowed tools for this message (null = reset)
258
+ disallowedTools: z.array(z.string()).nullable().optional()
259
+ // Disallowed tools for this message (null = reset)
248
260
  });
249
261
  z.object({
250
262
  session: z.object({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "happy-coder",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Claude Code session sharing CLI",
5
5
  "author": "Kirill Dubovitskiy",
6
6
  "license": "MIT",