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 +170 -8
- package/dist/index.mjs +170 -8
- package/dist/lib.cjs +1 -1
- package/dist/lib.d.cts +30 -0
- package/dist/lib.d.mts +30 -0
- package/dist/lib.mjs +1 -1
- package/dist/{types-eN-YHsuj.cjs → types-BBpJNhIN.cjs} +13 -1
- package/dist/{types-VkaGP8up.mjs → types-DDjn6Ovv.mjs} +13 -1
- package/package.json +1 -1
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-
|
|
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.
|
|
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
|
-
|
|
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-
|
|
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.
|
|
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
|
-
|
|
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
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-
|
|
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({
|