instar 1.2.78 → 1.2.80

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.
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAyQH,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAiqDD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAohMtE;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuD5E"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA0QH,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAiqDD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmjMtE;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuD5E"}
@@ -96,6 +96,7 @@ import { resolveThreadlineMcpEntry } from '../threadline/mcpEntry.js';
96
96
  import { ThreadResumeMap } from '../threadline/ThreadResumeMap.js';
97
97
  import { ConversationStore } from '../threadline/ConversationStore.js';
98
98
  import { WarrantsReplyGate, evaluateAndRecordInbound } from '../threadline/WarrantsReplyGate.js';
99
+ import { CollaborationSurfacer } from '../threadline/CollaborationSurfacer.js';
99
100
  import { ListenerSessionManager } from '../threadline/ListenerSessionManager.js';
100
101
  import { SystemReviewer } from '../monitoring/SystemReviewer.js';
101
102
  import { createSessionProbes } from '../monitoring/probes/SessionProbe.js';
@@ -2371,14 +2372,23 @@ export async function startServer(options) {
2371
2372
  });
2372
2373
  console.log(pc.green(` Quota tracking enabled (${quotaFile})`));
2373
2374
  }
2374
- // Set up opt-in telemetry heartbeat
2375
+ // Set up opt-in telemetry heartbeat.
2376
+ // ALWAYS construct, even when disabled — fixes the chicken-and-egg deadlock
2377
+ // where POST /telemetry/enable returned 503 because the subsystem was only
2378
+ // constructed when telemetry was already enabled at boot (so it could never
2379
+ // be turned on through its own endpoint). Construction is cheap and pure;
2380
+ // the side-effects (.start()/submit()) already self-gate on `config.enabled`
2381
+ // inside TelemetryHeartbeat, so an always-constructed-but-disabled heartbeat
2382
+ // never starts a loop and never submits. Spec: docs/specs/enable-layer-coherence.md
2375
2383
  let telemetryHeartbeat;
2376
- if (config.monitoring?.telemetry?.enabled) {
2384
+ {
2377
2385
  const { TelemetryHeartbeat } = await import('../monitoring/TelemetryHeartbeat.js');
2378
- telemetryHeartbeat = new TelemetryHeartbeat(config.monitoring.telemetry, config.stateDir, config.projectDir, config.version || 'unknown');
2386
+ telemetryHeartbeat = new TelemetryHeartbeat(config.monitoring?.telemetry ?? { enabled: false }, config.stateDir, config.projectDir, config.version || 'unknown');
2379
2387
  // Note: .start() is deferred until after scheduler is available so
2380
- // TelemetryCollector can be wired for Baseline submissions.
2381
- console.log(pc.green(` Telemetry: enabled (${config.monitoring.telemetry.level || 'basic'} level, every ${Math.round((config.monitoring.telemetry.intervalMs || 21600000) / 3600000)}h)`));
2388
+ // TelemetryCollector can be wired; .start() itself no-ops when disabled.
2389
+ if (config.monitoring?.telemetry?.enabled) {
2390
+ console.log(pc.green(` Telemetry: enabled (${config.monitoring.telemetry.level || 'basic'} level, every ${Math.round((config.monitoring.telemetry.intervalMs || 21600000) / 3600000)}h)`));
2391
+ }
2382
2392
  }
2383
2393
  // ── Prompt Gate: detect and handle interactive prompts in sessions ──
2384
2394
  const promptGateConfig = config.monitoring?.promptGate;
@@ -5999,6 +6009,12 @@ export async function startServer(options) {
5999
6009
  // living on the Conversation (the one-shot worker can't self-police a loop).
6000
6010
  const conversationStore = new ConversationStore(config.stateDir);
6001
6011
  const warrantsReplyGate = new WarrantsReplyGate({ intelligence: sharedIntelligence });
6012
+ // CMT-509 §2: surface PARENTLESS Threadline conversations into a single
6013
+ // dedicated topic so a peer reaching out cold is visible (not an invisible
6014
+ // side channel). Topic-bound conversations surface via TopicLinkageHandler.
6015
+ const collaborationSurfacer = telegram
6016
+ ? new CollaborationSurfacer({ telegram, stateDir: config.stateDir })
6017
+ : undefined;
6002
6018
  const messageFormatter = new MessageFormatter();
6003
6019
  const tmuxBin = config.sessions.tmuxPath;
6004
6020
  const tmuxOps = {
@@ -6626,6 +6642,21 @@ export async function startServer(options) {
6626
6642
  }
6627
6643
  return; // short-circuit ALL three routing branches
6628
6644
  }
6645
+ // CMT-509 §2: warranted + PARENTLESS conversation (no bound topic)
6646
+ // → surface to the dedicated Threadline topic so the operator sees
6647
+ // a peer reaching out cold. Topic-bound conversations are surfaced by
6648
+ // TopicLinkageHandler instead, so we skip them here. Best-effort,
6649
+ // non-blocking; never breaks the inbound path.
6650
+ if (collaborationSurfacer) {
6651
+ const hasParentTopic = conversationStore.get(gateThreadId)?.boundTopicId != null;
6652
+ void collaborationSurfacer.surface({
6653
+ threadId: gateThreadId,
6654
+ senderName,
6655
+ text: textContent,
6656
+ hasParentTopic,
6657
+ warrants: !decision.suppress,
6658
+ });
6659
+ }
6629
6660
  }
6630
6661
  catch (gateErr) {
6631
6662
  // Gate failure → fail toward responsive (never silently drop a message).
@@ -7149,7 +7180,7 @@ export async function startServer(options) {
7149
7180
  },
7150
7181
  });
