@adhdev/daemon-core 0.9.34 → 0.9.35

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.
@@ -47,6 +47,7 @@ export interface CliAdapter {
47
47
  isReady(): boolean;
48
48
  setOnStatusChange(callback: () => void): void;
49
49
  updateRuntimeSettings?(settings: Record<string, unknown>): void;
50
+ setCliScripts?(scripts: Record<string, unknown>): void;
50
51
  setServerConn?(serverConn: unknown): void;
51
52
  clearHistory?(): void;
52
53
  resolveAction?(data: unknown): Promise<void>;
@@ -34,6 +34,8 @@ export declare class ProviderCliAdapter implements CliAdapter {
34
34
  private messages;
35
35
  private committedMessages;
36
36
  private structuredMessages;
37
+ private committedMessagesActivitySignature;
38
+ private committedMessagesChangedAt;
37
39
  private currentStatus;
38
40
  private onStatusChange;
39
41
  private responseBuffer;
@@ -107,7 +109,9 @@ export declare class ProviderCliAdapter implements CliAdapter {
107
109
  private readonly providerResolutionMeta;
108
110
  private static readonly FINISH_RETRY_DELAY_MS;
109
111
  private static readonly MAX_FINISH_RETRIES;
112
+ private buildCommittedMessagesActivitySignature;
110
113
  private syncMessageViews;
114
+ getLastCommittedMessageActivityAt(): number;
111
115
  private readTerminalScreenText;
112
116
  private shouldReadTerminalScreenSnapshot;
113
117
  private resetTerminalScreen;
@@ -131,6 +135,8 @@ export declare class ProviderCliAdapter implements CliAdapter {
131
135
  constructor(provider: CliProviderModule, workingDir: string, extraArgs?: string[], transportFactory?: PtyTransportFactory);
132
136
  /** Inject CLI scripts after construction (e.g. when resolved by ProviderLoader) */
133
137
  setCliScripts(scripts: CliScripts): void;
138
+ /** Refresh provider scripts/config used by this adapter without restarting the PTY runtime. */
139
+ refreshProviderDefinition(provider: CliProviderModule): void;
134
140
  updateRuntimeSettings(settings: Record<string, any>): void;
135
141
  setServerConn(serverConn: any): void;
136
142
  setOnStatusChange(callback: () => void): void;
package/dist/index.js CHANGED
@@ -2087,6 +2087,8 @@ var init_provider_cli_adapter = __esm({
2087
2087
  messages = [];
2088
2088
  committedMessages = [];
2089
2089
  structuredMessages = [];
2090
+ committedMessagesActivitySignature = "";
2091
+ committedMessagesChangedAt = 0;
2090
2092
  currentStatus = "starting";
2091
2093
  onStatusChange = null;
2092
2094
  responseBuffer = "";
@@ -2168,10 +2170,35 @@ var init_provider_cli_adapter = __esm({
2168
2170
  providerResolutionMeta;
2169
2171
  static FINISH_RETRY_DELAY_MS = 300;
2170
2172
  static MAX_FINISH_RETRIES = 2;
2173
+ buildCommittedMessagesActivitySignature() {
2174
+ const last = this.committedMessages[this.committedMessages.length - 1];
2175
+ return [
2176
+ String(this.committedMessages.length),
2177
+ String(last?.role || ""),
2178
+ String(last?.kind || ""),
2179
+ String(last?.senderName || ""),
2180
+ String(last?.timestamp || ""),
2181
+ String(last?.receivedAt || ""),
2182
+ normalizeComparableMessageContent(last?.content || "").slice(-240)
2183
+ ].join("|");
2184
+ }
2171
2185
  syncMessageViews() {
2186
+ const signature = this.buildCommittedMessagesActivitySignature();
2187
+ if (signature !== this.committedMessagesActivitySignature) {
2188
+ this.committedMessagesActivitySignature = signature;
2189
+ this.committedMessagesChangedAt = Date.now();
2190
+ }
2172
2191
  this.messages = [...this.committedMessages];
2173
2192
  this.structuredMessages = [...this.committedMessages];
2174
2193
  }
2194
+ getLastCommittedMessageActivityAt() {
2195
+ const last = this.committedMessages[this.committedMessages.length - 1];
2196
+ const messageTime = Math.max(
2197
+ typeof last?.receivedAt === "number" && Number.isFinite(last.receivedAt) ? last.receivedAt : 0,
2198
+ typeof last?.timestamp === "number" && Number.isFinite(last.timestamp) ? last.timestamp : 0
2199
+ );
2200
+ return Math.max(messageTime, this.committedMessagesChangedAt || 0);
2201
+ }
2175
2202
  readTerminalScreenText(now = Date.now()) {
2176
2203
  const screenText = this.terminalScreen.getText() || "";
2177
2204
  this.lastScreenText = screenText;
@@ -2311,9 +2338,16 @@ var init_provider_cli_adapter = __esm({
2311
2338
  /** Inject CLI scripts after construction (e.g. when resolved by ProviderLoader) */
2312
2339
  setCliScripts(scripts) {
2313
2340
  this.cliScripts = scripts;
2341
+ this.parsedStatusCache = null;
2342
+ this.parseErrorMessage = null;
2314
2343
  const scriptNames = listCliScriptNames(scripts);
2315
2344
  LOG.info("CLI", `[${this.cliType}] CLI scripts injected: [${scriptNames.join(", ")}]`);
2316
2345
  }
2346
+ /** Refresh provider scripts/config used by this adapter without restarting the PTY runtime. */
2347
+ refreshProviderDefinition(provider) {
2348
+ this.provider = provider;
2349
+ this.setCliScripts(provider.scripts || {});
2350
+ }
2317
2351
  updateRuntimeSettings(settings) {
2318
2352
  this.runtimeSettings = { ...settings };
2319
2353
  }
@@ -12978,7 +13012,14 @@ var DaemonCommandHandler = class {
12978
13012
  await this._ctx.providerLoader.fetchLatest().catch(() => {
12979
13013
  });
12980
13014
  this._ctx.providerLoader.reload();
12981
- return { success: true };
13015
+ this._ctx.providerLoader.registerToDetector();
13016
+ const refreshedInstances = this._ctx.instanceManager ? this._ctx.instanceManager.refreshProviderDefinitions((providerType) => this._ctx.providerLoader.resolve(providerType)) : 0;
13017
+ const providers = this._ctx.providerLoader.getAll().map((provider) => ({
13018
+ type: provider.type,
13019
+ name: provider.name,
13020
+ category: provider.category
13021
+ }));
13022
+ return { success: true, refreshedInstances, providers };
12982
13023
  }
12983
13024
  return { success: false, error: "ProviderLoader not initialized" };
12984
13025
  }
@@ -13233,6 +13274,11 @@ var CliProviderInstance = class {
13233
13274
  launchMode;
13234
13275
  startedAt = Date.now();
13235
13276
  onProviderSessionResolved;
13277
+ refreshProviderDefinition(provider) {
13278
+ if (provider.type !== this.type || provider.category !== "cli") return;
13279
+ this.provider = provider;
13280
+ this.adapter.refreshProviderDefinition(provider);
13281
+ }
13236
13282
  // ─── Lifecycle ─────────────────────────────────
13237
13283
  async init(context) {
13238
13284
  this.context = context;
@@ -13443,9 +13489,11 @@ var CliProviderInstance = class {
13443
13489
  const autoApproveActive = adapterStatus.status === "waiting_approval" && this.shouldAutoApprove();
13444
13490
  const visibleStatus = autoApproveActive ? "generating" : adapterStatus.status;
13445
13491
  const runtime = this.adapter.getRuntimeMetadata();
13492
+ const lastCommittedMessageActivityAt = typeof this.adapter.getLastCommittedMessageActivityAt === "function" ? this.adapter.getLastCommittedMessageActivityAt() : 0;
13446
13493
  return {
13447
13494
  id: this.instanceId,
13448
13495
  status: visibleStatus,
13496
+ lastMessageAt: lastCommittedMessageActivityAt || void 0,
13449
13497
  runtimeLifecycle: runtime?.lifecycle ?? null,
13450
13498
  runtimeSurfaceKind: runtime?.surfaceKind,
13451
13499
  runtimeRestoredFromStorage: runtime?.restoredFromStorage === true,
@@ -20932,6 +20980,9 @@ function projectHotChatSessionStatesFromProviderState(state) {
20932
20980
  const project = (item) => ({
20933
20981
  id: item.instanceId,
20934
20982
  status: item.activeChat?.status || item.status,
20983
+ unread: item.unread,
20984
+ inboxBucket: item.inboxBucket,
20985
+ lastMessageAt: item.lastMessageAt ?? item.activeChat?.lastMessageAt,
20935
20986
  runtimeLifecycle: item.runtime?.lifecycle ?? null,
20936
20987
  runtimeSurfaceKind: item.runtime?.surfaceKind,
20937
20988
  runtimeRestoredFromStorage: item.runtime?.restoredFromStorage === true,
@@ -21139,6 +21190,17 @@ var ProviderInstanceManager = class {
21139
21190
  }
21140
21191
  return updated;
21141
21192
  }
21193
+ refreshProviderDefinitions(resolveProvider) {
21194
+ let refreshed = 0;
21195
+ for (const instance of this.instances.values()) {
21196
+ if (typeof instance.refreshProviderDefinition !== "function") continue;
21197
+ const provider = resolveProvider(instance.type);
21198
+ if (!provider || typeof provider !== "object") continue;
21199
+ instance.refreshProviderDefinition(provider);
21200
+ refreshed += 1;
21201
+ }
21202
+ return refreshed;
21203
+ }
21142
21204
  // ─── cleanup ──────────────────────────────────────
21143
21205
  /**
21144
21206
  * All terminate
@@ -25383,20 +25445,7 @@ var DevServer = class _DevServer {
25383
25445
  async handleReload(_req, res) {
25384
25446
  try {
25385
25447
  this.providerLoader.reload();
25386
- let refreshedInstances = 0;
25387
- if (this.instanceManager) {
25388
- for (const id of this.instanceManager.listInstanceIds()) {
25389
- const instance = this.instanceManager.getInstance(id);
25390
- const providerType = typeof instance?.type === "string" ? instance.type : "";
25391
- if (!providerType) continue;
25392
- const resolved = this.providerLoader.resolve(providerType);
25393
- if (!resolved) continue;
25394
- if (instance && typeof instance === "object" && "provider" in instance) {
25395
- instance.provider = resolved;
25396
- refreshedInstances += 1;
25397
- }
25398
- }
25399
- }
25448
+ const refreshedInstances = this.instanceManager ? this.instanceManager.refreshProviderDefinitions((providerType) => this.providerLoader.resolve(providerType)) : 0;
25400
25449
  const providers = this.providerLoader.getAll().map((p) => ({
25401
25450
  type: p.type,
25402
25451
  name: p.name,