@geminixiang/mikan 1.0.0-beta.18 → 1.0.0-beta.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 (39) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +62 -4
  4. package/dist/agent.js.map +1 -1
  5. package/dist/harness/extensions/loader.d.ts.map +1 -1
  6. package/dist/harness/extensions/loader.js +8 -0
  7. package/dist/harness/extensions/loader.js.map +1 -1
  8. package/dist/harness/extensions/types.d.ts +14 -1
  9. package/dist/harness/extensions/types.d.ts.map +1 -1
  10. package/dist/harness/extensions/types.js.map +1 -1
  11. package/dist/harness/index.d.ts +2 -2
  12. package/dist/harness/index.d.ts.map +1 -1
  13. package/dist/harness/index.js.map +1 -1
  14. package/dist/harness/runner.d.ts +8 -0
  15. package/dist/harness/runner.d.ts.map +1 -1
  16. package/dist/harness/runner.js +16 -5
  17. package/dist/harness/runner.js.map +1 -1
  18. package/dist/harness/session-store.d.ts +4 -1
  19. package/dist/harness/session-store.d.ts.map +1 -1
  20. package/dist/harness/session-store.js +11 -2
  21. package/dist/harness/session-store.js.map +1 -1
  22. package/dist/harness/subagent-runner.d.ts +17 -0
  23. package/dist/harness/subagent-runner.d.ts.map +1 -0
  24. package/dist/harness/subagent-runner.js +216 -0
  25. package/dist/harness/subagent-runner.js.map +1 -0
  26. package/dist/harness/types.d.ts +53 -0
  27. package/dist/harness/types.d.ts.map +1 -1
  28. package/dist/harness/types.js.map +1 -1
  29. package/dist/tools/index.d.ts +1 -0
  30. package/dist/tools/index.d.ts.map +1 -1
  31. package/dist/tools/index.js +1 -0
  32. package/dist/tools/index.js.map +1 -1
  33. package/dist/tools/subagent.d.ts +69 -0
  34. package/dist/tools/subagent.d.ts.map +1 -0
  35. package/dist/tools/subagent.js +286 -0
  36. package/dist/tools/subagent.js.map +1 -0
  37. package/dist/vault/index.js +0 -3
  38. package/dist/vault/index.js.map +1 -1
  39. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -9,6 +9,26 @@ any release.
9
9
 
10
10
  ## [Unreleased]
11
11
 
12
+ ## [1.0.0-beta.19]
13
+
14
+ ### Added
15
+
16
+ - Add fresh in-memory subagents for the main agent and extensions, with explicit tools, budgets, structured output, parallel batches, and bounded DAG orchestration.
17
+ - Stream debounced subagent node progress through the shared Slack, Discord, and Telegram response lifecycle.
18
+
19
+ ### Changed
20
+
21
+ - Let final responses at the LLM-call cap complete without tripping the run budget when no continuation is required.
22
+
23
+ ### Fixed
24
+
25
+ - Install worker binaries from the newest GitHub release that contains a matching asset, including prereleases.
26
+ - Restore generic Google Workspace CLI credential mounts in sandbox vaults.
27
+
28
+ ### Tests
29
+
30
+ - Add coverage for subagent isolation, recursion guards, budgets, structured output, parallel execution, DAG validation and dependency flow, and platform-neutral progress rendering.
31
+
12
32
  ## [1.0.0-beta.18]
13
33
 
14
34
  ### Added
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/agent.js CHANGED
@@ -3,6 +3,7 @@
3
3
  * Single module — do not split helpers that only this file uses.
4
4
  */
5
5
  import { DEFAULT_EVENT_BUDGET, defaultExtensionDirs, formatSkillsForPrompt, loadExtensions, loadSkillsFromDir, MikanAgentSession, MikanModels, parseCommandInput, } from "./harness/index.js";
6
+ import { runSubagent } from "./harness/subagent-runner.js";
6
7
  import { createHash } from "crypto";
7
8
  import { existsSync, readFileSync } from "fs";
