adhdev 0.9.34 → 0.9.36

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.js CHANGED
@@ -9954,7 +9954,14 @@ var init_handler = __esm({
9954
9954
  await this._ctx.providerLoader.fetchLatest().catch(() => {
9955
9955
  });
9956
9956
  this._ctx.providerLoader.reload();
9957
- return { success: true };
9957
+ this._ctx.providerLoader.registerToDetector();
9958
+ const refreshedInstances = this._ctx.instanceManager ? this._ctx.instanceManager.refreshProviderDefinitions((providerType) => this._ctx.providerLoader.resolve(providerType)) : 0;
9959
+ const providers = this._ctx.providerLoader.getAll().map((provider) => ({
9960
+ type: provider.type,
9961
+ name: provider.name,
9962
+ category: provider.category
9963
+ }));
9964
+ return { success: true, refreshedInstances, providers };
9958
9965
  }
9959
9966
  return { success: false, error: "ProviderLoader not initialized" };
9960
9967
  }
@@ -11810,6 +11817,8 @@ var init_provider_cli_adapter = __esm({
11810
11817
  messages = [];
11811
11818
  committedMessages = [];
11812
11819
  structuredMessages = [];
11820
+ committedMessagesActivitySignature = "";
11821
+ committedMessagesChangedAt = 0;
11813
11822
  currentStatus = "starting";
11814
11823
  onStatusChange = null;
11815
11824
  responseBuffer = "";
@@ -11891,10 +11900,35 @@ var init_provider_cli_adapter = __esm({
11891
11900
  providerResolutionMeta;
11892
11901
  static FINISH_RETRY_DELAY_MS = 300;
11893
11902
  static MAX_FINISH_RETRIES = 2;
11903
+ buildCommittedMessagesActivitySignature() {
11904
+ const last = this.committedMessages[this.committedMessages.length - 1];
11905
+ return [
11906
+ String(this.committedMessages.length),
11907
+ String(last?.role || ""),
11908
+ String(last?.kind || ""),
11909
+ String(last?.senderName || ""),
11910
+ String(last?.timestamp || ""),
11911
+ String(last?.receivedAt || ""),
11912
+ normalizeComparableMessageContent(last?.content || "").slice(-240)
11913
+ ].join("|");
11914
+ }
11894
11915
  syncMessageViews() {
11916
+ const signature = this.buildCommittedMessagesActivitySignature();
11917
+ if (signature !== this.committedMessagesActivitySignature) {
11918
+ this.committedMessagesActivitySignature = signature;
11919
+ this.committedMessagesChangedAt = Date.now();
11920
+ }
11895
11921
  this.messages = [...this.committedMessages];
11896
11922
  this.structuredMessages = [...this.committedMessages];
11897
11923
  }
11924
+ getLastCommittedMessageActivityAt() {
11925
+ const last = this.committedMessages[this.committedMessages.length - 1];
11926
+ const messageTime = Math.max(
11927
+ typeof last?.receivedAt === "number" && Number.isFinite(last.receivedAt) ? last.receivedAt : 0,
11928
+ typeof last?.timestamp === "number" && Number.isFinite(last.timestamp) ? last.timestamp : 0
11929
+ );
11930
+ return Math.max(messageTime, this.committedMessagesChangedAt || 0);
11931
+ }
11898
11932
  readTerminalScreenText(now = Date.now()) {
11899
11933
  const screenText = this.terminalScreen.getText() || "";
11900
11934
  this.lastScreenText = screenText;
@@ -11923,7 +11957,16 @@ var init_provider_cli_adapter = __esm({
11923
11957
  if (baseMessages.length <= _ProviderCliAdapter.PARSE_MESSAGE_TAIL_LIMIT) return baseMessages;
11924
11958
  return baseMessages.slice(-_ProviderCliAdapter.PARSE_MESSAGE_TAIL_LIMIT);
11925
11959
  }
11960
+ messagesShareStableIdentity(left2, right2) {
11961
+ if (left2 === right2) return true;
11962
+ if (!left2 || !right2) return false;
11963
+ if ((left2.role || "") !== (right2.role || "")) return false;
11964
+ if (left2.id && right2.id && String(left2.id) === String(right2.id)) return true;
11965
+ if (typeof left2.index === "number" && typeof right2.index === "number" && left2.index === right2.index) return true;
11966
+ return false;
11967
+ }
11926
11968
  messagesComparable(left2, right2) {
11969
+ if (this.messagesShareStableIdentity(left2, right2)) return true;
11927
11970
  if (!left2 || !right2) return false;
11928
11971
  if ((left2.role || "") !== (right2.role || "")) return false;
11929
11972
  const leftText = normalizeComparableTranscriptText(left2.content);
@@ -12034,9 +12077,16 @@ var init_provider_cli_adapter = __esm({
12034
12077
  /** Inject CLI scripts after construction (e.g. when resolved by ProviderLoader) */
12035
12078
  setCliScripts(scripts) {
12036
12079
  this.cliScripts = scripts;
12080
+ this.parsedStatusCache = null;
12081
+ this.parseErrorMessage = null;
12037
12082
  const scriptNames = listCliScriptNames(scripts);
12038
12083
  LOG.info("CLI", `[${this.cliType}] CLI scripts injected: [${scriptNames.join(", ")}]`);
12039
12084
  }
12085
+ /** Refresh provider scripts/config used by this adapter without restarting the PTY runtime. */
12086
+ refreshProviderDefinition(provider) {
12087
+ this.provider = provider;
12088
+ this.setCliScripts(provider.scripts || {});
12089
+ }
12040
12090
  updateRuntimeSettings(settings) {
12041
12091
  this.runtimeSettings = { ...settings };
12042
12092
  }
@@ -13067,6 +13117,69 @@ var init_provider_cli_adapter = __esm({
13067
13117
  this.committedMessages = normalized;
13068
13118
  this.syncMessageViews();
13069
13119
  }
13120
+ getSharedCommittedPrefixLength(parsedMessages) {
13121
+ const committedMessages = this.committedMessages;
13122
+ const max = Math.min(parsedMessages.length, committedMessages.length);
13123
+ let index = 0;
13124
+ while (index < max && this.messagesShareStableIdentity(parsedMessages[index], committedMessages[index])) {
13125
+ index += 1;
13126
+ }
13127
+ return index;
13128
+ }
13129
+ hydrateCommittedPrefixForParsedStatus(parsedMessages) {
13130
+ const sharedPrefixLength = this.getSharedCommittedPrefixLength(parsedMessages);
13131
+ if (sharedPrefixLength !== this.committedMessages.length) return null;
13132
+ const committedHydratedMessages = this.committedMessages.map((message, index) => {
13133
+ const timestamp = typeof message.timestamp === "number" && Number.isFinite(message.timestamp) ? message.timestamp : this.lastOutputAt || this.currentTurnScope?.startedAt || Date.now();
13134
+ const contentValue = message.content;
13135
+ return {
13136
+ role: message.role,
13137
+ content: typeof contentValue === "string" ? contentValue : String(contentValue || ""),
13138
+ timestamp,
13139
+ receivedAt: typeof message.receivedAt === "number" && Number.isFinite(message.receivedAt) ? message.receivedAt : timestamp,
13140
+ kind: message.kind,
13141
+ id: message.id || `msg_${index}`,
13142
+ index: typeof message.index === "number" ? message.index : index,
13143
+ meta: message.meta,
13144
+ senderName: message.senderName
13145
+ };
13146
+ });
13147
+ const extraMessages = parsedMessages.slice(sharedPrefixLength);
13148
+ if (extraMessages.length === 0) return committedHydratedMessages;
13149
+ const extraHydratedMessages = hydrateCliParsedMessages(extraMessages, {
13150
+ committedMessages: [],
13151
+ scope: this.currentTurnScope,
13152
+ lastOutputAt: this.lastOutputAt
13153
+ }).map((message, offset) => ({
13154
+ ...message,
13155
+ id: message.id || `msg_${sharedPrefixLength + offset}`,
13156
+ index: typeof message.index === "number" ? message.index : sharedPrefixLength + offset
13157
+ }));
13158
+ return [...committedHydratedMessages, ...extraHydratedMessages];
13159
+ }
13160
+ hydrateParsedMessagesForStatus(parsedMessages) {
13161
+ return this.hydrateCommittedPrefixForParsedStatus(parsedMessages) || hydrateCliParsedMessages(parsedMessages, {
13162
+ committedMessages: this.committedMessages,
13163
+ scope: this.currentTurnScope,
13164
+ lastOutputAt: this.lastOutputAt
13165
+ });
13166
+ }
13167
+ buildCommittedChatMessages() {
13168
+ return this.committedMessages.map((message, index) => {
13169
+ const contentValue = message.content;
13170
+ return buildChatMessage({
13171
+ role: message.role,
13172
+ content: typeof contentValue === "string" ? contentValue : String(contentValue || ""),
13173
+ timestamp: message.timestamp,
13174
+ kind: message.kind,
13175
+ meta: message.meta,
13176
+ senderName: message.senderName,
13177
+ id: message.id || `msg_${index}`,
13178
+ index: typeof message.index === "number" ? message.index : index,
13179
+ receivedAt: typeof message.receivedAt === "number" ? message.receivedAt : message.timestamp
13180
+ });
13181
+ });
13182
+ }
13070
13183
  /**
13071
13184
  * Script-based full parse — returns ReadChatResult.
13072
13185
  * Called by command handler / dashboard for rich content rendering.
@@ -13092,7 +13205,7 @@ var init_provider_cli_adapter = __esm({
13092
13205
  this.onStatusChange?.();
13093
13206
  }
13094
13207
  }
13095
- if (parsed && Array.isArray(parsed.messages)) {
13208
+ if (parsed && Array.isArray(parsed.messages) && this.provider.allowInputDuringGeneration === true) {
13096
13209
  const hydratedForCommit = normalizeCliParsedMessages(parsed.messages, {
13097
13210
  committedMessages: this.committedMessages,
13098
13211
  scope: this.currentTurnScope,
@@ -13111,21 +13224,21 @@ var init_provider_cli_adapter = __esm({
13111
13224
  const shouldPreferCommittedMessages = !this.currentTurnScope && !this.activeModal && this.currentStatus === "idle";
13112
13225
  let result;
13113
13226
  if (parsed && Array.isArray(parsed.messages)) {
13114
- const parsedHydratedMessages = hydrateCliParsedMessages(parsed.messages, {
13115
- committedMessages: this.committedMessages,
13116
- scope: this.currentTurnScope,
13117
- lastOutputAt: this.lastOutputAt
13118
- });
13119
- const committedHydratedMessages = this.committedMessages.map((message, index) => buildChatMessage({
13120
- ...message,
13121
- id: message.id || `msg_${index}`,
13122
- index: typeof message.index === "number" ? message.index : index,
13123
- receivedAt: typeof message.receivedAt === "number" ? message.receivedAt : message.timestamp
13124
- }));
13227
+ const parsedHydratedMessages = this.hydrateParsedMessagesForStatus(parsed.messages);
13125
13228
  const parsedLastAssistant = [...parsedHydratedMessages].reverse().find((message) => message.role === "assistant" && typeof message.content === "string" && message.content.trim());
13126
- const shouldAdoptParsedIdleReplay = !this.currentTurnScope && !this.activeModal && !!parsedLastAssistant && parsedTranscriptIsRicherThanCommitted(parsedHydratedMessages, committedHydratedMessages) && (this.currentStatus === "idle" || this.currentStatus === "generating" && this.isWaitingForResponse && parsed.status === "idle" && this.runDetectStatus(this.recentOutputBuffer) === "idle");
13229
+ const shouldAdoptParsedIdleReplay = !this.currentTurnScope && !this.activeModal && !!parsedLastAssistant && parsedTranscriptIsRicherThanCommitted(parsedHydratedMessages, this.committedMessages) && (this.currentStatus === "idle" || this.currentStatus === "generating" && this.isWaitingForResponse && parsed.status === "idle" && this.runDetectStatus(this.recentOutputBuffer) === "idle");
13127
13230
  if (shouldAdoptParsedIdleReplay) {
13128
- this.committedMessages = normalizeCliParsedMessages(parsed.messages, {
13231
+ this.committedMessages = this.getSharedCommittedPrefixLength(parsed.messages) === this.committedMessages.length ? parsedHydratedMessages.map((message) => ({
13232
+ role: message.role,
13233
+ content: typeof message.content === "string" ? message.content : String(message.content || ""),
13234
+ timestamp: message.timestamp,
13235
+ receivedAt: message.receivedAt,
13236
+ kind: message.kind,
13237
+ id: message.id,
13238
+ index: message.index,
13239
+ meta: message.meta,
13240
+ senderName: message.senderName
13241
+ })) : normalizeCliParsedMessages(parsed.messages, {
13129
13242
  committedMessages: this.committedMessages,
13130
13243
  scope: this.currentTurnScope,
13131
13244
  lastOutputAt: this.lastOutputAt
@@ -13144,15 +13257,9 @@ var init_provider_cli_adapter = __esm({
13144
13257
  this.onStatusChange?.();
13145
13258
  }
13146
13259
  }
13147
- const effectiveCommittedHydratedMessages = shouldAdoptParsedIdleReplay ? this.committedMessages.map((message, index) => buildChatMessage({
13148
- ...message,
13149
- id: message.id || `msg_${index}`,
13150
- index: typeof message.index === "number" ? message.index : index,
13151
- receivedAt: typeof message.receivedAt === "number" ? message.receivedAt : message.timestamp
13152
- })) : committedHydratedMessages;
13153
- const shouldPreferCommittedHistoryReplay = !this.currentTurnScope && !this.activeModal && effectiveCommittedHydratedMessages.length > parsedHydratedMessages.length;
13260
+ const shouldPreferCommittedHistoryReplay = !this.currentTurnScope && !this.activeModal && this.committedMessages.length > parsedHydratedMessages.length;
13154
13261
  const shouldPreferCommittedIdleReplay = shouldPreferCommittedMessages && !shouldAdoptParsedIdleReplay;
13155
- const hydratedMessages = shouldPreferCommittedIdleReplay || shouldPreferCommittedHistoryReplay ? effectiveCommittedHydratedMessages : parsedHydratedMessages;
13262
+ const hydratedMessages = shouldPreferCommittedIdleReplay || shouldPreferCommittedHistoryReplay ? this.buildCommittedChatMessages() : parsedHydratedMessages;
13156
13263
  result = {
13157
13264
  id: parsed.id || "cli_session",
13158
13265
  status: parsed.status || this.currentStatus,
@@ -14058,6 +14165,11 @@ var init_cli_provider_instance = __esm({
14058
14165
  launchMode;
14059
14166
  startedAt = Date.now();
14060
14167
  onProviderSessionResolved;
14168
+ refreshProviderDefinition(provider) {
14169
+ if (provider.type !== this.type || provider.category !== "cli") return;
14170
+ this.provider = provider;
14171
+ this.adapter.refreshProviderDefinition(provider);
14172
+ }
14061
14173
  // ─── Lifecycle ─────────────────────────────────
14062
14174
  async init(context) {
14063
14175
  this.context = context;
@@ -14268,9 +14380,11 @@ var init_cli_provider_instance = __esm({
14268
14380
  const autoApproveActive = adapterStatus.status === "waiting_approval" && this.shouldAutoApprove();
14269
14381
  const visibleStatus = autoApproveActive ? "generating" : adapterStatus.status;
14270
14382
  const runtime = this.adapter.getRuntimeMetadata();
14383
+ const lastCommittedMessageActivityAt = typeof this.adapter.getLastCommittedMessageActivityAt === "function" ? this.adapter.getLastCommittedMessageActivityAt() : 0;
14271
14384
  return {
14272
14385
  id: this.instanceId,
14273
14386
  status: visibleStatus,
14387
+ lastMessageAt: lastCommittedMessageActivityAt || void 0,
14274
14388
  runtimeLifecycle: runtime?.lifecycle ?? null,
14275
14389
  runtimeSurfaceKind: runtime?.surfaceKind,
14276
14390
  runtimeRestoredFromStorage: runtime?.restoredFromStorage === true,
@@ -39977,6 +40091,9 @@ function projectHotChatSessionStatesFromProviderState(state) {
39977
40091
  const project = (item) => ({
39978
40092
  id: item.instanceId,
39979
40093
  status: item.activeChat?.status || item.status,
40094
+ unread: item.unread,
40095
+ inboxBucket: item.inboxBucket,
40096
+ lastMessageAt: item.lastMessageAt ?? item.activeChat?.lastMessageAt,
39980
40097
  runtimeLifecycle: item.runtime?.lifecycle ?? null,
39981
40098
  runtimeSurfaceKind: item.runtime?.surfaceKind,
39982
40099
  runtimeRestoredFromStorage: item.runtime?.restoredFromStorage === true,
@@ -40189,6 +40306,17 @@ var init_provider_instance_manager = __esm({
40189
40306
  }
40190
40307
  return updated;
40191
40308
  }
40309
+ refreshProviderDefinitions(resolveProvider) {
40310
+ let refreshed = 0;
40311
+ for (const instance of this.instances.values()) {
40312
+ if (typeof instance.refreshProviderDefinition !== "function") continue;
40313
+ const provider = resolveProvider(instance.type);
40314
+ if (!provider || typeof provider !== "object") continue;
40315
+ instance.refreshProviderDefinition(provider);
40316
+ refreshed += 1;
40317
+ }
40318
+ return refreshed;
40319
+ }
40192
40320
  // ─── cleanup ──────────────────────────────────────
40193
40321
  /**
40194
40322
  * All terminate
@@ -44471,20 +44599,7 @@ var init_dev_server = __esm({
44471
44599
  async handleReload(_req, res) {
44472
44600
  try {
44473
44601
  this.providerLoader.reload();
44474
- let refreshedInstances = 0;
44475
- if (this.instanceManager) {
44476
- for (const id of this.instanceManager.listInstanceIds()) {
44477
- const instance = this.instanceManager.getInstance(id);
44478
- const providerType = typeof instance?.type === "string" ? instance.type : "";
44479
- if (!providerType) continue;
44480
- const resolved = this.providerLoader.resolve(providerType);
44481
- if (!resolved) continue;
44482
- if (instance && typeof instance === "object" && "provider" in instance) {
44483
- instance.provider = resolved;
44484
- refreshedInstances += 1;
44485
- }
44486
- }
44487
- }
44602
+ const refreshedInstances = this.instanceManager ? this.instanceManager.refreshProviderDefinitions((providerType) => this.providerLoader.resolve(providerType)) : 0;
44488
44603
  const providers = this.providerLoader.getAll().map((p) => ({
44489
44604
  type: p.type,
44490
44605
  name: p.name,
@@ -56400,7 +56515,7 @@ var init_adhdev_daemon = __esm({
56400
56515
  init_version();
56401
56516
  init_src();
56402
56517
  init_runtime_defaults();
56403
- pkgVersion = resolvePackageVersion({ injectedVersion: "0.9.34" });
56518
+ pkgVersion = resolvePackageVersion({ injectedVersion: "0.9.36" });
56404
56519
  AdhdevDaemon = class _AdhdevDaemon {
56405
56520
  localHttpServer = null;
56406
56521
  localWss = null;