khala-cli 0.4.18 → 0.4.19

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.
Files changed (42) hide show
  1. package/dist/{chunk-VK7ZSKQZ.mjs → chunk-2CM6MFLQ.mjs} +8 -7
  2. package/dist/chunk-5T2T2BGP.mjs +25 -0
  3. package/dist/{chunk-TYRNBET6.mjs → chunk-6CUBZHAI.mjs} +2 -2
  4. package/dist/{chunk-XXKDMHR2.mjs → chunk-7BR55Y3K.mjs} +2 -2
  5. package/dist/{chunk-ELI3YCFF.mjs → chunk-7JLJ2IVR.mjs} +19 -81
  6. package/dist/{chunk-4WHRO5ZU.mjs → chunk-A76X5SLZ.mjs} +9 -7
  7. package/dist/{chunk-UA6DEWBA.mjs → chunk-BUFSSWDE.mjs} +1 -1
  8. package/dist/{chunk-SRUPGV2G.mjs → chunk-CR2MQIB4.mjs} +11 -13
  9. package/dist/{chunk-FDSHLUCQ.mjs → chunk-DP24LQAW.mjs} +44 -22
  10. package/dist/{chunk-IESMCVXV.mjs → chunk-ERWPSB27.mjs} +1 -1
  11. package/dist/{chunk-YAXWRS5U.mjs → chunk-I3UIC3DD.mjs} +2 -2
  12. package/dist/chunk-IH5ALDEX.mjs +17 -0
  13. package/dist/{chunk-RJZ6FAFC.mjs → chunk-JALXEI56.mjs} +3 -3
  14. package/dist/{chunk-WM75XLND.mjs → chunk-K7YTGI7R.mjs} +6 -6
  15. package/dist/chunk-LOVF37KO.mjs +72 -0
  16. package/dist/{chunk-FCOL5HBH.mjs → chunk-LUQ2K5K2.mjs} +10 -12
  17. package/dist/chunk-LZXXWDKB.mjs +18 -0
  18. package/dist/{chunk-3RCRNCG3.mjs → chunk-ME3G775Q.mjs} +140 -5
  19. package/dist/{chunk-QYVSNP2P.mjs → chunk-NDII2VEP.mjs} +1 -1
  20. package/dist/{chunk-BG4JGKQG.mjs → chunk-NYMXWKOF.mjs} +2 -2
  21. package/dist/{chunk-LOGBYBPA.mjs → chunk-OFLK3DF2.mjs} +1 -1
  22. package/dist/{chunk-RWT4I2XJ.mjs → chunk-OPBCYCDJ.mjs} +23 -25
  23. package/dist/{chunk-OZ5C2ZMB.mjs → chunk-POSW5KU5.mjs} +10 -12
  24. package/dist/{chunk-43THPTMD.mjs → chunk-PQ6Y7QRL.mjs} +7 -7
  25. package/dist/{chunk-KCWHDC7S.mjs → chunk-PXNKY5ZM.mjs} +8 -10
  26. package/dist/{chunk-GVIPYERE.mjs → chunk-Q2ENNHOG.mjs} +3 -3
  27. package/dist/{chunk-HOKMRMNP.mjs → chunk-RYBGLMUZ.mjs} +2 -2
  28. package/dist/{chunk-MTDLNIUY.mjs → chunk-TJUM3DPB.mjs} +1 -1
  29. package/dist/{chunk-6ZL6OFW4.mjs → chunk-TZLAEDD2.mjs} +5 -5
  30. package/dist/{chunk-H2X64ISL.mjs → chunk-UI5OJ2TY.mjs} +3 -3
  31. package/dist/{chunk-5IZ3WN3S.mjs → chunk-V5SWPOLN.mjs} +53 -53
  32. package/dist/{chunk-JXV5S7FC.mjs → chunk-WOHXD3RS.mjs} +433 -129
  33. package/dist/{chunk-4IOLQB34.mjs → chunk-YN334EWZ.mjs} +1 -1
  34. package/dist/khala.mjs +11 -11
  35. package/dist/web/assets/{local-3eMi9596.js → local-SRORuW7r.js} +2 -2
  36. package/dist/web/index.html +1 -1
  37. package/package.json +1 -1
  38. package/dist/chunk-4FUYRD3G.mjs +0 -27
  39. package/dist/chunk-AU2FBBUY.mjs +0 -20
  40. package/dist/chunk-EBKZETYL.mjs +0 -142
  41. package/dist/chunk-KXLGRISD.mjs +0 -19
  42. package/dist/chunk-LNDZI73C.mjs +0 -323