8
9
  import { mkdir, readFile } from "fs/promises";
@@ -19,7 +20,7 @@ import { formatHistoryLine } from "./sessions/history-line.js";
19
20
  import { conversationIdOf, isThreadSessionKey } from "./sessions/session-key.js";
20
21
  import { extractSessionUuid, openManagedSession, } from "./sessions/store.js";
21
22
  import { HostEventStore } from "./tools/event.js";
22
- import { createMikanTools } from "./tools/index.js";
23
+ import { createMikanTools, createSubagentTool } from "./tools/index.js";
23
24
  import * as Sentry from "@sentry/node";
24
25
  import { emitAgentEvent } from "./agent-events.js";
25
26
  export function getUnresolvedSandboxPathContext(sandboxConfig, hostWorkspaceRoot) {
@@ -422,6 +423,7 @@ function createRunState() {
422
423
  queue: null,
423
424
  pendingTools: new Map(),
424
425
  toolProgress: new Map(),
426
+ toolProgressTimer: undefined,
425
427
  totalUsage: createEmptyUsageTotals(),
426
428
  llmCallCount: 0,
427
429
  stopReason: "stop",
@@ -441,6 +443,9 @@ function resetRunState(runState, responder, sessionConversation, userName, sessi
441
443
  };
442
444
  runState.pendingTools.clear();
443
445
  runState.toolProgress.clear();
446
+ if (runState.toolProgressTimer)
447
+ clearTimeout(runState.toolProgressTimer);
448
+ runState.toolProgressTimer = undefined;
444
449
  runState.totalUsage = createEmptyUsageTotals();
445
450
  runState.llmCallCount = 0;
446
451
  runState.stopReason = "stop";
@@ -508,6 +513,31 @@ async function replaceResponseWithToolProgress(responder, runState) {
508
513
  if (progress)
509
514
  await responder.replaceResponse(progress);
510
515
  }
516
+ const TOOL_PROGRESS_DEBOUNCE_MS = 500;
517
+ function scheduleToolProgressUpdate(responder, runState) {
518
+ if (runState.toolProgressTimer)
519
+ return;
520
+ runState.toolProgressTimer = setTimeout(() => {
521
+ runState.toolProgressTimer = undefined;
522
+ runState.queue?.enqueue(() => replaceResponseWithToolProgress(responder, runState), "tool progress update");
523
+ }, TOOL_PROGRESS_DEBOUNCE_MS);
524
+ runState.toolProgressTimer.unref();
525
+ }
526
+ function flushToolProgressUpdate(responder, runState) {
527
+ if (runState.toolProgressTimer)
528
+ clearTimeout(runState.toolProgressTimer);
529
+ runState.toolProgressTimer = undefined;
530
+ runState.queue?.enqueue(() => replaceResponseWithToolProgress(responder, runState), "tool progress update");
531
+ }
532
+ function extractToolProgressLabel(partialResult) {
533
+ if (!partialResult || typeof partialResult !== "object")
534
+ return undefined;
535
+ const details = partialResult.details;
536
+ if (!details || typeof details !== "object")
537
+ return undefined;
538
+ const label = details.progressLabel;
539
+ return typeof label === "string" && label.trim() ? label.trim().slice(0, 1000) : undefined;
540
+ }
511
541
  async function finalizeRunResponse(responder, session, runState, options) {
512
542
  if (runState.stopReason === "error" && runState.errorMessage) {
513
543
  if (!runState.reportedLlmError) {
@@ -713,7 +743,7 @@ function createRunnerExecutionContext(sandboxConfig, vaultManager, provisioner,
713
743
  * notify posts through the platform bots when main.ts provides a notifier.
714
744
  */
715
745
  function buildExtensionHostServices(params) {
716
- const { workspaceDir, vaultManager, platformNotifier, platformReactor, platformUploader } = params;
746
+ const { workspaceDir, vaultManager, platformNotifier, platformReactor, platformUploader, runSubagentService, } = params;
717
747
  const eventStore = HostEventStore.fromWorkspaceDir(workspaceDir);
718
748
  return {
719
749
  stateDir: readEnv("STATE_DIR"),
@@ -734,6 +764,7 @@ function buildExtensionHostServices(params) {
734
764
  ...(platformNotifier ? { postMessage: platformNotifier } : {}),
735
765
  ...(platformReactor ? { addReaction: platformReactor } : {}),
736
766
  ...(platformUploader ? { uploadFile: platformUploader } : {}),
767
+ ...(runSubagentService ? { runSubagent: runSubagentService } : {}),
737
768
  ...(vaultManager
738
769
  ? {
739
770
  resolveSecrets: (slug) => vaultManager.resolve(`extensions/${slug}`)?.env ?? {},
@@ -746,6 +777,15 @@ async function createConfiguredAgentSession(params) {
746
777
  // Host-only dirs under the state dir: extension code runs in the mikan
747
778
  // process, so it must never load from workspace paths — those are mounted
748
779
  // into sandbox containers and agent-writable (sandbox escape otherwise).
780
+ let contributedTools = [];
781
+ const subagentTool = createSubagentTool((request) => runSubagent({
782
+ request,
783
+ defaultModel: model,
784
+ thinkingLevel,
785
+ models,
786
+ workspaceDir,
787
+ availableTools: [...tools, ...contributedTools],
788
+ }));
749
789
  const extensionsResult = await loadExtensions({
750
790
  dirs: defaultExtensionDirs(conversationId, readEnv("STATE_DIR")),
751
791
  context: { conversationId, workspaceDir, model, thinkingLevel },
@@ -755,8 +795,17 @@ async function createConfiguredAgentSession(params) {
755
795
  platformNotifier,
756
796
  platformReactor,
757
797
  platformUploader,
798
+ runSubagentService: (request, extensionTools) => runSubagent({
799
+ request,
800
+ defaultModel: model,
801
+ thinkingLevel,
802
+ models,
803
+ workspaceDir,
804
+ availableTools: [...tools, ...extensionTools],
805
+ }),
758
806
  }),
759
807
  });
808
+ contributedTools = extensionsResult.registry.getContributedTools();
760
809
  for (const err of extensionsResult.errors) {
761
810
  log.logWarning(`[${conversationId}] Extension load error: ${err.path}`, err.error);
762
811
  }
@@ -767,7 +816,7 @@ async function createConfiguredAgentSession(params) {
767
816
  systemPrompt,
768
817
  model,
769
818
  thinkingLevel,
770
- tools,
819
+ tools: [...tools, subagentTool],
771
820
  models,
772
821
  sessionStore,
773
822
  extensions: extensionsResult.registry,
@@ -898,6 +947,15 @@ function attachSessionEventHandlers(params) {
898
947
  log.logToolStart(logCtx, event.toolName, label, event.args);
899
948
  return;
900
949
  }
950
+ if (event.type === "tool_execution_update") {
951
+ const label = extractToolProgressLabel(event.partialResult);
952
+ const progress = runState.toolProgress.get(event.toolCallId);
953
+ if (label && progress) {
954
+ progress.label = label;
955
+ scheduleToolProgressUpdate(responder, runState);
956
+ }
957
+ return;
958
+ }
901
959
  if (event.type === "tool_execution_end") {
902
960
  const resultStr = extractToolResultText(event.result);
903
961
  const pending = pendingTools.get(event.toolCallId);
@@ -909,7 +967,7 @@ function attachSessionEventHandlers(params) {
909
967
  const progress = runState.toolProgress.get(event.toolCallId);
910
968
  if (progress)
911
969
  progress.status = event.isError ? "error" : "done";
912
- queue.enqueue(() => replaceResponseWithToolProgress(responder, runState), "tool progress update");
970
+ flushToolProgressUpdate(responder, runState);
913
971
  pendingTools.delete(event.toolCallId);
914
972
  const durationMs = pending ? Date.now() - pending.startTime : 0;
915
973
  Sentry.metrics.count("agent.tool.calls", 1, {