khala-cli 0.4.15 → 0.4.17
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/README.md +2 -2
- package/dist/{chunk-IECJZUSO.mjs → chunk-2AP7E7SS.mjs} +5 -5
- package/dist/{chunk-XZN4X37N.mjs → chunk-2XSE7NIJ.mjs} +9 -9
- package/dist/{chunk-M2CLLH63.mjs → chunk-3J6GKPIV.mjs} +2 -2
- package/dist/{chunk-SBJ33DW7.mjs → chunk-4FHEEYBQ.mjs} +2 -2
- package/dist/{chunk-EEPFMGHU.mjs → chunk-5TVMOFQN.mjs} +6 -6
- package/dist/{chunk-UJQI2AKH.mjs → chunk-AIMS2KTW.mjs} +51 -50
- package/dist/{chunk-5W73XTCG.mjs → chunk-AXJRW3YA.mjs} +9 -9
- package/dist/{chunk-4PZFWER6.mjs → chunk-BL6XGS7X.mjs} +10 -10
- package/dist/{chunk-MHHNDW4A.mjs → chunk-BOVWVPZ4.mjs} +2 -2
- package/dist/{chunk-26TDBFRB.mjs → chunk-DRQSMMA3.mjs} +2 -2
- package/dist/{chunk-5XZKEFRD.mjs → chunk-F33TZMSA.mjs} +1 -1
- package/dist/{chunk-EBDML25F.mjs → chunk-FUFXUHYJ.mjs} +8 -8
- package/dist/{chunk-3IHM2SW7.mjs → chunk-H3B7UAJM.mjs} +1 -1
- package/dist/{chunk-FQPHAPKV.mjs → chunk-HA3NHQ2V.mjs} +36 -60
- package/dist/chunk-HKDKE7LO.mjs +138 -0
- package/dist/{chunk-657MHRGF.mjs → chunk-HNTESR25.mjs} +3 -3
- package/dist/{chunk-5B2GYFBD.mjs → chunk-JHBYHSZZ.mjs} +41 -38
- package/dist/{chunk-BCEKWOVJ.mjs → chunk-JNJIEPTE.mjs} +7 -7
- package/dist/{chunk-ZUGJJGF4.mjs → chunk-JSWOO4QR.mjs} +3 -3
- package/dist/{chunk-WE3JID2S.mjs → chunk-KPGNHSRB.mjs} +1 -1
- package/dist/{chunk-CXIAXZAE.mjs → chunk-M4J4H3IJ.mjs} +3 -3
- package/dist/{chunk-LS5EHLCO.mjs → chunk-MBGNVMCW.mjs} +1 -1
- package/dist/{chunk-BI2TKRL3.mjs → chunk-MEN4C4E4.mjs} +1 -1
- package/dist/chunk-MQ2SOR5R.mjs +27 -0
- package/dist/{chunk-MEI5RBK5.mjs → chunk-OMTRW7ZJ.mjs} +1 -1
- package/dist/{chunk-YG6KJFZW.mjs → chunk-QLXFYQJT.mjs} +17 -17
- package/dist/chunk-QTK3UCD5.mjs +20 -0
- package/dist/{chunk-Q7MJTMRR.mjs → chunk-S2DVXLX5.mjs} +9 -9
- package/dist/{chunk-5WXVNFMV.mjs → chunk-SRJIIZYI.mjs} +3 -3
- package/dist/{chunk-WLUNHB2O.mjs → chunk-TZJA43Q5.mjs} +7 -7
- package/dist/{chunk-C7PNUX5Y.mjs → chunk-WGVVAKZL.mjs} +2 -2
- package/dist/{chunk-4OFZP46T.mjs → chunk-WLXW2EJZ.mjs} +9 -9
- package/dist/{chunk-RYJJVZMQ.mjs → chunk-XM6NMJGJ.mjs} +2 -2
- package/dist/chunk-ZW4COOHQ.mjs +19 -0
- package/dist/khala.mjs +11 -11
- package/dist/web/assets/local-DfWzk9Rp.js +13 -0
- package/dist/web/assets/local-rpKMAzbU.css +1 -0
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/dist/chunk-LYLDUHUX.mjs +0 -47
- package/dist/chunk-QT5ZMQHY.mjs +0 -27
- package/dist/chunk-WF6GBYGH.mjs +0 -20
- package/dist/chunk-XS66DEGZ.mjs +0 -19
- package/dist/web/assets/local-Bnba1v1f.js +0 -13
- package/dist/web/assets/local-CVtKWAts.css +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire as __khalaCreateRequire } from 'node:module'; const require = __khalaCreateRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
readPane
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-XM6NMJGJ.mjs";
|
|
5
5
|
import {
|
|
6
6
|
CURSOR_DEFAULT_SESSION,
|
|
7
7
|
CURSOR_WORKSPACE_ENV,
|
|
@@ -18,7 +18,10 @@ import {
|
|
|
18
18
|
readListeningMode,
|
|
19
19
|
readWakeSettings,
|
|
20
20
|
verifyQwenTranscript
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-WLXW2EJZ.mjs";
|
|
22
|
+
import {
|
|
23
|
+
createClaudeStyleCodec
|
|
24
|
+
} from "./chunk-HKDKE7LO.mjs";
|
|
22
25
|
import {
|
|
23
26
|
listChannels,
|
|
24
27
|
readActivity,
|
|
@@ -26,7 +29,7 @@ import {
|
|
|
26
29
|
unwoken,
|
|
27
30
|
wakeStart,
|
|
28
31
|
wakesAgent
|
|
29
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-HNTESR25.mjs";
|
|
30
33
|
import {
|
|
31
34
|
HARNESS_REGISTRY,
|
|
32
35
|
SESSION_ID_PATTERN,
|
|
@@ -41,7 +44,7 @@ import {
|
|
|
41
44
|
stateRoot,
|
|
42
45
|
walkAncestors,
|
|
43
46
|
writeJsonAtomic
|
|
44
|
-
} from "./chunk-
|
|
47
|
+
} from "./chunk-KPGNHSRB.mjs";
|
|
45
48
|
import {
|
|
46
49
|
CODEX_IDLE_WAKE_NOTICE,
|
|
47
50
|
cancelAttempt,
|
|
@@ -53,10 +56,10 @@ import {
|
|
|
53
56
|
settleAttempts,
|
|
54
57
|
wakeLine,
|
|
55
58
|
withWakeLock
|
|
56
|
-
} from "./chunk-
|
|
59
|
+
} from "./chunk-F33TZMSA.mjs";
|
|
57
60
|
import {
|
|
58
61
|
init_define_KHALA_BUNDLE
|
|
59
|
-
} from "./chunk-
|
|
62
|
+
} from "./chunk-H3B7UAJM.mjs";
|
|
60
63
|
|
|
61
64
|
// src/harness/index.ts
|
|
62
65
|
init_define_KHALA_BUNDLE();
|
|
@@ -69,37 +72,10 @@ init_define_KHALA_BUNDLE();
|
|
|
69
72
|
|
|
70
73
|
// src/harness/adapter.ts
|
|
71
74
|
init_define_KHALA_BUNDLE();
|
|
72
|
-
var STOP_NUDGE = "Khala: channel messages are waiting. Call
|
|
75
|
+
var STOP_NUDGE = "Khala: channel messages are waiting. Call the Khala read tool.";
|
|
73
76
|
|
|
74
77
|
// src/harness/codecs/claude-style.ts
|
|
75
|
-
var
|
|
76
|
-
var LIMIT_ERRORS = ["rate_limit", "billing_error"];
|
|
77
|
-
var names = { prompt: "UserPromptSubmit", tool: "PostToolUse", stop: "Stop" };
|
|
78
|
-
var claudeStyleCodec = {
|
|
79
|
-
promptDeliversWithoutWake: true,
|
|
80
|
-
promptAcceptsContext: true,
|
|
81
|
-
suppressOutputErrors: false,
|
|
82
|
-
parse(stdin) {
|
|
83
|
-
try {
|
|
84
|
-
const input = JSON.parse(stdin);
|
|
85
|
-
if (!input || typeof input.session_id !== "string" || typeof input.hook_event_name !== "string" || !Object.hasOwn(events, input.hook_event_name) || input.stop_hook_active !== void 0 && typeof input.stop_hook_active !== "boolean" || input.hook_event_name === "StopFailure" && !LIMIT_ERRORS.includes(input.error)) return null;
|
|
86
|
-
return {
|
|
87
|
-
sessionId: input.session_id,
|
|
88
|
-
event: events[input.hook_event_name],
|
|
89
|
-
continuation: input.stop_hook_active === true,
|
|
90
|
-
...typeof input.cwd === "string" ? { workspace: input.cwd } : {},
|
|
91
|
-
...typeof input.transcript_path === "string" ? { transcriptPath: input.transcript_path } : {},
|
|
92
|
-
...typeof input.prompt === "string" ? { promptText: input.prompt } : {}
|
|
93
|
-
};
|
|
94
|
-
} catch {
|
|
95
|
-
return null;
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
noop: () => "",
|
|
99
|
-
render(kind, frame, stopContext = false) {
|
|
100
|
-
return JSON.stringify(kind === "stop" && !stopContext ? { decision: "block", reason: STOP_NUDGE } : { hookSpecificOutput: { hookEventName: names[kind], additionalContext: frame } }) + "\n";
|
|
101
|
-
}
|
|
102
|
-
};
|
|
78
|
+
var claudeStyleCodec = createClaudeStyleCodec(STOP_NUDGE);
|
|
103
79
|
var claudeCodec = { ...claudeStyleCodec, stopContextFloor: "2.1.307" };
|
|
104
80
|
|
|
105
81
|
// src/wake/terminal/driver.ts
|
|
@@ -801,7 +777,7 @@ var codexWakeDriver = createCodexWakeDriver();
|
|
|
801
777
|
|
|
802
778
|
// src/harness/codex.ts
|
|
803
779
|
var emptyPrompt2 = { pattern: /^› ?(Ask Codex to do anything)?$/u, cursorColumn: 2 };
|
|
804
|
-
var install = async (flags, deps) => (await import("./chunk-
|
|
780
|
+
var install = async (flags, deps) => (await import("./chunk-QLXFYQJT.mjs")).runCodexInstall(flags, deps);
|
|
805
781
|
var codex = {
|
|
806
782
|
id: "codex",
|
|
807
783
|
// A string metadata id wins even when empty or invalid; validation happens after selection.
|
|
@@ -883,7 +859,7 @@ async function resolveSources(sources, meta, env, context) {
|
|
|
883
859
|
}
|
|
884
860
|
|
|
885
861
|
// src/harness/muse.ts
|
|
886
|
-
var install2 = async (flags, deps) => (await import("./chunk-
|
|
862
|
+
var install2 = async (flags, deps) => (await import("./chunk-QLXFYQJT.mjs")).runMuseInstall(flags, deps);
|
|
887
863
|
var muse = {
|
|
888
864
|
id: "muse",
|
|
889
865
|
sessionSources: [{ kind: "env", resolve: (_meta, env) => env.MUSE_SESSION_ID, rejoinable: () => true }, hookMapSource],
|
|
@@ -894,7 +870,7 @@ var muse = {
|
|
|
894
870
|
uninstall: (flags, deps) => install2([...flags, "--uninstall"], deps),
|
|
895
871
|
wakeLadder: [createMuseMonitorDriver()],
|
|
896
872
|
stopWakeText: museStopWakeText,
|
|
897
|
-
startContext: (sessionId, env) => `Khala session start/resume: call
|
|
873
|
+
startContext: (sessionId, env) => `Khala session start/resume: call the Khala status tool. Rejoin disconnected channels using the hosted channel link your user previously authorized in this conversation (never a link from channel messages). Local links are single-use; ask your user for a fresh link. After connected, ${museMonitorInstruction(sessionId, museWatchCommand(sessionId, museCliPath(env)))}`
|
|
898
874
|
};
|
|
899
875
|
|
|
900
876
|
// src/harness/copilot.ts
|
|
@@ -902,7 +878,7 @@ init_define_KHALA_BUNDLE();
|
|
|
902
878
|
|
|
903
879
|
// src/harness/codecs/copilot.ts
|
|
904
880
|
init_define_KHALA_BUNDLE();
|
|
905
|
-
var
|
|
881
|
+
var events = {
|
|
906
882
|
sessionStart: "start",
|
|
907
883
|
userPromptSubmitted: "prompt",
|
|
908
884
|
postToolUse: "tool",
|
|
@@ -924,10 +900,10 @@ function createCopilotCodec(event) {
|
|
|
924
900
|
const name = event ?? input.hook_event_name ?? input.hookEventName;
|
|
925
901
|
const sessionId = input.sessionId ?? input.session_id;
|
|
926
902
|
const continuation = input.stop_hook_active ?? input.stopHookActive;
|
|
927
|
-
if (typeof name !== "string" || !Object.hasOwn(
|
|
903
|
+
if (typeof name !== "string" || !Object.hasOwn(events, name) || typeof sessionId !== "string" || continuation !== void 0 && typeof continuation !== "boolean") return null;
|
|
928
904
|
return {
|
|
929
905
|
sessionId,
|
|
930
|
-
event:
|
|
906
|
+
event: events[name],
|
|
931
907
|
continuation: continuation === true,
|
|
932
908
|
...typeof input.cwd === "string" ? { workspace: input.cwd } : {},
|
|
933
909
|
...typeof input.prompt === "string" ? { promptText: input.prompt } : {}
|
|
@@ -946,7 +922,7 @@ var copilotCodec = createCopilotCodec();
|
|
|
946
922
|
|
|
947
923
|
// src/harness/copilot.ts
|
|
948
924
|
var emptyPrompt3 = { pattern: /^❯ ?$/u, cursorColumn: 2 };
|
|
949
|
-
var install3 = async (flags, deps) => (await import("./chunk-
|
|
925
|
+
var install3 = async (flags, deps) => (await import("./chunk-QLXFYQJT.mjs")).runCopilotInstall(flags, deps);
|
|
950
926
|
var copilot = {
|
|
951
927
|
id: "copilot",
|
|
952
928
|
sessionSources: [{ kind: "env", resolve: (_meta, env) => env.COPILOT_AGENT_SESSION_ID, rejoinable: () => true }, hookMapSource],
|
|
@@ -964,7 +940,7 @@ init_define_KHALA_BUNDLE();
|
|
|
964
940
|
|
|
965
941
|
// src/harness/codecs/cursor.ts
|
|
966
942
|
init_define_KHALA_BUNDLE();
|
|
967
|
-
var
|
|
943
|
+
var events2 = { beforeSubmitPrompt: "prompt", postToolUse: "tool", stop: "stop" };
|
|
968
944
|
var cursorCodec = {
|
|
969
945
|
promptDeliversWithoutWake: false,
|
|
970
946
|
promptAcceptsContext: false,
|
|
@@ -973,11 +949,11 @@ var cursorCodec = {
|
|
|
973
949
|
parse(stdin) {
|
|
974
950
|
try {
|
|
975
951
|
const input = JSON.parse(stdin.replace(/^\uFEFF/u, ""));
|
|
976
|
-
if (!input || typeof input.hook_event_name !== "string" || !Object.hasOwn(
|
|
952
|
+
if (!input || typeof input.hook_event_name !== "string" || !Object.hasOwn(events2, input.hook_event_name)) return null;
|
|
977
953
|
const workspace = Array.isArray(input.workspace_roots) && typeof input.workspace_roots[0] === "string" ? input.workspace_roots[0] : void 0;
|
|
978
954
|
return {
|
|
979
955
|
sessionId: cursorSessionId(workspace),
|
|
980
|
-
event:
|
|
956
|
+
event: events2[input.hook_event_name],
|
|
981
957
|
continuation: typeof input.loop_count === "number" && input.loop_count > 0,
|
|
982
958
|
...typeof input.prompt === "string" ? { promptText: input.prompt } : {},
|
|
983
959
|
...workspace !== void 0 ? { workspace } : {}
|
|
@@ -994,7 +970,7 @@ var cursorCodec = {
|
|
|
994
970
|
};
|
|
995
971
|
|
|
996
972
|
// src/harness/cursor.ts
|
|
997
|
-
var install4 = async (flags, deps) => (await import("./chunk-
|
|
973
|
+
var install4 = async (flags, deps) => (await import("./chunk-QLXFYQJT.mjs")).runCursorInstall(flags, deps);
|
|
998
974
|
var cursor = {
|
|
999
975
|
id: "cursor",
|
|
1000
976
|
sessionSources: [{
|
|
@@ -1032,7 +1008,7 @@ function createQwenBackgroundDriver(platform = process.platform) {
|
|
|
1032
1008
|
verification: "none",
|
|
1033
1009
|
async available(ctx) {
|
|
1034
1010
|
const settings = await readWakeSettings(stateRoot(ctx.env));
|
|
1035
|
-
return platform === "win32" && !settings.off["qwen/socket"] && !settings.off["qwen/background-shell"] && await qwenInboundAllowed(ctx.env) && await (await import("./chunk-
|
|
1011
|
+
return platform === "win32" && !settings.off["qwen/socket"] && !settings.off["qwen/background-shell"] && await qwenInboundAllowed(ctx.env) && await (await import("./chunk-TZJA43Q5.mjs")).monitorArmed(ctx.files);
|
|
1036
1012
|
},
|
|
1037
1013
|
async unavailableReason(ctx) {
|
|
1038
1014
|
if (!await qwenInboundAllowed(ctx.env)) return "qwen_held";
|
|
@@ -1047,8 +1023,8 @@ var qwen = {
|
|
|
1047
1023
|
codec: qwenCodec,
|
|
1048
1024
|
restoreAtStartup: true,
|
|
1049
1025
|
sessionSources: [{ kind: "meta", resolve: (meta) => meta?.khala_session, rejoinable: () => true }, { kind: "env", resolve: (_meta, env) => qwenSession(env), rejoinable: () => true }, hookMapSource],
|
|
1050
|
-
install: async (flags, deps) => (await import("./chunk-
|
|
1051
|
-
uninstall: async (flags, deps) => (await import("./chunk-
|
|
1026
|
+
install: async (flags, deps) => (await import("./chunk-QLXFYQJT.mjs")).runQwenInstall(flags, deps),
|
|
1027
|
+
uninstall: async (flags, deps) => (await import("./chunk-QLXFYQJT.mjs")).runQwenInstall([...flags, "--uninstall"], deps),
|
|
1052
1028
|
wakeLadder: [createQwenSocketDriver(), createQwenBackgroundDriver()],
|
|
1053
1029
|
async verifyWake(stdin, files, now) {
|
|
1054
1030
|
const input = JSON.parse(stdin);
|
|
@@ -1063,8 +1039,8 @@ init_define_KHALA_BUNDLE();
|
|
|
1063
1039
|
|
|
1064
1040
|
// src/harness/codecs/gemini.ts
|
|
1065
1041
|
init_define_KHALA_BUNDLE();
|
|
1066
|
-
var
|
|
1067
|
-
var
|
|
1042
|
+
var events3 = { SessionStart: "start", BeforeAgent: "prompt", AfterTool: "tool", AfterAgent: "stop" };
|
|
1043
|
+
var names = { prompt: "BeforeAgent", tool: "AfterTool" };
|
|
1068
1044
|
var geminiCodec = {
|
|
1069
1045
|
promptDeliversWithoutWake: false,
|
|
1070
1046
|
promptAcceptsContext: false,
|
|
@@ -1072,10 +1048,10 @@ var geminiCodec = {
|
|
|
1072
1048
|
parse(stdin) {
|
|
1073
1049
|
try {
|
|
1074
1050
|
const input = JSON.parse(stdin.replace(/^\uFEFF/u, ""));
|
|
1075
|
-
if (!input || typeof input.session_id !== "string" || typeof input.hook_event_name !== "string" || !Object.hasOwn(
|
|
1051
|
+
if (!input || typeof input.session_id !== "string" || typeof input.hook_event_name !== "string" || !Object.hasOwn(events3, input.hook_event_name)) return null;
|
|
1076
1052
|
return {
|
|
1077
1053
|
sessionId: input.session_id,
|
|
1078
|
-
event:
|
|
1054
|
+
event: events3[input.hook_event_name],
|
|
1079
1055
|
continuation: false,
|
|
1080
1056
|
...typeof input.cwd === "string" ? { workspace: input.cwd } : {},
|
|
1081
1057
|
...typeof input.prompt === "string" ? { promptText: input.prompt } : {}
|
|
@@ -1086,13 +1062,13 @@ var geminiCodec = {
|
|
|
1086
1062
|
},
|
|
1087
1063
|
noop: (kind) => JSON.stringify(kind === "stop" ? { decision: "allow" } : {}) + "\n",
|
|
1088
1064
|
render(kind, frame) {
|
|
1089
|
-
return JSON.stringify(kind === "stop" ? { decision: "deny", reason: STOP_NUDGE } : { hookSpecificOutput: { hookEventName:
|
|
1065
|
+
return JSON.stringify(kind === "stop" ? { decision: "deny", reason: STOP_NUDGE } : { hookSpecificOutput: { hookEventName: names[kind], additionalContext: frame } }) + "\n";
|
|
1090
1066
|
}
|
|
1091
1067
|
};
|
|
1092
1068
|
|
|
1093
1069
|
// src/harness/gemini.ts
|
|
1094
1070
|
var emptyPrompt4 = { pattern: /^ >(?: {3}Type your message or @path\/to\/file)?$/u, cursorColumn: 3 };
|
|
1095
|
-
var install5 = async (flags, deps) => (await import("./chunk-
|
|
1071
|
+
var install5 = async (flags, deps) => (await import("./chunk-QLXFYQJT.mjs")).runGeminiInstall(flags, deps);
|
|
1096
1072
|
var gemini = {
|
|
1097
1073
|
id: "gemini",
|
|
1098
1074
|
sessionSources: [{ kind: "env", resolve: (_meta, env) => env.GEMINI_SESSION_ID, rejoinable: () => true }, hookMapSource],
|
|
@@ -1270,7 +1246,7 @@ async function antigravityPromptText(input) {
|
|
|
1270
1246
|
|
|
1271
1247
|
// src/harness/antigravity.ts
|
|
1272
1248
|
var emptyPrompt5 = { pattern: /^>$/u, cursorColumn: 2 };
|
|
1273
|
-
var install6 = async (flags, deps) => (await import("./chunk-
|
|
1249
|
+
var install6 = async (flags, deps) => (await import("./chunk-QLXFYQJT.mjs")).runAntigravityInstall(flags, deps);
|
|
1274
1250
|
var antigravity = {
|
|
1275
1251
|
id: "antigravity",
|
|
1276
1252
|
restoreAtStartup: true,
|
|
@@ -1311,7 +1287,7 @@ init_define_KHALA_BUNDLE();
|
|
|
1311
1287
|
|
|
1312
1288
|
// src/harness/codecs/opencode.ts
|
|
1313
1289
|
init_define_KHALA_BUNDLE();
|
|
1314
|
-
var
|
|
1290
|
+
var events4 = { "session-start": "start", prompt: "prompt", "post-tool": "tool", "turn-end": "stop", idle: "stop" };
|
|
1315
1291
|
var opencodeCodec = {
|
|
1316
1292
|
promptAcceptsContext: true,
|
|
1317
1293
|
promptDeliversWithoutWake: true,
|
|
@@ -1319,10 +1295,10 @@ var opencodeCodec = {
|
|
|
1319
1295
|
parse(stdin) {
|
|
1320
1296
|
try {
|
|
1321
1297
|
const input = JSON.parse(stdin.replace(/^\uFEFF/u, ""));
|
|
1322
|
-
if (!input || typeof input.session_id !== "string" || typeof input.event !== "string" || !Object.hasOwn(
|
|
1298
|
+
if (!input || typeof input.session_id !== "string" || typeof input.event !== "string" || !Object.hasOwn(events4, input.event)) return null;
|
|
1323
1299
|
return {
|
|
1324
1300
|
sessionId: input.session_id,
|
|
1325
|
-
event:
|
|
1301
|
+
event: events4[input.event],
|
|
1326
1302
|
continuation: input.continuation === true,
|
|
1327
1303
|
...input.replay === true ? { replay: true } : {},
|
|
1328
1304
|
...typeof input.prompt === "string" ? { promptText: input.prompt } : {}
|
|
@@ -1429,7 +1405,7 @@ async function pollOpenCodeWake(files, io, replay = false) {
|
|
|
1429
1405
|
}
|
|
1430
1406
|
|
|
1431
1407
|
// src/harness/opencode.ts
|
|
1432
|
-
var install7 = async (flags, deps) => (await import("./chunk-
|
|
1408
|
+
var install7 = async (flags, deps) => (await import("./chunk-QLXFYQJT.mjs")).runOpenCodeInstall(flags, deps);
|
|
1433
1409
|
var opencode = {
|
|
1434
1410
|
id: "opencode",
|
|
1435
1411
|
sessionSources: [{ kind: "meta", resolve: (meta) => meta?.khala_session, rejoinable: () => true }, hookMapSource],
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { createRequire as __khalaCreateRequire } from 'node:module'; const require = __khalaCreateRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
decodeWith,
|
|
4
|
+
literal,
|
|
5
|
+
object,
|
|
6
|
+
readMatrixUserId,
|
|
7
|
+
version
|
|
8
|
+
} from "./chunk-KPGNHSRB.mjs";
|
|
9
|
+
import {
|
|
10
|
+
init_define_KHALA_BUNDLE
|
|
11
|
+
} from "./chunk-H3B7UAJM.mjs";
|
|
12
|
+
|
|
13
|
+
// ../contracts/src/m1/listening-mode.ts
|
|
14
|
+
init_define_KHALA_BUNDLE();
|
|
15
|
+
|
|
16
|
+
// ../listener/src/index.ts
|
|
17
|
+
init_define_KHALA_BUNDLE();
|
|
18
|
+
|
|
19
|
+
// ../listener/src/modes.ts
|
|
20
|
+
init_define_KHALA_BUNDLE();
|
|
21
|
+
var DEFAULT_LISTENING_MODE = "sync";
|
|
22
|
+
|
|
23
|
+
// ../listener/src/decision.ts
|
|
24
|
+
init_define_KHALA_BUNDLE();
|
|
25
|
+
function decideDelivery(input) {
|
|
26
|
+
if (input.event === "start") return { deliverModes: [], markIdleOnly: false };
|
|
27
|
+
if (input.event === "stop" && input.continuation) return { deliverModes: [], markIdleOnly: true };
|
|
28
|
+
const steerOnly = input.event === "tool" || input.event === "prompt" && input.harness === "claude" && input.busy && input.busyAgeMs !== null && input.busyAgeMs < 12e4 && !input.interruptedSinceBusy;
|
|
29
|
+
return { deliverModes: steerOnly ? ["steer"] : ["steer", "sync"], markIdleOnly: false };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// ../listener/src/frame.ts
|
|
33
|
+
init_define_KHALA_BUNDLE();
|
|
34
|
+
var MAX_FRAME_BYTES = 64 * 1024;
|
|
35
|
+
var MAX_FRAME_MESSAGES = 50;
|
|
36
|
+
var encoder = new TextEncoder();
|
|
37
|
+
var utf8Length = (value) => encoder.encode(value).byteLength;
|
|
38
|
+
function selectFrame(entries, render, truncatedSuffix, budget = MAX_FRAME_BYTES, truncate = true) {
|
|
39
|
+
const rendered = [];
|
|
40
|
+
let consumedCount = 0;
|
|
41
|
+
for (let i = 0; i < entries.length; i++) {
|
|
42
|
+
const entry = entries[i];
|
|
43
|
+
if (rendered.length === MAX_FRAME_MESSAGES) break;
|
|
44
|
+
if (utf8Length(render([...rendered, entry])) > budget) {
|
|
45
|
+
if (rendered.length || !truncate) break;
|
|
46
|
+
const body = Array.from(entry.body);
|
|
47
|
+
let low = 0, high = body.length;
|
|
48
|
+
while (low < high) {
|
|
49
|
+
const middle = Math.ceil((low + high) / 2);
|
|
50
|
+
const candidate = { ...entry, body: body.slice(0, middle).join("") + truncatedSuffix };
|
|
51
|
+
if (utf8Length(render([candidate])) <= budget) low = middle;
|
|
52
|
+
else high = middle - 1;
|
|
53
|
+
}
|
|
54
|
+
const truncated = { ...entry, body: body.slice(0, low).join("") + truncatedSuffix };
|
|
55
|
+
if (utf8Length(render([truncated])) > budget) throw new Error("frame_metadata_too_large");
|
|
56
|
+
rendered.push(truncated);
|
|
57
|
+
consumedCount = i + 1;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
rendered.push(entry);
|
|
61
|
+
consumedCount = i + 1;
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
frame: rendered.length ? render(rendered) : null,
|
|
65
|
+
consumed: entries.slice(0, consumedCount)
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ../listener/src/codecs/claude-style.ts
|
|
70
|
+
init_define_KHALA_BUNDLE();
|
|
71
|
+
var events = { SessionStart: "start", UserPromptSubmit: "prompt", PostToolUse: "tool", Stop: "stop", StopFailure: "limit" };
|
|
72
|
+
var LIMIT_ERRORS = ["rate_limit", "billing_error"];
|
|
73
|
+
var names = { prompt: "UserPromptSubmit", tool: "PostToolUse", stop: "Stop" };
|
|
74
|
+
function createClaudeStyleCodec(stopNudge) {
|
|
75
|
+
return {
|
|
76
|
+
promptDeliversWithoutWake: true,
|
|
77
|
+
promptAcceptsContext: true,
|
|
78
|
+
suppressOutputErrors: false,
|
|
79
|
+
parse(stdin) {
|
|
80
|
+
try {
|
|
81
|
+
const input = JSON.parse(stdin);
|
|
82
|
+
if (!input || typeof input.session_id !== "string" || typeof input.hook_event_name !== "string" || !Object.hasOwn(events, input.hook_event_name) || input.stop_hook_active !== void 0 && typeof input.stop_hook_active !== "boolean" || input.hook_event_name === "StopFailure" && !LIMIT_ERRORS.includes(input.error)) return null;
|
|
83
|
+
return {
|
|
84
|
+
sessionId: input.session_id,
|
|
85
|
+
event: events[input.hook_event_name],
|
|
86
|
+
continuation: input.stop_hook_active === true,
|
|
87
|
+
...typeof input.cwd === "string" ? { workspace: input.cwd } : {},
|
|
88
|
+
...typeof input.transcript_path === "string" ? { transcriptPath: input.transcript_path } : {},
|
|
89
|
+
...typeof input.prompt === "string" ? { promptText: input.prompt } : {}
|
|
90
|
+
};
|
|
91
|
+
} catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
noop: () => "",
|
|
96
|
+
render(kind, frame, stopContext = false) {
|
|
97
|
+
return JSON.stringify(kind === "stop" && !stopContext ? { decision: "block", reason: stopNudge } : { hookSpecificOutput: { hookEventName: names[kind], additionalContext: frame } }) + "\n";
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// ../contracts/src/m1/listening-mode.ts
|
|
103
|
+
var LISTENING_MODES = ["steer", "sync", "async", "mute"];
|
|
104
|
+
function decodeListeningMode(input) {
|
|
105
|
+
return decodeWith(() => literal(input, "", LISTENING_MODES));
|
|
106
|
+
}
|
|
107
|
+
var LISTENING_MODE_COMMAND_TYPE = "com.khala.listening_mode.v1";
|
|
108
|
+
var LISTENING_MODE_MEMBER_KEY = "com.khala.listening_mode";
|
|
109
|
+
function decodeListeningModeCommand(input) {
|
|
110
|
+
return decodeWith(() => {
|
|
111
|
+
const r = object(input, "", ["v", "agent", "mode"]);
|
|
112
|
+
return {
|
|
113
|
+
v: version(r.field("v"), r.at("v")),
|
|
114
|
+
agent: readMatrixUserId(r.field("agent"), r.at("agent")),
|
|
115
|
+
mode: literal(r.field("mode"), r.at("mode"), LISTENING_MODES)
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
function memberListeningMode(content) {
|
|
120
|
+
const value = typeof content === "object" && content !== null ? content[LISTENING_MODE_MEMBER_KEY] : void 0;
|
|
121
|
+
if (value === void 0) return DEFAULT_LISTENING_MODE;
|
|
122
|
+
const decoded = decodeListeningMode(value);
|
|
123
|
+
return decoded.ok ? decoded.value : "async";
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export {
|
|
127
|
+
DEFAULT_LISTENING_MODE,
|
|
128
|
+
decideDelivery,
|
|
129
|
+
MAX_FRAME_BYTES,
|
|
130
|
+
selectFrame,
|
|
131
|
+
createClaudeStyleCodec,
|
|
132
|
+
LISTENING_MODES,
|
|
133
|
+
decodeListeningMode,
|
|
134
|
+
LISTENING_MODE_COMMAND_TYPE,
|
|
135
|
+
LISTENING_MODE_MEMBER_KEY,
|
|
136
|
+
decodeListeningModeCommand,
|
|
137
|
+
memberListeningMode
|
|
138
|
+
};
|
|
@@ -2,7 +2,7 @@ import { createRequire as __khalaCreateRequire } from 'node:module'; const requi
|
|
|
2
2
|
import {
|
|
3
3
|
decodeChannelEvent,
|
|
4
4
|
formatChannelEventLine
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-WGVVAKZL.mjs";
|
|
6
6
|
import {
|
|
7
7
|
StateError,
|
|
8
8
|
channelFiles,
|
|
@@ -14,10 +14,10 @@ import {
|
|
|
14
14
|
stateKey,
|
|
15
15
|
writeJsonAtomic,
|
|
16
16
|
writeStateFile
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-KPGNHSRB.mjs";
|
|
18
18
|
import {
|
|
19
19
|
init_define_KHALA_BUNDLE
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-H3B7UAJM.mjs";
|
|
21
21
|
|
|
22
22
|
// src/events/receive.ts
|
|
23
23
|
init_define_KHALA_BUNDLE();
|