@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.
- package/CHANGELOG.md +20 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +62 -4
- package/dist/agent.js.map +1 -1
- package/dist/harness/extensions/loader.d.ts.map +1 -1
- package/dist/harness/extensions/loader.js +8 -0
- package/dist/harness/extensions/loader.js.map +1 -1
- package/dist/harness/extensions/types.d.ts +14 -1
- package/dist/harness/extensions/types.d.ts.map +1 -1
- package/dist/harness/extensions/types.js.map +1 -1
- package/dist/harness/index.d.ts +2 -2
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/runner.d.ts +8 -0
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +16 -5
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session-store.d.ts +4 -1
- package/dist/harness/session-store.d.ts.map +1 -1
- package/dist/harness/session-store.js +11 -2
- package/dist/harness/session-store.js.map +1 -1
- package/dist/harness/subagent-runner.d.ts +17 -0
- package/dist/harness/subagent-runner.d.ts.map +1 -0
- package/dist/harness/subagent-runner.js +216 -0
- package/dist/harness/subagent-runner.js.map +1 -0
- package/dist/harness/types.d.ts +53 -0
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/subagent.d.ts +69 -0
- package/dist/tools/subagent.d.ts.map +1 -0
- package/dist/tools/subagent.js +286 -0
- package/dist/tools/subagent.js.map +1 -0
- package/dist/vault/index.js +0 -3
- package/dist/vault/index.js.map +1 -1
- 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
|
package/dist/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,OAAO,EAAY,KAAK,YAAY,EAAc,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAUL,WAAW,EAKZ,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,OAAO,EAAY,KAAK,YAAY,EAAc,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAUL,WAAW,EAKZ,MAAM,oBAAoB,CAAC;AAM5B,OAAO,KAAK,EAEV,mBAAmB,EAIpB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAGV,gBAAgB,EAChB,eAAe,EAEf,gBAAgB,EAChB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAKrE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIrD,OAAO,EAGL,KAAK,oBAAoB,EAE1B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAKhE,wBAAgB,+BAA+B,CAC7C,aAAa,EAAE,aAAa,EAC5B,iBAAiB,EAAE,MAAM,GACxB,kBAAkB,CAMpB;AAED,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,kBAAkB,GAC9B,MAAM,CAER;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,kBAAkB,GAC9B,MAAM,CAKR;AAsDD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,mBAAmB,EAC5B,aAAa,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,kBAAkB,GAC/B;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,YAAY,EAAE,CAAC;CAClC,CAaA;AAsHD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,GAAG,MAAM,GAAG,UAAU,CAAC,GAC7D,MAAM,GAAG,SAAS,CAOpB;AA6KD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,OAAO,EACvB,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,YAAY,EAAE,MAAM,GACnB,MAAM,CAkBR;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAYR;AAgnCD,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,oBAAoB,CAAC;IACnC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,kBAAkB,CAAC,EAAE,yBAAyB,CAAC;IAC/C,WAAW,CAAC,EAAE;QACZ,UAAU,EAAE,yBAAyB,CAAC;QACtC,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,yBAAyB,CAAC,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAC/D,8EAA8E;IAC9E,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CA4SxF"}
|
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
|
-
|
|
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, {
|