@minionry/minion 0.7.36 → 0.7.39

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 (120) hide show
  1. package/bin/commands/minions.js +19 -0
  2. package/bin/minion.js +33 -4
  3. package/dist/server/cli/headless/claude-invoker-process.js +23 -7
  4. package/dist/server/cli/headless/claude-invoker-stream.js +8 -3
  5. package/dist/server/cli/headless/haiku-assessments.js +2 -1
  6. package/dist/server/cli/headless/mcp-config.js +2 -1
  7. package/dist/server/engines/claude/claude-command.js +1 -0
  8. package/dist/server/engines/factory.js +2 -0
  9. package/dist/server/engines/hermes/HermesEngine.js +112 -219
  10. package/dist/server/engines/hermes/hermes-gateway-registry.js +467 -0
  11. package/dist/server/index.js +10 -4
  12. package/dist/server/mcp/bouncer-integration.js +3 -2
  13. package/dist/server/mcp/classifier/ClaudeBouncerClassifier.js +35 -8
  14. package/dist/server/mcp/classifier/shadow-eval-scheduler.js +42 -0
  15. package/dist/server/mcp/classifier/telemetry.js +0 -0
  16. package/dist/server/mcp/permission-channels.js +176 -0
  17. package/dist/server/mcp/security-analysis.js +9 -1
  18. package/dist/server/mcp/security-audit.js +22 -2
  19. package/dist/server/mcp/security-patterns.js +73 -1
  20. package/dist/server/mcp/server.js +80 -50
  21. package/dist/server/routes/internal.js +6 -1
  22. package/dist/server/routes/notifications.js +6 -18
  23. package/dist/server/server-setup.js +24 -48
  24. package/dist/server/services/analytics.js +4 -2
  25. package/dist/server/services/browser/host-mock.js +6 -1
  26. package/dist/server/services/browser/host.js +27 -3
  27. package/dist/server/services/browser/reasoning-agent.js +3 -1
  28. package/dist/server/services/chain/chain-engine.js +494 -0
  29. package/dist/server/services/chain/chain-store.js +542 -0
  30. package/dist/server/services/git/haiku.js +2 -2
  31. package/dist/server/services/plan/agents/check-injection.md +43 -2
  32. package/dist/server/services/plan/agents/review-code.md +62 -3
  33. package/dist/server/services/plan/agents/review-quality.md +52 -2
  34. package/dist/server/services/plan/board-export.js +4 -0
  35. package/dist/server/services/plan/composer-prompt.js +27 -8
  36. package/dist/server/services/plan/composer.js +10 -4
  37. package/dist/server/services/plan/config-installer.js +4 -83
  38. package/dist/server/services/plan/executor.js +155 -73
  39. package/dist/server/services/plan/issue-effort.js +9 -21
  40. package/dist/server/services/plan/issue-prompt-builder.js +72 -9
  41. package/dist/server/services/plan/parser-core.js +6 -1
  42. package/dist/server/services/plan/quality-delta.js +6 -24
  43. package/dist/server/services/plan/readiness-planner.js +12 -4
  44. package/dist/server/services/plan/record-file.js +52 -0
  45. package/dist/server/services/plan/review-approval.js +64 -0
  46. package/dist/server/services/plan/review-gate.js +186 -77
  47. package/dist/server/services/plan/review-outcome.js +146 -0
  48. package/dist/server/services/plan/review-report.js +28 -1
  49. package/dist/server/services/plan/review-target.js +57 -0
  50. package/dist/server/services/plan/state-reconciler.js +3 -3
  51. package/dist/server/services/plan/template-diff.js +2 -0
  52. package/dist/server/services/plan/template-instantiator.js +4 -0
  53. package/dist/server/services/plan/watcher.js +11 -1
  54. package/dist/server/services/platform-reconnect.js +7 -0
  55. package/dist/server/services/platform-token-lifecycle.js +2 -1
  56. package/dist/server/services/platform.js +293 -50
  57. package/dist/server/services/relay-http-client.js +107 -0
  58. package/dist/server/services/schedule/agent-schedule-store.js +69 -8
  59. package/dist/server/services/schedule/agent-scheduler.js +48 -7
  60. package/dist/server/services/schedule/daily-timing.js +52 -0
  61. package/dist/server/services/schedule/prompt-file.js +55 -0
  62. package/dist/server/services/schedule/run-bootstrap.js +20 -5
  63. package/dist/server/services/schedule/schedule-store.js +54 -4
  64. package/dist/server/services/schedule/schedule-wire.js +17 -0
  65. package/dist/server/services/schedule/scheduler.js +43 -9
  66. package/dist/server/services/sdk/agent-schedule.js +294 -0
  67. package/dist/server/services/sdk/agents.js +95 -13
  68. package/dist/server/services/sdk/app-tools.js +44 -7
  69. package/dist/server/services/sdk/atomic-write.js +75 -0
  70. package/dist/server/services/sdk/browser.js +5 -1
  71. package/dist/server/services/sdk/composer.js +2 -0
  72. package/dist/server/services/sdk/file-change-notify.js +60 -13
  73. package/dist/server/services/sdk/files-app.js +12 -7
  74. package/dist/server/services/sdk/files-search.js +14 -0
  75. package/dist/server/services/sdk/files-transfer.js +1 -1
  76. package/dist/server/services/sdk/files-watch.js +721 -0
  77. package/dist/server/services/sdk/files-workspace.js +37 -11
  78. package/dist/server/services/sdk/inference-claude.js +4 -2
  79. package/dist/server/services/sdk/inference.js +16 -2
  80. package/dist/server/services/sdk/pm-chain.js +0 -0
  81. package/dist/server/services/sdk/pm-schedule.js +72 -15
  82. package/dist/server/services/sdk/pm.js +22 -0
  83. package/dist/server/services/sdk/rate-limits.js +32 -0
  84. package/dist/server/services/sdk/registry.js +40 -2
  85. package/dist/server/services/sdk/terminal.js +1 -1
  86. package/dist/server/services/sentry.js +5 -1
  87. package/dist/server/services/terminal/pty-manager.js +26 -11
  88. package/dist/server/services/terminal/pty-utils.js +12 -1
  89. package/dist/server/services/terminal/terminal-modes.js +87 -0
  90. package/dist/server/services/timeline/assembler.js +2 -2
  91. package/dist/server/services/timeline/index.js +1 -1
  92. package/dist/server/services/websocket/agent-schedule-handlers.js +62 -4
  93. package/dist/server/services/websocket/ask-user-question-bridge.js +2 -2
  94. package/dist/server/services/websocket/browser-agent-runtime.js +3 -1
  95. package/dist/server/services/websocket/browser-handlers.js +5 -2
  96. package/dist/server/services/websocket/browser-viewer-lifecycle.js +8 -0
  97. package/dist/server/services/websocket/file-explorer-handlers.js +17 -0
  98. package/dist/server/services/websocket/file-transfer-http.js +12 -6
  99. package/dist/server/services/websocket/handler.js +185 -33
  100. package/dist/server/services/websocket/msg-id-tracker.js +94 -19
  101. package/dist/server/services/websocket/plan-execution-handlers.js +33 -5
  102. package/dist/server/services/websocket/plan-handlers.js +10 -5
  103. package/dist/server/services/websocket/plan-helpers.js +23 -0
  104. package/dist/server/services/websocket/plan-issue-handlers.js +161 -4
  105. package/dist/server/services/websocket/plan-sprint-handlers.js +3 -2
  106. package/dist/server/services/websocket/schedule-handlers.js +8 -2
  107. package/dist/server/services/websocket/sdk-agent-host.js +5 -1
  108. package/dist/server/services/websocket/sdk-agent-schedule-host.js +30 -0
  109. package/dist/server/services/websocket/sdk-browser-host.js +11 -4
  110. package/dist/server/services/websocket/sdk-handlers.js +6 -1
  111. package/dist/server/services/websocket/sdk-pm-chain-host.js +20 -0
  112. package/dist/server/services/websocket/sdk-pm-execution-host.js +21 -14
  113. package/dist/server/services/websocket/sdk-pm-schedule-host.js +9 -0
  114. package/dist/server/services/websocket/sdk-terminal-host.js +7 -0
  115. package/dist/server/services/websocket/settings-handlers.js +6 -18
  116. package/dist/server/services/websocket/tab-broadcast.js +5 -1
  117. package/dist/server/services/websocket/terminal-handlers.js +51 -6
  118. package/dist/server/services/websocket/types.js +6 -5
  119. package/dist/server/services/websocket/viewer-interest.js +30 -0
  120. package/package.json +6 -6