7151
7182
  }
7152
- const server = new AgentServer({ config, sessionManager, state, scheduler, telegram, relationships, feedback, feedbackAnomalyDetector, dispatches, updateChecker, autoUpdater, autoDispatcher, quotaTracker, quotaManager, publisher, viewer, tunnel, evolution, watchdog, topicMemory, triageNurse, projectMapper, coherenceGate: scopeVerifier, contextHierarchy, canonicalState, operationGate, sentinel, adaptiveTrust, memoryMonitor, orphanReaper, coherenceMonitor, commitmentTracker, semanticMemory, activitySentinel, rateLimitSentinel, messageRouter, summarySentinel, spawnManager, systemReviewer, capabilityMapper, selfKnowledgeTree, coverageAuditor, topicResumeMap: _topicResumeMap ?? undefined, sessionRefresh: _sessionRefresh ?? undefined, autonomyManager, trustElevationTracker, autonomousEvolution, coordinator: coordinator.enabled ? coordinator : undefined, localSigningKeyPem, whatsapp: whatsappAdapter, slack: slackAdapter, imessage: imessageAdapter, whatsappBusinessBackend, messageBridge, hookEventReceiver, worktreeMonitor, subagentTracker, instructionsVerifier, handshakeManager: threadlineHandshake, threadlineRouter, conversationStore, warrantsReplyGate, threadResumeMap, topicLinkageHandler: topicLinkageHandler ?? undefined, threadlineRelayClient, threadlineReplyWaiters, listenerManager: listenerManager ?? undefined, responseReviewGate, messagingToneGate, outboundDedupGate, telemetryHeartbeat, pasteManager, featureRegistry, discoveryEvaluator, completionEvaluator, unifiedTrust, liveConfig, sharedStateLedger, ledgerSessionRegistry, worktreeManager, oidcEnrolledRepos: parallelDevConfig?.oidcEnrolledRepos, initiativeTracker, projectRoundRunner, projectDriftChecker, machineHeartbeat, proxyCoordinator, topicIntentStore, usherSignalStore, intelligence: sharedIntelligence ?? undefined, telegramBridgeConfig, telegramBridge: telegramBridge ?? undefined, threadlineObservability, workingMemory, taskFlowRegistry, threadlineFlowBridge });
7183
+ const server = new AgentServer({ config, sessionManager, state, scheduler, telegram, relationships, feedback, feedbackAnomalyDetector, dispatches, updateChecker, autoUpdater, autoDispatcher, quotaTracker, quotaManager, publisher, viewer, tunnel, evolution, watchdog, topicMemory, triageNurse, projectMapper, coherenceGate: scopeVerifier, contextHierarchy, canonicalState, operationGate, sentinel, adaptiveTrust, memoryMonitor, orphanReaper, coherenceMonitor, commitmentTracker, semanticMemory, activitySentinel, rateLimitSentinel, messageRouter, summarySentinel, spawnManager, systemReviewer, capabilityMapper, selfKnowledgeTree, coverageAuditor, topicResumeMap: _topicResumeMap ?? undefined, sessionRefresh: _sessionRefresh ?? undefined, autonomyManager, trustElevationTracker, autonomousEvolution, coordinator: coordinator.enabled ? coordinator : undefined, localSigningKeyPem, whatsapp: whatsappAdapter, slack: slackAdapter, imessage: imessageAdapter, whatsappBusinessBackend, messageBridge, hookEventReceiver, worktreeMonitor, subagentTracker, instructionsVerifier, handshakeManager: threadlineHandshake, threadlineRouter, conversationStore, warrantsReplyGate, collaborationSurfacer, threadResumeMap, topicLinkageHandler: topicLinkageHandler ?? undefined, threadlineRelayClient, threadlineReplyWaiters, listenerManager: listenerManager ?? undefined, responseReviewGate, messagingToneGate, outboundDedupGate, telemetryHeartbeat, pasteManager, featureRegistry, discoveryEvaluator, completionEvaluator, unifiedTrust, liveConfig, sharedStateLedger, ledgerSessionRegistry, worktreeManager, oidcEnrolledRepos: parallelDevConfig?.oidcEnrolledRepos, initiativeTracker, projectRoundRunner, projectDriftChecker, machineHeartbeat, proxyCoordinator, topicIntentStore, usherSignalStore, intelligence: sharedIntelligence ?? undefined, telegramBridgeConfig, telegramBridge: telegramBridge ?? undefined, threadlineObservability, workingMemory, taskFlowRegistry, threadlineFlowBridge });
7153
7184
  // Boot-recovery (tunnel-failure-resilience spec Part 6): if the agent
7154
7185
  // died mid-relay-episode, the persisted tunnel.json carries
7155
7186
  // rotationPending=true. Rotate the dashboard PIN + authToken BEFORE