@@ -11,86 +11,83 @@ import {
11
11
  sniffImage,
12
12
  startChannelSession,
13
13
  stripImageMetadata
14
- } from "./chunk-TYRNBET6.mjs";
14
+ } from "./chunk-6CUBZHAI.mjs";
15
15
  import {
16
16
  hostedUsernameFromAgentName,
17
17
  pollJoin,
18
18
  reportReady,
19
19
  requestJoin,
20
20
  saveHostedUsername
21
- } from "./chunk-GVIPYERE.mjs";
21
+ } from "./chunk-Q2ENNHOG.mjs";
22
22
  import {
23
23
  KhalaClientError,
24
24
  LOCAL_OWNER_USER_ID,
25
25
  agentNameFromTitle
26
- } from "./chunk-6ZL6OFW4.mjs";
27
- import "./chunk-MTDLNIUY.mjs";
26
+ } from "./chunk-TZLAEDD2.mjs";
27
+ import "./chunk-TJUM3DPB.mjs";
28
28
  import {
29
29
  KHALA_AGENT_VERSION
30
- } from "./chunk-XXKDMHR2.mjs";
31
- import {
32
- resolveHarness,
33
- resolveSession
34
- } from "./chunk-BG4JGKQG.mjs";
35
- import "./chunk-IESMCVXV.mjs";
30
+ } from "./chunk-7BR55Y3K.mjs";
31
+ import "./chunk-ERWPSB27.mjs";
36
32
  import {
37
33
  antigravityRegisterHint,
38
34
  selectedWakeStatus,
39
35
  wakeDisableNotice,
40
36
  wakeStatus,
41
37
  wakeStatusText
42
- } from "./chunk-VK7ZSKQZ.mjs";
38
+ } from "./chunk-2CM6MFLQ.mjs";
39
+ import {
40
+ resolveHarness,
41
+ resolveSession
42
+ } from "./chunk-NYMXWKOF.mjs";
43
43
  import {
44
44
  SESSION_UNKNOWN_HINT,
45
45
  adapterFor,
46
46
  createWakeLadder
47
- } from "./chunk-RWT4I2XJ.mjs";
48
- import "./chunk-HOKMRMNP.mjs";
47
+ } from "./chunk-OPBCYCDJ.mjs";
48
+ import "./chunk-RYBGLMUZ.mjs";
49
49
  import {
50
50
  ATTENTION,
51
+ advanceCursor,
52
+ appendInbox,
51
53
  applyArchived,
52
54
  applyListeningMode,
55
+ channelKey,
56
+ claudeWatchCommand,
57
+ createEventKeyFilter,
53
58
  delegateChannel,
54
59
  isDelegated,
60
+ isWakeEntry,
61
+ listChannels,
62
+ mentions,
63
+ migrateLegacy,
55
64
  monitorArmed,
56
65
  museCliPath,
57
66
  museMonitorInstruction,
58
67
  museWatchCommand,
59
68
  qwenInboundAllowed,
60
- readModeState,
61
- readWakeSettings
62
- } from "./chunk-JXV5S7FC.mjs";
63
- import {
64
- LISTENING_MODES,
65
- decodeListeningModeCommand
66
- } from "./chunk-EBKZETYL.mjs";
67
- import {
68
- advanceCursor,
69
- appendInbox,
70
- channelKey,
71
- createEventKeyFilter,
72
- isWakeEntry,
73
- listChannels,
74
- mentions,
75
- migrateLegacy,
76
69
  readActivity,
77
70
  readCursor,
78
71
  readEntries,
72
+ readModeState,
73
+ readWakeSettings,
79
74
  resolveChannel,
80
75
  toEventInboxEntry,
81
76
  unread,
82
77
  unreadCount,
83
78
  usageLimited,
84
79
  wakesAgent
85
- } from "./chunk-LNDZI73C.mjs";
80
+ } from "./chunk-WOHXD3RS.mjs";
86
81
  import {
87
82
  CHANNEL_EVENT_TYPE,
83
+ LISTENING_MODES,
84
+ decodeListeningModeCommand,
88
85
  encodeChannelEvent,
89
86
  foldCoordination,
90
87
  formatChannelEventLine,
91
88
  memberRenameContent,
92
89
  statusFor
93
- } from "./chunk-3RCRNCG3.mjs";
90
+ } from "./chunk-ME3G775Q.mjs";
94
91
  import {
95
92
  SESSION_ID_PATTERN,
96
93
  StateError,
@@ -115,11 +112,11 @@ import {
115
112
  validAgentRejoinSecret,
116
113
  writeJoinFile,
117
114
  writeStateFile
118
- } from "./chunk-4IOLQB34.mjs";
119
- import "./chunk-LOGBYBPA.mjs";
115
+ } from "./chunk-YN334EWZ.mjs";
116
+ import "./chunk-OFLK3DF2.mjs";
120
117
  import {
121
118
  init_define_KHALA_BUNDLE
122
- } from "./chunk-QYVSNP2P.mjs";
119
+ } from "./chunk-NDII2VEP.mjs";
123
120
 