@@ -4,9 +4,41 @@ import { statSync } from 'node:fs';
4
4
  import { platform } from 'node:os';
5
5
  import { isAbsolute } from 'node:path';
6
6
  import { AnalyticsEvents, trackEvent } from '../analytics.js';
7
+ import { isSdkOpenedTerminalId } from '../sdk/terminal.js';
7
8
  import { getPTYManager, reloadPty } from '../terminal/pty-manager.js';
9
+ import { canAddressViewer } from './browser-viewer-registry.js';
8
10
  import { notifySdkTerminalSessionOpened } from './sdk-terminal-host.js';
9
- export async function handleTerminalMessage(ctx, ws, msg, tabId, workingDir) {
11
+ const INPUT_SEQ_WINDOW = 1024;
12
+ const appliedInputSeqs = new Map();
13
+ function isRepeatedInput(terminalId, device, inputSeq) {
14
+ if (device === undefined || typeof inputSeq !== 'number' || !Number.isSafeInteger(inputSeq) || inputSeq < 0)
15
+ return false;
16
+ let devices = appliedInputSeqs.get(terminalId);
17
+ if (!devices) {
18
+ devices = new Map();
19
+ appliedInputSeqs.set(terminalId, devices);
20
+ }
21
+ const applied = devices.get(device);
22
+ if (!applied) {
23
+ devices.set(device, { highest: inputSeq, recent: new Set([inputSeq]) });
24
+ return false;
25
+ }
26
+ if (inputSeq <= applied.highest - INPUT_SEQ_WINDOW || applied.recent.has(inputSeq))
27
+ return true;
28
+ applied.recent.add(inputSeq);
29
+ applied.highest = Math.max(applied.highest, inputSeq);
30
+ if (applied.recent.size > 2 * INPUT_SEQ_WINDOW) {
31
+ for (const seq of applied.recent) {
32
+ if (seq <= applied.highest - INPUT_SEQ_WINDOW)
33
+ applied.recent.delete(seq);
34
+ }
35
+ }
36
+ return false;
37
+ }
38
+ function forgetInputSeqs(terminalId) {
39
+ appliedInputSeqs.delete(terminalId);
40
+ }
41
+ export async function handleTerminalMessage(ctx, ws, msg, tabId, workingDir, viewerId) {
10
42
  const termId = msg.terminalId || tabId;
11
43
  switch (msg.type) {
12
44
  case 'terminalInit':
@@ -19,13 +51,15 @@ export async function handleTerminalMessage(ctx, ws, msg, tabId, workingDir) {
19
51
  handleTerminalList(ctx, ws);
20
52
  break;
21
53
  case 'terminalInput':
54
+ if (isRepeatedInput(termId, canAddressViewer(ws, viewerId) ? viewerId : undefined, msg.data?.inputSeq))
55
+ break;
22
56
  handleTerminalInput(ctx, ws, termId, msg.data?.input);
23
57
  break;
24
58
  case 'terminalResize':
25
59
  handleTerminalResize(ctx, termId, msg.data?.cols, msg.data?.rows);
26
60
  break;
27
61
  case 'terminalClose':
28
- handleTerminalClose(ctx, ws, termId);
62
+ handleTerminalClose(ctx, termId);
29
63
  break;
30
64
  }
31
65
  }
@@ -45,13 +79,22 @@ async function handleTerminalInit(ctx, ws, terminalId, workingDir, requestedCwd,
45
79
  });
46
80
  return;
47
81
  }