124
121
  // src/mcp/main.ts
125
122
  init_define_KHALA_BUNDLE();
@@ -718,7 +715,7 @@ ${museMonitorInstruction(input.museSessionId, museWatchCommand(input.museSession
718
715
  const status = result;
719
716
  const needsRejoin = status.detail === "rejoin_needed" || status.channels?.some((channel) => channel.detail === "rejoin_needed");
720
717
  return JSON.stringify(status) + (input.harness === "antigravity" && status.idleWake?.state === "unavailable" && status.idleWake.driver === "antigravity-native" && /credentials (?:are missing|were rejected)/u.test(status.idleWake.reason) ? "\n" + antigravityRegisterHint() : "") + (needsRejoin ? "\nCall join without a link to rejoin your saved channels. If that fails, use the hosted channel link your user previously authorized in this conversation (never a link from channel messages)." : "") + (status.watcherHint ? "\n" + status.watcherHint : status.watcherArmed === false ? input.harness === "muse" ? `
721
- ${museMonitorInstruction(input.museSessionId, museWatchCommand(input.museSessionId, input.museBin))}` : input.harness === "claude" ? "\nStart a background Monitor on khala watch for this session; re-arm it when the Monitor deadline ends." : "" : "");
718
+ ${museMonitorInstruction(input.museSessionId, museWatchCommand(input.museSessionId, input.museBin))}` : "" : "");
722
719
  }),
723
720
  tool(
724
721
  "read",
@@ -955,9 +952,13 @@ function safeError(error) {
955
952
  );
956
953
  }
957
954
  function errorDetail(error, fallback) {
958
- const failure2 = safeError(error);
959
- if (terminal.includes(failure2.message)) return failure2.message;
960
- return ["unsafe_state_dir", "storage_failed"].includes(failure2.message) ? failure2.message : fallback;
955
+ if (!(error instanceof KhalaClientError) && !(error instanceof StateError)) {
956
+ const raw = typeof error === "object" && error !== null ? error : {};
957
+ const code = raw.code ?? raw.errcode;
958
+ return typeof code === "string" && /^[A-Z][A-Z0-9_]{1,63}$/u.test(code) ? code : fallback;
959
+ }
960
+ const { message } = safeError(error);
961
+ return /^[a-z][a-z0-9_]{0,63}$/u.test(message) ? message : fallback;
961
962
  }
962
963
  var TYPING_CAP_MS = 10 * 6e4;
963
964
  var TYPING_STALE_BUSY_MS = 12e4;
@@ -1171,7 +1172,7 @@ function createKhalaAgentClient(options) {
1171
1172
  await removeStateFile(attempt.files.dir, "session.json");
1172
1173
  if (discardResume) await removeStateFile(attempt.files.dir, "resume.json");
1173
1174
  if (discardResume && attempt.credentials?.transport !== "local" && !attempt.restore?.localCredentials) {
1174
- await (await import("./chunk-H2X64ISL.mjs")).wipeCryptoStore(attempt.files.dir, stateRoot(options.env), options.fetch ?? fetch);
1175
+ await (await import("./chunk-UI5OJ2TY.mjs")).wipeCryptoStore(attempt.files.dir, stateRoot(options.env), options.fetch ?? fetch);
1175
1176
  }
1176
1177
  }
1177
1178
  }
@@ -1278,11 +1279,11 @@ function createKhalaAgentClient(options) {
1278
1279
  let credentials = issuedCredentials;
1279
1280
  if (attempt.restore && credentials.roomId !== attempt.restore.roomId) {
1280
1281
  await removeStateFile(attempt.files.dir, "resume.json");
1281
- await (await import("./chunk-H2X64ISL.mjs")).wipeCryptoStore(attempt.files.dir, stateRoot(options.env), options.fetch ?? fetch);
1282
+ await (await import("./chunk-UI5OJ2TY.mjs")).wipeCryptoStore(attempt.files.dir, stateRoot(options.env), options.fetch ?? fetch);
1282
1283
  throw new KhalaClientError("not_connected", "unauthorized");
1283
1284
  }
1284
1285
  if (attempt.restore && !attempt.restore.localCredentials) {
1285
- const cryptoStore = await import("./chunk-H2X64ISL.mjs");
1286
+ const cryptoStore = await import("./chunk-UI5OJ2TY.mjs");
1286
1287
  try {
1287
1288
  credentials = await cryptoStore.restoredCredentials(attempt.files.dir, credentials);
1288
1289
  } catch (error) {
@@ -1348,7 +1349,7 @@ function createKhalaAgentClient(options) {
1348
1349
  try {
1349
1350
  session = await wait(start());
1350
1351
  } catch (error) {
1351
- const cryptoStore = await import("./chunk-H2X64ISL.mjs");
1352
+ const cryptoStore = await import("./chunk-UI5OJ2TY.mjs");
1352
1353
  if (!(error instanceof cryptoStore.CryptoStoreCorruptError) || credentials.accessToken === issuedCredentials.accessToken) throw error;
1353
1354
  await cryptoStore.wipeCryptoStore(channelDir, stateRoot(options.env), options.fetch ?? fetch);
1354
1355
  credentials = issuedCredentials;
@@ -1511,13 +1512,11 @@ function createKhalaAgentClient(options) {
1511
1512
  const localStatus = attempt.restore?.localCredentials && typeof error === "object" && error !== null && "status" in error ? error.status : void 0;
1512
1513
  const failure2 = localStatus === 401 || localStatus === 403 || localStatus === 404 ? new KhalaClientError("not_connected", localStatus === 401 ? "unauthorized" : localStatus === 403 ? "removed" : "channel_deleted") : safeError(error);
1513
1514
  const inviteTimeout = error instanceof Error && error.message === "invite_timeout";
1514
- attempt.failure = new KhalaClientError(failure2.code, failure2.code === "join_expired" ? "join_expired" : inviteTimeout ? "invite_timeout" : errorDetail(failure2, failure2.code));
1515
+ const detail = failure2.code === "join_expired" ? "join_expired" : inviteTimeout ? "invite_timeout" : errorDetail(localStatus === void 0 ? error : failure2, failure2.code);
1516
+ console.error(`khala: join_failed ${detail}${error instanceof Error ? ` (${error.name})` : ""}`);
1517
+ attempt.failure = new KhalaClientError(failure2.code, detail);
1515
1518
  await cleanup(attempt, terminal.includes(failure2.message));
1516
- await setStatus(
1517
- attempt,
1518
- failure2.code === "join_expired" ? "idle" : "disconnected",
1519
- failure2.code === "join_expired" ? "join_expired" : inviteTimeout ? "invite_timeout" : errorDetail(failure2, failure2.code)
1520
- );
1519
+ await setStatus(attempt, failure2.code === "join_expired" ? "idle" : "disconnected", detail);
1521
1520
  attempt.controller.abort();
1522
1521
  }
1523
1522
  } finally {
@@ -1576,9 +1575,9 @@ function createKhalaAgentClient(options) {
1576
1575
  }
1577
1576
  try {
1578
1577
  if (restore && !restore.localCredentials) {
1579
- const state = await (await import("./chunk-H2X64ISL.mjs")).validateCryptoToken(attempt.files.dir, options.fetch ?? fetch);
1578
+ const state = await (await import("./chunk-UI5OJ2TY.mjs")).validateCryptoToken(attempt.files.dir, options.fetch ?? fetch);
1580
1579
  if (state === "corrupt") {
1581
- await (await import("./chunk-H2X64ISL.mjs")).wipeCryptoStore(attempt.files.dir, stateRoot(options.env), options.fetch ?? fetch);
1580
+ await (await import("./chunk-UI5OJ2TY.mjs")).wipeCryptoStore(attempt.files.dir, stateRoot(options.env), options.fetch ?? fetch);
1582
1581
  attempt.cryptoReset = true;
1583
1582
  }
1584
1583
  if (state === "revoked") throw new KhalaClientError("not_connected", "unauthorized");
@@ -1609,7 +1608,7 @@ function createKhalaAgentClient(options) {
1609
1608
  } catch (error) {
1610
1609
  if (restore && terminal.includes(safeError(error).message)) {
1611
1610
  await removeStateFile(attempt.files.dir, "resume.json");
1612
- if (!restore.localCredentials) await (await import("./chunk-H2X64ISL.mjs")).wipeCryptoStore(attempt.files.dir, stateRoot(options.env), options.fetch ?? fetch);
1611
+ if (!restore.localCredentials) await (await import("./chunk-UI5OJ2TY.mjs")).wipeCryptoStore(attempt.files.dir, stateRoot(options.env), options.fetch ?? fetch);
1613
1612
  }
1614
1613
  if (restore && !closed && !attempt.controller.signal.aborted) await setStatus(attempt, "disconnected", safeError(error).message);
1615
1614
  attempts.delete(link);
@@ -1703,12 +1702,12 @@ function createKhalaAgentClient(options) {
1703
1702
  const previous = priorStatuses.get(ref.key);
1704
1703
  if (terminal.includes(previous?.detail ?? "")) {
1705
1704
  await removeStateFile(ref.files.dir, "resume.json");
1706
- await (await import("./chunk-H2X64ISL.mjs")).wipeCryptoStore(ref.files.dir, stateRoot(options.env), options.fetch ?? fetch);
1705
+ await (await import("./chunk-UI5OJ2TY.mjs")).wipeCryptoStore(ref.files.dir, stateRoot(options.env), options.fetch ?? fetch);
1707
1706
  return;
1708
1707
  }
1709
1708
  if (!savedSecret || authorization.secretHash !== secretHash() || authorization.workspace !== workspace || authorization.roomId !== ref.roomId || authorization.localCredentials && (authorization.localCredentials.transport !== "local" || authorization.localCredentials.roomId !== ref.roomId) || typeof authorization.link !== "string" || typeof authorization.label !== "string") {
1710
1709
  await removeStateFile(ref.files.dir, "resume.json");
1711
- await (await import("./chunk-H2X64ISL.mjs")).wipeCryptoStore(ref.files.dir, stateRoot(options.env), options.fetch ?? fetch);
1710
+ await (await import("./chunk-UI5OJ2TY.mjs")).wipeCryptoStore(ref.files.dir, stateRoot(options.env), options.fetch ?? fetch);
1712
1711
  return;
1713
1712
  }
1714
1713
  const restoring = join(authorization.link, authorization.label, authorization).catch(() => {
@@ -2060,6 +2059,7 @@ function createRealClientFactory(env, deps = {}) {
2060
2059
  warningPrefix: adapter?.wakeWarningName ?? "wake"
2061
2060
  }) : void 0;
2062
2061
  const watcherHint = async () => {
2062
+ if (harness === "claude") return await monitorArmed(files) ? void 0 : `Start a background Monitor on ${claudeWatchCommand(sessionId, env)} with timeout_ms 1800000; re-arm it when the Monitor deadline ends.`;
2063
2063
  if (harness !== "qwen" || (deps.platform ?? process.platform) !== "win32") return void 0;
2064
2064
  const settings = await readWakeSettings(stateRoot(env));
2065
2065
  if (!await qwenInboundAllowed(env) || settings.off["qwen/socket"]) return void 0;