82
+ if (isSdkOpenedTerminalId(terminalId) && !ptyManager.exists(terminalId)) {
83
+ ctx.send(ws, {
84
+ type: 'terminalError',
85
+ terminalId,
86
+ data: { error: 'Terminal session not found', sessionNotFound: true }
87
+ });
88
+ return;
89
+ }
48
90
  addTerminalSubscriber(ctx, terminalId, ws);
49
91
  setupTerminalBroadcastListeners(ctx, terminalId);
50
92
  const effectiveCwd = resolveEffectiveCwd(requestedCwd, workingDir);
51
93
  try {
52
- const { shell, cwd, isReconnect, platform } = await ptyManager.create(terminalId, effectiveCwd, cols || 80, rows || 24, requestedShell);
94
+ const { shell, cwd, isReconnect, platform } = await ptyManager.create(terminalId, effectiveCwd, cols || undefined, rows || undefined, requestedShell);
53
95
  if (!isReconnect) {
54
- ctx.broadcastToOthers(ws, {
96
+ forgetInputSeqs(terminalId);
97
+ ctx.broadcastToAll({
55
98
  type: 'terminalCreated',
56
99
  data: { terminalId, shell, cwd }
57
100
  });
@@ -144,7 +187,7 @@ function handleTerminalResize(_ctx, terminalId, cols, rows) {
144
187
  const ptyManager = getPTYManager();
145
188
  ptyManager.resize(terminalId, cols, rows);
146
189
  }
147
- function handleTerminalClose(ctx, ws, terminalId) {
190
+ function handleTerminalClose(ctx, terminalId) {
148
191
  trackEvent(AnalyticsEvents.TERMINAL_SESSION_CLOSED);
149
192
  const listenerCleanup = ctx.terminalListenerCleanups.get(terminalId);
150
193
  if (listenerCleanup) {
@@ -154,8 +197,9 @@ function handleTerminalClose(ctx, ws, terminalId) {
154
197
  const ptyManager = getPTYManager();
155
198
  const ownerLabel = ptyManager.getSessionInfo(terminalId)?.ownerLabel;
156
199
  ptyManager.close(terminalId);
200
+ forgetInputSeqs(terminalId);
157
201
  ctx.terminalSubscribers.delete(terminalId);
158
- ctx.broadcastToOthers(ws, {
202
+ ctx.broadcastToAll({
159
203
  type: 'terminalClosed',
160
204
  data: { terminalId, ...(ownerLabel !== undefined ? { ownerLabel } : {}) }
161
205
  });
@@ -209,6 +253,7 @@ function setupTerminalBroadcastListeners(ctx, terminalId) {
209
253
  ptyManager.off('error', onError);
210
254
  ctx.terminalListenerCleanups.delete(terminalId);
211
255
  ctx.terminalSubscribers.delete(terminalId);
256
+ forgetInputSeqs(terminalId);
212
257
  }
213
258
  };
214
259
  const onError = (tid, error) => {
@@ -12,7 +12,7 @@ export const GitDiffMessages = ['gitDiff', 'gitShowCommit', 'gitCommitDiff'];
12
12
  export const GitTagMessages = ['gitListTags', 'gitCreateTag', 'gitPushTag'];
13
13
  export const GitWorktreeMessages = ['gitWorktreeList', 'gitWorktreeCreate', 'gitWorktreeCreateAndAssign', 'gitWorktreeRemove', 'tabWorktreeSwitch', 'tabRepoWorktreeSwitch', 'gitWorktreePush', 'gitWorktreeCreatePR'];
14
14
  export const GitMergeMessages = ['gitMergePreview', 'gitWorktreeMerge', 'gitMergeAbort', 'gitMergeComplete', 'gitMergeStashPop', 'gitMergeDiscardBlockers'];
15
- const SessionSyncMessages = ['getActiveTabs', 'createTab', 'reorderTabs', 'syncTabMeta', 'removeTab', 'markTabViewed', 'setTabEngine'];
15
+ const SessionSyncMessages = ['getActiveTabs', 'createTab', 'reorderTabs', 'syncTabMeta', 'removeTab', 'markTabViewed', 'setTabEngine', 'viewerInterest'];
16
16
  const SettingsMessages = ['getSettings', 'updateSettings', 'getModelCatalog'];
17
17
  const SystemPromptMessages = [
18
18
  'getSystemPromptProfiles',
@@ -24,7 +24,7 @@ const SystemPromptMessages = [
24
24
  const FileUploadMessages = ['fileUploadStart', 'fileUploadChunk', 'fileUploadComplete', 'fileUploadCancel'];
25
25
  const FileDownloadMessages = ['fileDownloadStart', 'fileDownloadCancel'];
26
26
  export const FileShareMessages = ['fileShareListDirectory', 'fileShareReadFile', 'fileShareDownloadStart', 'fileShareDownloadCancel'];
27
- export const PlanMessages = ['planInit', 'planGetState', 'planListIssues', 'planGetIssue', 'planGetSprint', 'planGetMilestone', 'planUpdateIssue', 'planDeleteIssue', 'planScaffold', 'planPrompt', 'planExecute', 'planExecuteEpic', 'planPause', 'planStop', 'planResume', 'queueEnqueueComposerPrompt', 'queueRemoveComposerPrompt', 'queueClearComposerPrompts', 'getPmTimeline'];
27
+ export const PlanMessages = ['planInit', 'planGetState', 'planListIssues', 'planGetIssue', 'planGetSprint', 'planGetMilestone', 'planUpdateIssue', 'planReviewDecision', 'planDeleteIssue', 'planScaffold', 'planPrompt', 'planExecute', 'planExecuteEpic', 'planPause', 'planStop', 'planResume', 'queueEnqueueComposerPrompt', 'queueRemoveComposerPrompt', 'queueClearComposerPrompts', 'getPmTimeline'];
28
28
  export const PlanBoardMessages = ['planCreateBoard', 'planUpdateBoard', 'planArchiveBoard', 'planRestoreBoard', 'planGetBoard', 'planGetBoardState', 'planReorderBoards', 'planSetActiveBoard', 'planGetBoardArtifacts', 'planExportBoard', 'planImportBoard', 'planDownloadBoard', 'planInstantiateTemplate'];
29
29
  export const PlanSprintMessages = ['planCreateSprint', 'planActivateSprint', 'planCompleteSprint', 'planGetSprintArtifacts'];
30
30
  export const PlanScheduleMessages = ['planScheduleCreate', 'planScheduleUpdate', 'planScheduleDelete', 'planScheduleList', 'planScheduleValidateSource'];
@@ -32,7 +32,7 @@ export const AgentScheduleMessages = ['agentScheduleCreate', 'agentScheduleUpdat
32
32
  const SkillMessages = ['listSkills', 'chatToBoard'];
33
33
  const SnippetMessages = ['snippetAutocomplete', 'snippetList', 'snippetCreate', 'snippetGet', 'snippetUpdate'];
34
34
  export const InstanceMessages = ['shutdownInstance', 'restartInstance'];
35
- export const SdkMessages = ['sdkConnect', 'sdkRequest', 'sdkAgentRun', 'sdkPmWrite', 'sdkPmExecute', 'sdkPmSchedule', 'sdkFilesWrite', 'sdkStorageWrite', 'sdkCancel', 'sdkRevoke', 'sdkAgentSession', 'sdkAgentInteract', 'sdkGitWrite', 'sdkTerminalWrite', 'sdkToolsServe', 'sdkQualityWrite', 'sdkBrowserWrite', 'sdkConsentDecision', 'sdkInferenceRun', 'sdkEndpointsWrite'];
35
+ export const SdkMessages = ['sdkConnect', 'sdkRequest', 'sdkAgentRun', 'sdkPmWrite', 'sdkPmExecute', 'sdkPmSchedule', 'sdkPmChain', 'sdkFilesWrite', 'sdkStorageWrite', 'sdkCancel', 'sdkRevoke', 'sdkAgentSession', 'sdkAgentInteract', 'sdkGitWrite', 'sdkTerminalWrite', 'sdkToolsServe', 'sdkQualityWrite', 'sdkBrowserWrite', 'sdkConsentDecision', 'sdkInferenceRun', 'sdkEndpointsWrite'];
36
36
  export const AppsMessages = ['appInstallLocal', 'appServeStatus', 'appStop', 'appUpdate', 'appGreenlightDecision', 'appSpaceList', 'appSpaceAdd', 'appSpaceRemove', 'appSpaceConfigure'];
37
37
  export const EngineAuthMessages = [
38
38
  'engineAuthStatus',
@@ -50,7 +50,7 @@ export const DEFAULT_ENGINE_ID = 'claude-code';
50
50
  export function normalizeEngineId(value) {
51
51
  return isEngineId(value) ? value : DEFAULT_ENGINE_ID;
52
52
  }
53
- const CoreResponseMessages = ['output', 'thinking', 'movementStart', 'movementComplete', 'movementError', 'sessionUpdate', 'history', 'sessions', 'sessionsCount', 'sessionDeleted', 'sessionData', 'historyCleared', 'searchResults', 'newSession', 'autocomplete', 'fileContent', 'error', 'pong', 'tabInitialized', 'approvalRequired', 'toolUse', 'streamingTokens', 'executionTargetUpdate', 'notificationSummary', 'executeAck', 'clientOffline', 'clientAuthExpired', 'askUserQuestion', 'askUserQuestionDismissed', 'askUserQuestionAutoAnswered', 'timelineSnapshot', 'timelineEvent', 'timelinePage', 'sessionExported', 'sessionImported'];
53
+ const CoreResponseMessages = ['output', 'thinking', 'movementStart', 'movementComplete', 'movementError', 'sessionUpdate', 'history', 'sessions', 'sessionsCount', 'sessionDeleted', 'sessionData', 'historyCleared', 'searchResults', 'newSession', 'autocomplete', 'fileContent', 'error', 'pong', 'tabInitialized', 'approvalRequired', 'toolUse', 'streamingTokens', 'executionTargetUpdate', 'notificationSummary', 'executeAck', 'duplicateIgnored', 'clientOffline', 'clientAuthExpired', 'askUserQuestion', 'askUserQuestionDismissed', 'askUserQuestionAutoAnswered', 'timelineSnapshot', 'timelineEvent', 'timelinePage', 'sessionExported', 'sessionImported'];
54
54
  const TerminalResponseMessages = ['terminalOutput', 'terminalReady', 'terminalExit', 'terminalError', 'terminalList', 'terminalScrollback', 'terminalCreated', 'terminalClosed'];
55
55
  const FileExplorerResponseMessages = ['directoryListing', 'fileWritten', 'fileCreated', 'directoryCreated', 'fileDeleted', 'fileRenamed', 'fileOpened', 'fileContentChanged', 'contentSearchResults', 'contentSearchComplete', 'contentSearchError', 'definitionResult', 'fileError'];
56
56
  export const CollabResponseMessages = ['collabJoined', 'collabUpdate', 'collabCursor', 'collabRoster', 'collabSaved', 'collabPushRejected', 'collabEnded', 'collabError'];
@@ -74,8 +74,9 @@ const FileDownloadResponseMessages = ['fileDownloadReady', 'fileDownloadChunk',
74
74
  const FileShareResponseMessages = ['fileShareDirectoryListing', 'fileShareFileContent', 'fileShareError', 'fileShareDownloadReady', 'fileShareDownloadChunk', 'fileShareDownloadComplete', 'fileShareDownloadError'];
75
75
  export const PlanResponseMessages = ['planState', 'planIssueList', 'planIssue', 'planSprint', 'planMilestone', 'planNotFound', 'planStateUpdated', 'planIssueUpdated', 'planIssueDeleted', 'planScaffolded', 'planPromptStreaming', 'planPromptToolUse', 'planPromptProgress', 'planPromptTokens', 'planPromptResponse', 'planExecutionStarted', 'planExecutionProgress', 'planExecutionOutput', 'planExecutionPrompt', 'planExecutionToolUse', 'planExecutionTokens', 'planExecutionMetrics', 'planExecutionComplete', 'planExecutionError', 'planError', 'composerPromptQueueSync', 'pmTimelineSnapshot', 'pmTimelineEvent'];
76
76
  const PlanBoardResponseMessages = ['planBoardCreated', 'planBoardUpdated', 'planBoardArchived', 'planBoardState', 'planBoardArtifacts', 'planWorkspaceUpdated', 'planBoardExported', 'planBoardImported', 'planBoardDownloaded', 'planTemplateInstantiated'];
77
- const PlanSprintResponseMessages = ['planSprintCreated', 'planSprintUpdated', 'planSprintCompleted', 'planSprintArtifacts', 'planReviewProgress'];
77
+ const PlanSprintResponseMessages = ['planSprintCreated', 'planSprintUpdated', 'planSprintCompleted', 'planSprintArtifacts', 'planReviewProgress', 'planIssueAbandoned'];
78
78
  const PlanScheduleResponseMessages = ['planScheduleCreated', 'planScheduleUpdated', 'planScheduleDeleted', 'planScheduleListResult', 'planScheduleValidateSourceResult', 'planSchedulesChanged', 'planScheduleFired'];
79
+ const PlanChainResponseMessages = ['planChainsChanged', 'planChainFired'];
79
80
  export const AgentScheduleResponseMessages = ['agentScheduleCreated', 'agentScheduleUpdated', 'agentScheduleDeleted', 'agentScheduleListResult', 'agentSchedulesChanged', 'agentScheduleFired'];
80
81
  const SkillResponseMessages = ['skillsList', 'chatToBoardCreated'];
81
82
  const SnippetResponseMessages = ['snippetSuggestions', 'snippetListResult', 'snippetExpansion', 'snippetCreateResult', 'snippetGetResult', 'snippetUpdateResult'];
@@ -0,0 +1,30 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ export const HIGH_FREQUENCY_TAB_EVENTS = new Set([
4
+ 'output',
5
+ 'thinking',
6
+ 'streamingTokens',
7
+ 'toolUse',
8
+ 'timelineEvent',
9
+ ]);
10
+ export function isHighFrequencyTabEvent(type) {
11
+ return HIGH_FREQUENCY_TAB_EVENTS.has(type);
12
+ }
13
+ export class ViewerInterestRegistry {
14
+ byConnection = new WeakMap();
15
+ declare(connection, interest) {
16
+ this.byConnection.set(connection, interest);
17
+ }
18
+ interestOf(connection) {
19
+ return this.byConnection.get(connection) ?? 'full';
20
+ }
21
+ wantsStreams(connection) {
22
+ return this.interestOf(connection) === 'full';
23
+ }
24
+ forget(connection) {
25
+ this.byConnection.delete(connection);
26
+ }
27
+ }
28
+ export function parseStreamInterest(value) {
29
+ return value === 'full' || value === 'lite' ? value : null;
30
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@minionry/minion",
3
- "version": "0.7.36",
3
+ "version": "0.7.39",
4
4
  "description": "Command-line client that connects this machine to Minionry.",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -56,11 +56,11 @@
56
56
  "@codemirror/collab": "^6.1.1",
57
57
  "@codemirror/state": "^6.5.4",
58
58
  "@hono/node-server": "^1.19.6",
59
- "@minionry/app-manifest": "^0.1.14",
60
- "@minionry/browser-types": "^0.1.8",
59
+ "@minionry/app-manifest": "^0.1.16",
60
+ "@minionry/browser-types": "^0.1.10",
61
61
  "@minionry/e2ee": "file:vendor/e2ee",
62
- "@minionry/roles": "^0.2.12",
63
- "@minionry/sdk": "^0.4.22",
62
+ "@minionry/roles": "^0.2.14",
63
+ "@minionry/sdk": "^0.5.2",
64
64
  "@modelcontextprotocol/sdk": "^1.21.1",
65
65
  "@sentry/core": "^10.54.0",
66
66
  "fflate": "^0.8.3",
@@ -81,5 +81,5 @@
81
81
  "devDependencies": {
82
82
  "node-pty": "^1.1.0"
83
83
  },
84
- "gitHead": "0df8aa79f7246517aa99e32373d8d7ac0b18f051"
84
+ "gitHead": "6b9df70a44e601c53068ffc155c5f04c11111f81"
85
85
  }