nolo-cli 0.80.0 → 0.81.0

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 (61) hide show
  1. package/{_executeModel-UXVEB3GO.js → _executeModel-JIG7MRXQ.js} +14 -14
  2. package/{agentDeleteCommand-OODHSL4K.js → agentDeleteCommand-THAZ5GQS.js} +3 -3
  3. package/{agentEmailCommands-3R73WSCD.js → agentEmailCommands-A7T7AJA4.js} +16 -16
  4. package/{agentListCommands-TBTEXV2E.js → agentListCommands-BRZFEJQM.js} +6 -6
  5. package/{agentMachineCommands-3GKE6ZHG.js → agentMachineCommands-DM4N5PK3.js} +4 -4
  6. package/{agentRecordCommands-3664GLRE.js → agentRecordCommands-TTAEMNHB.js} +16 -16
  7. package/{agentRunCommand-YNSEOBTR.js → agentRunCommand-JVSTGVG2.js} +16 -16
  8. package/{agentRunControl-XLGD3UZ5.js → agentRunControl-WCTKX5VL.js} +2 -2
  9. package/{agentRuntimeLocal-5BX6PI4X.js → agentRuntimeLocal-73CVIWBB.js} +3 -3
  10. package/{agentSlice-KTVOEUDX.js → agentSlice-6X4JL2E3.js} +1 -1
  11. package/{appDeleteCommands-UNTBD55Y.js → appDeleteCommands-S7CK4OYL.js} +3 -3
  12. package/{appDeployCommands-LOF4JNBZ.js → appDeployCommands-U6TMS5GO.js} +3 -3
  13. package/{appDeployStatusCommands-MMLE6BDW.js → appDeployStatusCommands-DTNQJ3LJ.js} +3 -3
  14. package/{appGetCommands-WFJAJK6B.js → appGetCommands-3SHZEQD5.js} +3 -3
  15. package/{appListCommands-NC265RGX.js → appListCommands-E2ZMIUB6.js} +3 -3
  16. package/{chatQueueReduxAdapter-4YQF4NHY.js → chatQueueReduxAdapter-LAQEZQKE.js} +2 -2
  17. package/{chunk-NTW5GWDM.js → chunk-3VNWWVKB.js} +2 -0
  18. package/{chunk-EFVDQUCT.js → chunk-3WD6RUUJ.js} +2 -2
  19. package/{chunk-DWUCB2A3.js → chunk-42V6BK2E.js} +1 -1
  20. package/{chunk-GFD4ALW3.js → chunk-54ADB4W7.js} +1 -1
  21. package/{chunk-D2P6UDPQ.js → chunk-6FVRQBRR.js} +14 -8
  22. package/{chunk-FLLFOP5L.js → chunk-7OLPQSMQ.js} +1 -1
  23. package/{chunk-35EWBHJO.js → chunk-ESWUWEFS.js} +3 -3
  24. package/{chunk-CJCJF5XB.js → chunk-FDTR4QJ6.js} +4 -2
  25. package/{chunk-SQZDZXP5.js → chunk-HWIZU4OL.js} +1 -1
  26. package/{chunk-LIIKM7DD.js → chunk-JCIHVIVG.js} +5 -5
  27. package/{chunk-LBEDNSMY.js → chunk-K4YGZD3P.js} +8 -8
  28. package/{chunk-TRCMIJA7.js → chunk-LXF6XQDT.js} +36 -22
  29. package/{chunk-OA6Q2A4I.js → chunk-LZIWMYX4.js} +78 -18
  30. package/{chunk-NKRYKK7T.js → chunk-R2B3MIZA.js} +2 -2
  31. package/{chunk-IAO6JBYW.js → chunk-RG6JBBX5.js} +5 -1
  32. package/{chunk-H3PIH2EO.js → chunk-SQQVLHMH.js} +3 -3
  33. package/{chunk-DEUUPHOO.js → chunk-TDRTS7QW.js} +1 -1
  34. package/{chunk-4OZYL5FG.js → chunk-TZJJ77KQ.js} +99 -13
  35. package/{chunk-CPH3W5A7.js → chunk-WGR3J4Q6.js} +86 -1
  36. package/{chunk-HMPEO3ZE.js → chunk-Y5HW6GM2.js} +2 -2
  37. package/{chunk-MPV6E6WR.js → chunk-YVIV7WT4.js} +156 -32
  38. package/{chunk-MWAO7TZZ.js → chunk-ZWUOR654.js} +37 -5
  39. package/{contentThunks-2USKJBI4.js → contentThunks-ATLWNC2D.js} +3 -3
  40. package/{cooldownCommands-BSCH2W7P.js → cooldownCommands-REAWYVTY.js} +2 -2
  41. package/{createAgentAutomationAction-NTLU42X2.js → createAgentAutomationAction-QYYWTVUR.js} +3 -3
  42. package/{createDialogAction-UCYF4BUN.js → createDialogAction-7I5VGWCR.js} +4 -4
  43. package/{createPageAction-QFGUGZ5M.js → createPageAction-WNURYCWU.js} +3 -3
  44. package/{dialogCommands-X4OB6SC6.js → dialogCommands-RILHDRQ5.js} +3 -3
  45. package/{dialogSlice-HQFQIQDZ.js → dialogSlice-W5BYELVR.js} +2 -2
  46. package/{docCreateCommands-DFST4PFR.js → docCreateCommands-GSTPU7SG.js} +3 -3
  47. package/{docDeleteCommands-V37JZOSP.js → docDeleteCommands-2FC3LSUT.js} +3 -3
  48. package/{docReadCommands-Z64VDPDQ.js → docReadCommands-27POBA34.js} +3 -3
  49. package/{docStore-GVWEDN5E.js → docStore-7LAHBFP2.js} +1 -1
  50. package/{docUpdateCommands-I6FB6ENK.js → docUpdateCommands-U4II6VCO.js} +3 -3
  51. package/{handleSendMessageAction-TLB2SAU4.js → handleSendMessageAction-SKMJMVRU.js} +2 -2
  52. package/index.js +47 -47
  53. package/{machineCommands-PV5XA7UF.js → machineCommands-S2RNYKVJ.js} +16 -16
  54. package/{machineWsRunDispatch-W2DPC7TZ.js → machineWsRunDispatch-JC44LBLP.js} +16 -16
  55. package/package.json +1 -1
  56. package/{readlineWorkspace-PHZXJKJM.js → readlineWorkspace-VZSBXUH4.js} +17 -17
  57. package/{runAgentClientLoop-26DG6ZEY.js → runAgentClientLoop-ZYENU7GH.js} +12 -12
  58. package/{spaceCommands-3QH2QFNW.js → spaceCommands-QB3NNEMN.js} +3 -3
  59. package/{streamAgentChatTurn-BY7IPY5C.js → streamAgentChatTurn-43GPPQSN.js} +13 -13
  60. package/{tools-4Y2EYH5D.js → tools-SX6Y4STZ.js} +9 -9
  61. package/{updateDialogTitleAction-2S4DCP35.js → updateDialogTitleAction-VAKA4ZNY.js} +3 -3
@@ -7,7 +7,7 @@ import {
7
7
  import {
8
8
  clipMultilineText,
9
9
  fetchAndSerializeTable
10
- } from "./chunk-4OZYL5FG.js";
10
+ } from "./chunk-TZJJ77KQ.js";
11
11
  import {
12
12
  isGatewayHttpStatus
13
13
  } from "./chunk-NF64D32W.js";
@@ -28,13 +28,13 @@ import {
28
28
  } from "./chunk-MEYIRKDN.js";
29
29
  import {
30
30
  fetchAndCacheMessages
31
- } from "./chunk-LBEDNSMY.js";
31
+ } from "./chunk-K4YGZD3P.js";
32
32
  import {
33
33
  shouldUseServerProxy
34
34
  } from "./chunk-YYLHWIW6.js";
35
35
  import {
36
36
  fetchServerSyncedCredential
37
- } from "./chunk-H3PIH2EO.js";
37
+ } from "./chunk-SQQVLHMH.js";
38
38
  import {
39
39
  buildSkillGuidancePromptBlock,
40
40
  extractRuntimePageCapabilities,
@@ -45,9 +45,10 @@ import {
45
45
  buildIdentityBlock,
46
46
  buildRuntimeGuidanceBlocks,
47
47
  compileContextLayers,
48
+ detectDispatchIntentFromMessages,
48
49
  normalizeChatCompletionsBodyForProvider,
49
50
  resolveToolGuidedSections
50
- } from "./chunk-OA6Q2A4I.js";
51
+ } from "./chunk-LZIWMYX4.js";
51
52
  import {
52
53
  convertMessagesToResponsesInput,
53
54
  getUsageRequestOptions,
@@ -619,7 +620,9 @@ var buildSystemPromptContext = (options) => {
619
620
  ${mainPrompt}` : "";
620
621
  const agentTools = canonicalizeToolNames(agentConfig.tools ?? []);
621
622
  const hasAskTool = agentTools.includes("ask_user");
622
- const toolSections = resolveToolGuidedSections(agentTools);
623
+ const toolSections = resolveToolGuidedSections(agentTools, {
624
+ dispatchIntent: options.dispatchIntent === true
625
+ });
623
626
  const {
624
627
  startupProtocol,
625
628
  contextLayerContract,
@@ -699,8 +702,9 @@ var applyClaudeCache = (stableContent, dynamicContent) => {
699
702
  var prependPromptMessage = (messages, agentConfig, resolvedModel, language, contexts, prependSystemPrompt = true) => {
700
703
  if (!prependSystemPrompt) return messages;
701
704
  if (!contexts && !agentConfig.prompt) return messages;
705
+ const dispatchIntent = detectDispatchIntentFromMessages(messages);
702
706
  if (isClaudeModel(resolvedModel)) {
703
- const compiled = buildSystemPromptContext({ agentConfig, language, contexts });
707
+ const compiled = buildSystemPromptContext({ agentConfig, language, contexts, dispatchIntent });
704
708
  if (!compiled.content.trim()) return messages;
705
709
  const content = applyClaudeCache(
706
710
  compiled.stablePrefixContent,
@@ -709,7 +713,7 @@ var prependPromptMessage = (messages, agentConfig, resolvedModel, language, cont
709
713
  const systemMessage2 = { role: "system", content };
710
714
  return [systemMessage2, ...messages];
711
715
  }
712
- const promptContent = buildSystemPrompt({ agentConfig, language, contexts });
716
+ const promptContent = buildSystemPrompt({ agentConfig, language, contexts, dispatchIntent });
713
717
  if (!promptContent.trim()) return messages;
714
718
  const systemMessage = { role: "system", content: promptContent };
715
719
  return [systemMessage, ...messages];
@@ -892,7 +896,9 @@ function generateResponseRequestBody(agentConfig, msgs, contexts, prependSystemP
892
896
  const promptContent = buildSystemPrompt({
893
897
  agentConfig,
894
898
  language,
895
- contexts
899
+ contexts,
900
+ // 按当前用户输入检测派发意图:无意图只注入最小派发协议(安全硬门常在)。
901
+ dispatchIntent: detectDispatchIntentFromMessages(msgs)
896
902
  });
897
903
  body.instructions = promptContent;
898
904
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  clearCliLocalRuntimePreparedAgentCache
3
- } from "./chunk-MPV6E6WR.js";
3
+ } from "./chunk-YVIV7WT4.js";
4
4
  import {
5
5
  getReadableCliDb
6
6
  } from "./chunk-LS2ZANRJ.js";
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  createCliLocalRuntimeAdapter,
3
3
  summarizeEndpoint
4
- } from "./chunk-MPV6E6WR.js";
4
+ } from "./chunk-YVIV7WT4.js";
5
5
  import {
6
6
  clipMultilineText
7
- } from "./chunk-4OZYL5FG.js";
7
+ } from "./chunk-TZJJ77KQ.js";
8
8
  import {
9
9
  runLocalAgentTurn
10
- } from "./chunk-MWAO7TZZ.js";
10
+ } from "./chunk-ZWUOR654.js";
11
11
  import {
12
12
  applyToolSurfaceConstraints
13
13
  } from "./chunk-IIVGDG4I.js";
@@ -46,6 +46,7 @@ function extractMessage(error) {
46
46
  }
47
47
  function parseResetsInMs(text) {
48
48
  if (!text) return void 0;
49
+ const sanitized = text.replace(/\btrace[\s_-]?id\b[^)\n]*/gi, " ").replace(/\b[0-9a-f]{16,}\b/gi, " ");
49
50
  const unitMs = (n, unit) => {
50
51
  if (/^d/.test(unit)) return n * 24 * 3600 * 1e3;
51
52
  if (/^h/.test(unit)) return n * 3600 * 1e3;
@@ -54,12 +55,13 @@ function parseResetsInMs(text) {
54
55
  return NaN;
55
56
  };
56
57
  const re = /(\d+)\s*(d(?:ay|ays)?|h(?:r|rs|our|ours)?|m(?:in|ins|inute|inutes)?|s(?:ec|ecs|econd|econds)?)/gi;
58
+ const MAX_SINGLE_MATCH_MS = 7 * 24 * 3600 * 1e3;
57
59
  let totalMs = 0;
58
60
  let matched = false;
59
61
  let m;
60
- while ((m = re.exec(text)) !== null) {
62
+ while ((m = re.exec(sanitized)) !== null) {
61
63
  const ms = unitMs(Number(m[1]), m[2]);
62
- if (!Number.isFinite(ms)) continue;
64
+ if (!Number.isFinite(ms) || ms > MAX_SINGLE_MATCH_MS) continue;
63
65
  totalMs += ms;
64
66
  matched = true;
65
67
  }
@@ -9,7 +9,7 @@ import {
9
9
  initReactI18next,
10
10
  instance,
11
11
  toast
12
- } from "./chunk-LBEDNSMY.js";
12
+ } from "./chunk-K4YGZD3P.js";
13
13
  import {
14
14
  require_date_fns
15
15
  } from "./chunk-M76ECQRD.js";
@@ -5,14 +5,14 @@ import {
5
5
  inlineImageUrlsForCustomProvider,
6
6
  prepareTools,
7
7
  shouldInlineImageUrlsForAgent
8
- } from "./chunk-HMPEO3ZE.js";
8
+ } from "./chunk-Y5HW6GM2.js";
9
9
  import {
10
10
  INVALID_TOOL_ARGS_REPLACEMENT,
11
11
  buildInvalidToolCallSelfHealResult,
12
12
  parseToolCallArguments,
13
13
  performFetchRequest,
14
14
  sanitizeOutboundMessages
15
- } from "./chunk-D2P6UDPQ.js";
15
+ } from "./chunk-6FVRQBRR.js";
16
16
  import {
17
17
  createSSEParser,
18
18
  createToolRunId,
@@ -23,7 +23,7 @@ import {
23
23
  toolRunSetPending,
24
24
  toolRunStarted,
25
25
  toolRunSucceeded
26
- } from "./chunk-4OZYL5FG.js";
26
+ } from "./chunk-TZJJ77KQ.js";
27
27
  import {
28
28
  getPublicImageAgentMode
29
29
  } from "./chunk-VIDPVFP3.js";
@@ -35,10 +35,10 @@ import {
35
35
  messageStreamEnd,
36
36
  messageStreaming,
37
37
  updateToolMessage
38
- } from "./chunk-LBEDNSMY.js";
38
+ } from "./chunk-K4YGZD3P.js";
39
39
  import {
40
40
  streamAgentChatTurn
41
- } from "./chunk-H3PIH2EO.js";
41
+ } from "./chunk-SQQVLHMH.js";
42
42
  import {
43
43
  addActiveController,
44
44
  removeActiveController,
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-AGGIDPCZ.js";
15
15
  import {
16
16
  runLlm
17
- } from "./chunk-H3PIH2EO.js";
17
+ } from "./chunk-SQQVLHMH.js";
18
18
  import {
19
19
  cleanupCliSessionForDialog
20
20
  } from "./chunk-TOP2VXOR.js";
@@ -17470,7 +17470,7 @@ var messageSlice = createSliceWithThunks({
17470
17470
  runtimeOptions: args.runtimeOptions
17471
17471
  });
17472
17472
  if (agentKeyToUse) {
17473
- const { streamAgentChatTurn } = await import("./agentSlice-KTVOEUDX.js");
17473
+ const { streamAgentChatTurn } = await import("./agentSlice-6X4JL2E3.js");
17474
17474
  await dispatch(
17475
17475
  streamAgentChatTurn({
17476
17476
  agentKey: agentKeyToUse,
@@ -18606,7 +18606,7 @@ var deleteDialogThunk = async (payload, thunkApi) => {
18606
18606
  }
18607
18607
  if (isCurrentDialog) {
18608
18608
  await thunkApi.dispatch(resetMsgs());
18609
- const { clearPendingAttachments: clearPendingAttachments2 } = await import("./dialogSlice-HQFQIQDZ.js");
18609
+ const { clearPendingAttachments: clearPendingAttachments2 } = await import("./dialogSlice-W5BYELVR.js");
18610
18610
  dispatch(clearPendingAttachments2());
18611
18611
  }
18612
18612
  return { dialogKey, isCurrentDialog, attachmentPlan };
@@ -18614,15 +18614,15 @@ var deleteDialogThunk = async (payload, thunkApi) => {
18614
18614
 
18615
18615
  // packages/chat/dialog/dialogSlice.ts
18616
18616
  var runCreateDialogAction = async (args, thunkApi) => {
18617
- const { createDialogAction } = await import("./createDialogAction-UCYF4BUN.js");
18617
+ const { createDialogAction } = await import("./createDialogAction-7I5VGWCR.js");
18618
18618
  return createDialogAction(args, thunkApi);
18619
18619
  };
18620
18620
  var runCreateAgentAutomationAction = async (args, thunkApi) => {
18621
- const { createAgentAutomationAction } = await import("./createAgentAutomationAction-NTLU42X2.js");
18621
+ const { createAgentAutomationAction } = await import("./createAgentAutomationAction-QYYWTVUR.js");
18622
18622
  return createAgentAutomationAction(args, thunkApi);
18623
18623
  };
18624
18624
  var runUpdateDialogTitleAction = async (args, thunkApi) => {
18625
- const { updateDialogTitleAction } = await import("./updateDialogTitleAction-2S4DCP35.js");
18625
+ const { updateDialogTitleAction } = await import("./updateDialogTitleAction-VAKA4ZNY.js");
18626
18626
  return updateDialogTitleAction(args, thunkApi);
18627
18627
  };
18628
18628
  var runAddDialogAgentAction = async (args, thunkApi) => {
@@ -18646,7 +18646,7 @@ var runSetDialogExtraReferencesAction = async (args, thunkApi) => {
18646
18646
  return setDialogExtraReferencesAction(args, thunkApi);
18647
18647
  };
18648
18648
  var runHandleSendMessageAction = async (args, thunkApi) => {
18649
- const { handleSendMessageAction } = await import("./handleSendMessageAction-TLB2SAU4.js");
18649
+ const { handleSendMessageAction } = await import("./handleSendMessageAction-SKMJMVRU.js");
18650
18650
  return handleSendMessageAction(args, thunkApi);
18651
18651
  };
18652
18652
  function clearDialogState() {
@@ -18659,7 +18659,7 @@ var createPageAndAddReference = createAsyncThunk(
18659
18659
  async (payload, { dispatch, getState, rejectWithValue }) => {
18660
18660
  const { slateData, jsonData, title, type, fileId, groupId, dialogKey } = payload;
18661
18661
  try {
18662
- const { createDocState } = await import("./docStore-GVWEDN5E.js");
18662
+ const { createDocState } = await import("./docStore-7LAHBFP2.js");
18663
18663
  const pageKey = await createDocState(
18664
18664
  { slateData, title },
18665
18665
  { dispatch, getState }
@@ -27,7 +27,7 @@ import {
27
27
  resolveLocalUserId,
28
28
  t,
29
29
  toolLabel
30
- } from "./chunk-MPV6E6WR.js";
30
+ } from "./chunk-YVIV7WT4.js";
31
31
  import {
32
32
  createRunActivityTracker,
33
33
  popSingleQueueMessage,
@@ -35,12 +35,13 @@ import {
35
35
  resolveRunQueuePath,
36
36
  settleRunTerminalAuthoritatively,
37
37
  spawnLocalBackgroundRun
38
- } from "./chunk-CPH3W5A7.js";
38
+ } from "./chunk-WGR3J4Q6.js";
39
39
  import {
40
+ clearCredentialAvailability,
40
41
  readCredentialEntry,
41
42
  recordCredentialProbe,
42
43
  resolveCredentialKeyWithFallback
43
- } from "./chunk-DWUCB2A3.js";
44
+ } from "./chunk-42V6BK2E.js";
44
45
  import {
45
46
  getReadableCliDb
46
47
  } from "./chunk-LS2ZANRJ.js";
@@ -63,7 +64,7 @@ import {
63
64
  } from "./chunk-LTRXGFMS.js";
64
65
  import {
65
66
  formatAgentListCard
66
- } from "./chunk-4OZYL5FG.js";
67
+ } from "./chunk-TZJJ77KQ.js";
67
68
  import {
68
69
  isTransientFetchError
69
70
  } from "./chunk-5UTFL4QJ.js";
@@ -78,17 +79,17 @@ import {
78
79
  formatStatusRunCard,
79
80
  formatStopRunCard,
80
81
  isAgentRunTerminalStatus
81
- } from "./chunk-NTW5GWDM.js";
82
+ } from "./chunk-3VNWWVKB.js";
82
83
  import {
83
84
  buildMemorySubjectsForAgent,
84
85
  chooseMemoryOwners,
85
86
  loadMemoryCandidatesFromDb,
86
87
  resolveAgentMemoryPolicy
87
- } from "./chunk-EFVDQUCT.js";
88
+ } from "./chunk-3WD6RUUJ.js";
88
89
  import {
89
90
  API_REPORTED_COST_MULTIPLIER,
90
91
  parseUiAskChoiceContent
91
- } from "./chunk-LBEDNSMY.js";
92
+ } from "./chunk-K4YGZD3P.js";
92
93
  import {
93
94
  isOAuthApiKeyRef
94
95
  } from "./chunk-YYLHWIW6.js";
@@ -111,7 +112,7 @@ import {
111
112
  LOCAL_AGENT_CONFIG_MISSING_CODE,
112
113
  LOCAL_TURN_ABORTED_CODE,
113
114
  readActionGate
114
- } from "./chunk-MWAO7TZZ.js";
115
+ } from "./chunk-ZWUOR654.js";
115
116
  import {
116
117
  resolveAgentRuntimeConfigFromRecord
117
118
  } from "./chunk-3IIEFNGY.js";
@@ -126,7 +127,7 @@ import {
126
127
  isQuotaLimited403Body,
127
128
  mergeAvailabilityDeadline,
128
129
  resolveCooldownGate
129
- } from "./chunk-CJCJF5XB.js";
130
+ } from "./chunk-FDTR4QJ6.js";
130
131
  import {
131
132
  isAntigravityOAuthAgent
132
133
  } from "./chunk-UZGQNTVW.js";
@@ -10418,7 +10419,7 @@ function findCollapsedPasteSpanAt(buffer, pos, opts = {}) {
10418
10419
  // packages/cli/client/agentRun.ts
10419
10420
  import { ulid as ulid2 } from "ulid";
10420
10421
  async function loadRunLocalAgentTurn() {
10421
- const { runLocalAgentTurn } = await import("./agentRuntimeLocal-5BX6PI4X.js");
10422
+ const { runLocalAgentTurn } = await import("./agentRuntimeLocal-73CVIWBB.js");
10422
10423
  return runLocalAgentTurn;
10423
10424
  }
10424
10425
  var stripDebugNoise = (s) => s.replace(/\s*raw="[\s\S]*"/g, "").replace(/\s*raw=\S+/g, "").replace(/\s*headers=\[[^\]]*\]/g, "").replace(/\s*headers=\S+/g, "").trim();
@@ -11290,22 +11291,24 @@ async function checkLocalAvailabilityBeforeHttpDispatch(options) {
11290
11291
  }
11291
11292
  const agentLevelAt = baseRecord.nextAvailableAt;
11292
11293
  const agentLevelNextAvailableAt = typeof agentLevelAt === "number" && Number.isFinite(agentLevelAt) ? agentLevelAt : void 0;
11293
- if (!credentialKey && agentLevelNextAvailableAt === void 0) return null;
11294
+ if (!credentialKey && agentLevelNextAvailableAt === void 0) {
11295
+ return { credentialKey };
11296
+ }
11294
11297
  const env = options.env;
11295
11298
  const now = Date.now();
11296
11299
  const entry = credentialKey ? await readCredentialEntry(credentialKey, env, now).catch(() => void 0) : void 0;
11297
11300
  const entryAt = entry?.nextAvailableAt;
11298
11301
  const effectiveNextAvailableAt = typeof entryAt === "number" ? mergeAvailabilityDeadline(agentLevelNextAvailableAt, entryAt) : agentLevelNextAvailableAt;
11299
- if (typeof effectiveNextAvailableAt !== "number") return null;
11302
+ if (typeof effectiveNextAvailableAt !== "number") return { credentialKey };
11300
11303
  const gateDecision = resolveCooldownGate(
11301
11304
  { nextAvailableAt: effectiveNextAvailableAt, lastProbeAt: entry?.lastProbeAt },
11302
11305
  now
11303
11306
  );
11304
11307
  if (gateDecision === "probe" && credentialKey) {
11305
11308
  await recordCredentialProbe(credentialKey, env, now).catch(() => void 0);
11306
- return null;
11309
+ return { credentialKey };
11307
11310
  }
11308
- if (gateDecision !== "blocked") return null;
11311
+ if (gateDecision !== "blocked") return { credentialKey };
11309
11312
  options.output.write(
11310
11313
  `[nolo] Agent ${options.agentName || options.agentKey} is temporarily unavailable (429 cooldown) until ${new Date(Number(effectiveNextAvailableAt)).toISOString()}.
11311
11314
  Dispatch aborted before reaching the server. Pick another agent via listAgents, or retry after the cooldown.
@@ -11388,11 +11391,18 @@ async function runAgentTurn(options) {
11388
11391
  );
11389
11392
  return { exitCode: 1 };
11390
11393
  }
11391
- const localBlock = await checkLocalAvailabilityBeforeHttpDispatch(options);
11392
- if (localBlock) {
11393
- return { exitCode: localBlock.exitCode };
11394
+ const localAvailability = await checkLocalAvailabilityBeforeHttpDispatch(options);
11395
+ if (localAvailability?.exitCode) {
11396
+ return { exitCode: localAvailability.exitCode };
11397
+ }
11398
+ const httpResult = await runHttpAgentTurn(options, authToken);
11399
+ if (httpResult.exitCode === 0 && !httpResult.streamInterrupted && localAvailability?.credentialKey) {
11400
+ await clearCredentialAvailability(
11401
+ localAvailability.credentialKey,
11402
+ options.env
11403
+ ).catch(() => void 0);
11394
11404
  }
11395
- return runHttpAgentTurn(options, authToken);
11405
+ return httpResult;
11396
11406
  }
11397
11407
 
11398
11408
  // packages/cli/agentRunCommand.ts
@@ -12394,10 +12404,14 @@ var withTimeout = async (promise, timeoutMs, label) => {
12394
12404
  };
12395
12405
  var runMemoryVNextShadowRead = async (input) => {
12396
12406
  const now = input.ctx.now ?? (() => performance.now());
12397
- const emit = input.emit ?? ((observation2) => console.info("[memory] vnext shadow read", {
12398
- event: "memory_vnext_shadow_read",
12399
- ...observation2
12400
- }));
12407
+ const defaultEmit = (observation2) => {
12408
+ const payload = {
12409
+ event: "memory_vnext_shadow_read",
12410
+ ...observation2
12411
+ };
12412
+ console.info("[memory] vnext shadow read", payload);
12413
+ };
12414
+ const emit = input.emit ?? defaultEmit;
12401
12415
  const legacyKeys = new Set(
12402
12416
  input.legacyItems.flatMap((item) => legacyItemKeys(item))
12403
12417
  );
@@ -204,7 +204,7 @@ var AGENT_ORCHESTRATION_RUN_INSTRUCTIONS = `--- \u591A Agent \u7F16\u6392\uFF08\
204
204
  2. \u7981\u6B62\u8F6E\u8BE2\u3001\u7981\u7A7A\u8F6C\u3001\u522B\u590D\u8FF0 status\uFF1B\u8BED\u4E49\u4EE5\u5DE5\u5177\u63CF\u8FF0\u4E3A\u51C6\u3002status \u4EC5\u7528\u4E8E\u5F02\u5E38\u8BCA\u65AD\u2014\u2014\u6000\u7591\u5361\u6B7B\u3001failed \u540E\u770B\u8BE6\u60C5/\u65E5\u5FD7\u3001\u7528\u6237\u660E\u786E\u8BE2\u95EE\u6267\u884C\u7EC6\u8282\uFF08tailLines:0 \u53EA\u770B\u6458\u8981\uFF09\uFF1B\u5B83\u4E0D\u662F stop \u524D\u7684 preflight\u3002\u5E76\u884C\uFF1A\u65E0\u6587\u4EF6\u4EA4\u96C6\u3001\u65E0\u771F\u5B9E\u6570\u636E\u4F9D\u8D56\u7684\u72EC\u7ACB\u5B50\u4EFB\u52A1\u9ED8\u8BA4\u5E76\u53D1\u6D3E\u53D1\uFF1B\u4E0D\u8981\u56E0\u5171\u7528\u540C\u4E00\u6267\u884C agent/\u901A\u9053\u800C\u81EA\u884C\u52A0\u300C\u901A\u9053\u4E32\u884C\u300D\u4FDD\u5B88\u5047\u8BBE\uFF08\u540C\u901A\u9053\u5141\u8BB8\u5E76\u53D1 fork\uFF0C\u5B9E\u4F8B\u95F4\u65E0\u4E0A\u4E0B\u6587\u5171\u4EAB\uFF09\uFF0C\u53EA\u6709\u771F\u5B9E\u6587\u4EF6/\u6570\u636E\u4F9D\u8D56\u6216 brief \u660E\u793A\u51B2\u7A81\u9762\u65F6\u624D\u4E32\u884C\u3002
205
205
  3. \u6392\u9519\u5148\u5206\u8BCA\uFF1AagentKey \u6CA1\u7167\u6284 listAgents \u5C31\u5148\u4FEE key\uFF08\u4E0D\u7B97\u901A\u9053\u6545\u969C\uFF09\uFF1B\u62A5\u9519\u542B not found / invalid ref / Local agent config not found \u2192 \u5148 readAgent \u590D\u6838\uFF0C**\u7981\u6B62**\u636E\u6B64\u63A8\u65AD\u51ED\u8BC1\u7F3A\u5931\u6216\u901A\u9053\u5168\u6302\uFF1B\u540C\u4E00\u5DF2\u9A8C\u8BC1 key \u4ECD\u5931\u8D25\u4E14\u9519\u8BEF\u660E\u786E\u6307\u5411\u901A\u9053\uFF08429\u3001\u9274\u6743\u5931\u8D25\u3001machine offline\uFF09\u624D\u8BB0\u4E3A\u901A\u9053\u6545\u969C\u3002\u5224\u5B9A\u300C\u6D3E\u53D1\u901A\u9053\u6574\u4F53\u4E0D\u53EF\u7528\u300D\u9700 \u22652 \u4E2A\u4E0D\u540C\u5019\u9009\u5404\u81EA\u5B8C\u6210\u300C\u5DF2\u9A8C\u8BC1 key + \u4E00\u6B21\u771F\u5B9E\u6D3E\u53D1\u300D\u4E14\u5931\u8D25\uFF0C\u5019\u9009\u4E0D\u8DB3\u5C31\u5982\u5B9E\u62A5\u544A\u300C\u4EC5\u6B64\u5019\u9009\u4E14\u901A\u9053\u5931\u8D25\u300D\uFF0C\u4E0D\u5F97\u5938\u5927\u6210\u5168\u5E93\u4E0D\u53EF\u7528\u3002
206
206
  4. \u53EA\u6709 status=failed/\u8D85\u65F6\u6216 progress \u957F\u65F6\u95F4\u65E0\u52A8\u9759\uFF08\u7591\u4F3C\u5361\u6B7B\uFF09\u624D\u62C9 tailLines:30 \u770B\u65E5\u5FD7\u3002append \u53EF\u76F4\u63A5\u8C03\u7528\u2014\u2014not found/\u5DF2\u7EC8\u6001/\u8FD0\u884C\u4E2D\u5165\u961F\u7531 executor \u81EA\u8BC1\uFF1Bstop \u53EF\u76F4\u63A5\u8C03\u7528\uFF0Cnot found/\u5DF2\u7EC8\u6001/\u8FD0\u884C\u4E2D\u7531\u63A7\u5236\u5E73\u9762\u81EA\u884C\u5904\u7406\uFF08\u5DF2\u7EC8\u6001\u539F\u6837\u8FD4\u56DE\u3001\u4E0D\u4F1A\u88AB\u8986\u76D6\uFF09\u3002`;
207
- var AGENT_COLLABORATION_INSTRUCTIONS = `--- Agent \u7F16\u6392\u4E0E\u534F\u4F5C\uFF08\u591A Agent \u534F\u4F5C\uFF1A\u8BA1\u5212 \u2192 \u6309\u9700\u6D3E\u53D1 \u2192 \u5BA1\u67E5\uFF09 ---
207
+ var AGENT_COLLABORATION_VALUE_AND_METHOD = `--- Agent \u7F16\u6392\u4E0E\u534F\u4F5C\uFF08\u591A Agent \u534F\u4F5C\uFF1A\u8BA1\u5212 \u2192 \u6309\u9700\u6D3E\u53D1 \u2192 \u5BA1\u67E5\uFF09 ---
208
208
  \u4EA7\u51FA\u4F18\u5148\uFF1A\u4E0D\u4E3A\u300C\u51D1\u6570\u91CF\u300D\u6D3E\u53D1\uFF0C\u4E5F\u4E0D\u5305\u529E\u53EF\u5E76\u884C\u7684\u72EC\u7ACB\u9886\u57DF\uFF1B\u6BCF\u8F6E\u63A8\u8FDB\u5F53\u524D\u6700\u6709\u4EF7\u503C\u7684\u52A8\u4F5C\uFF0C\u62FF\u8BC1\u636E\u518D\u5224\u65AD\u3002
209
209
 
210
210
  **\u6D3E\u53D1\u4EF7\u503C\uFF08\u5148\u5224\u65AD\u503C\u4E0D\u503C\u5F97\u6D3E\uFF0C\u518D\u9009\u4EBA\uFF09**\uFF1A
@@ -214,19 +214,16 @@ var AGENT_COLLABORATION_INSTRUCTIONS = `--- Agent \u7F16\u6392\u4E0E\u534F\u4F5C
214
214
  2. **\u5E76\u884C\u6760\u6746\uFF08Parallel leverage\uFF09**\uFF1A\u4E24\u4E2A\u6216\u66F4\u591A\u4E92\u4E0D\u4F9D\u8D56\u7684\u5DE5\u4F5C\u6D41\u53EF\u4EE5\u540C\u65F6\u63A8\u8FDB\uFF0C\u7F29\u77ED\u603B\u5B8C\u6210\u65F6\u95F4\u3002
215
215
  3. **\u8BA4\u77E5\u6760\u6746\uFF08Cognitive leverage\uFF09**\uFF1A\u72EC\u7ACB\u89C6\u89D2\u3001\u53CD\u65B9\u5BA1\u67E5\u3001\u521B\u610F\u5206\u652F\u3001\u9886\u57DF\u4E13\u5BB6\u6216\u4E0D\u540C\u6A21\u578B\u80FD\u663E\u8457\u63D0\u9AD8\u65B9\u6848\u8D28\u91CF\u3001\u53D1\u73B0\u76F2\u533A\u6216\u964D\u4F4E\u5171\u4EAB\u9519\u8BEF\u98CE\u9669\u3002\u4EA7\u54C1\u3001\u8BBE\u8BA1\u3001\u7814\u7A76\u3001\u5199\u4F5C\u3001\u6218\u7565\u548C\u590D\u6742\u51B3\u7B56\u540C\u6837\u9002\u7528\uFF0C\u4E0D\u9650\u4E8E\u4EE3\u7801\u3002
216
216
  - **\u53CD\u7EA6\u675F**\uFF1A\u5982\u679C\u5B50 Agent \u9884\u8BA1\u53EA\u4F1A\u590D\u8FF0\u7236 Agent \u5DF2\u77E5\u4FE1\u606F\u3001\u6CA1\u6709\u72EC\u7ACB\u8BC1\u636E/\u89C6\u89D2/\u5E76\u884C\u6536\u76CA\uFF0C\u5C31\u4E0D\u8981\u6D3E\u3002\u4E0D\u8981\u628A\u534F\u8C03\u5F00\u9500\u4F2A\u88C5\u6210\u201C\u66F4\u8BA4\u771F\u201D\u3002
217
- - **\u4FDD\u62A4\u7528\u6237\u6CE8\u610F\u529B**\uFF1A\u7F16\u6392\u8005\u5E94\u5148\u5728\u5185\u90E8\u5B8C\u6210\u80FD\u53EF\u9760\u5B8C\u6210\u7684\u6BD4\u8F83\u3001\u7B5B\u9009\u4E0E\u9ED8\u8BA4\u5224\u65AD\uFF1B\u53EA\u6709\u76EE\u6807\u3001\u98CE\u9669\u3001\u5BA1\u7F8E\u3001\u8D39\u7528\u3001\u6743\u9650\u3001\u4E0D\u53EF\u9006\u540E\u679C\u7B49\u771F\u6B63\u9700\u8981\u7528\u6237\u51B3\u5B9A\u7684\u4E8B\u9879\u624D\u6253\u65AD\u7528\u6237\u3002\u4E0D\u8981\u628A\u201C\u8BF7\u9009\u62E9 A/B/C\u201D\u5F53\u4F5C\u5DF2\u7ECF\u5B8C\u6210\u89C4\u5212\uFF1B\u6709\u8DB3\u591F\u4F9D\u636E\u65F6\u5148\u7ED9\u63A8\u8350\u4E0E\u7406\u7531\uFF0C\u5E76\u8BF4\u660E\u4F55\u79CD\u6761\u4EF6\u4E0B\u5E94\u6539\u9009\u3002
218
-
219
- **\u5E73\u53F0 Agent / \u5E73\u53F0\u79EF\u5206\u6263\u8D39\u786E\u8BA4\u786C\u95F8\u95E8\uFF08\u5FC5\u987B\u5148\u786E\u8BA4\uFF0C\u540E\u8C03\u7528\uFF09**\uFF1A
217
+ - **\u4FDD\u62A4\u7528\u6237\u6CE8\u610F\u529B**\uFF1A\u7F16\u6392\u8005\u5E94\u5148\u5728\u5185\u90E8\u5B8C\u6210\u80FD\u53EF\u9760\u5B8C\u6210\u7684\u6BD4\u8F83\u3001\u7B5B\u9009\u4E0E\u9ED8\u8BA4\u5224\u65AD\uFF1B\u53EA\u6709\u76EE\u6807\u3001\u98CE\u9669\u3001\u5BA1\u7F8E\u3001\u8D39\u7528\u3001\u6743\u9650\u3001\u4E0D\u53EF\u9006\u540E\u679C\u7B49\u771F\u6B63\u9700\u8981\u7528\u6237\u51B3\u5B9A\u7684\u4E8B\u9879\u624D\u6253\u65AD\u7528\u6237\u3002\u4E0D\u8981\u628A\u201C\u8BF7\u9009\u62E9 A/B/C\u201D\u5F53\u4F5C\u5DF2\u7ECF\u5B8C\u6210\u89C4\u5212\uFF1B\u6709\u8DB3\u591F\u4F9D\u636E\u65F6\u5148\u7ED9\u63A8\u8350\u4E0E\u7406\u7531\uFF0C\u5E76\u8BF4\u660E\u4F55\u79CD\u6761\u4EF6\u4E0B\u5E94\u6539\u9009\u3002`;
218
+ var AGENT_PLATFORM_CREDITS_GATE = `**\u5E73\u53F0 Agent / \u5E73\u53F0\u79EF\u5206\u6263\u8D39\u786E\u8BA4\u786C\u95F8\u95E8\uFF08\u5FC5\u987B\u5148\u786E\u8BA4\uFF0C\u540E\u8C03\u7528\uFF09**\uFF1A
220
219
  - \u53EA\u8981\u5019\u9009 Agent \u7684 apiSource \u4E3A platform\uFF0C\u6216\u65E0\u6CD5\u786E\u8BA4\u8C03\u7528\u662F\u5426\u6D88\u8017\u5E73\u53F0\u79EF\u5206/\u989D\u5EA6\uFF0C\u5C31\u5FC5\u987B\u628A\u5B83\u89C6\u4E3A\u53EF\u80FD\u6263\u8D39\u7684\u9AD8\u6210\u672C\u8C03\u7528\u3002
221
220
  - **\u4EC5\u544A\u77E5\u7528\u6237\u201C\u4F1A\u6D88\u8017\u5E73\u53F0\u79EF\u5206\u201D\u4E0D\u7B49\u4E8E\u83B7\u5F97\u6388\u6743\u3002** \u8C03\u7528 startAgentRun \u524D\uFF0C\u5FC5\u987B\u5148\u5411\u7528\u6237\u8BF4\u660E\uFF1A\u539F\u4F18\u5148\u901A\u9053\u4E3A\u4F55\u4E0D\u53EF\u7528\u3001\u5019\u9009\u5E73\u53F0 Agent\u3001\u9884\u8BA1\u6263\u8D39/\u79EF\u5206\u5F71\u54CD\uFF0C\u5E76\u505C\u4E0B\u6765\u7B49\u5F85\u7528\u6237\u5F53\u6B21\u660E\u786E\u80AF\u5B9A\u6388\u6743\u3002
222
221
  - \u7528\u6237\u8BF4\u201C\u7EE7\u7EED\u201D\u201C\u6309\u8BA1\u5212\u201D\u201C\u4F60\u5904\u7406\u201D\u201C\u53EF\u4EE5\u201D\u7B49\uFF0C\u9ED8\u8BA4\u53EA\u8868\u793A\u7EE7\u7EED\u4EFB\u52A1\uFF0C\u4E0D\u8868\u793A\u540C\u610F\u65B0\u589E\u8D39\u7528\u6216\u5E73\u53F0\u79EF\u5206\u6263\u9664\uFF1B\u5FC5\u987B\u660E\u786E\u5305\u542B\u201C\u540C\u610F\u4F7F\u7528\u5E73\u53F0 Agent/\u63A5\u53D7\u6263\u5E73\u53F0\u79EF\u5206/\u540C\u610F\u8FD9\u6B21\u6263\u8D39\u201D\u7B49\u610F\u601D\uFF0C\u624D\u80FD\u89C6\u4E3A\u6388\u6743\u3002
223
222
  - \u6CA1\u6709\u660E\u786E\u6388\u6743\u65F6\uFF0C\u7981\u6B62\u8C03\u7528\u5E73\u53F0 Agent\uFF0C\u7981\u6B62\u4EE5\u5F02\u6B65\u3001\u540C\u6B65\u3001\u5E76\u884C\u3001\u81EA\u52A8 fallback\u3001\u6362\u53E6\u4E00\u4E2A\u5E73\u53F0 Agent \u6216\u91CD\u8BD5\u7684\u65B9\u5F0F\u7ED5\u8FC7\u786E\u8BA4\u3002
224
223
  - \u7528\u6237\u62D2\u7EDD\u5E73\u53F0\u6263\u8D39\u540E\uFF0C\u505C\u6B62\u6240\u6709\u5E73\u53F0 Agent \u5C1D\u8BD5\uFF1B\u53EA\u80FD\u7B49\u5F85\u79C1\u6709 Agent \u6062\u590D\u3001\u4F7F\u7528\u53EF\u7528\u7684\u975E\u5E73\u53F0 Agent\uFF0C\u6216\u518D\u6B21\u5411\u7528\u6237\u8BF4\u660E\u5E76\u91CD\u65B0\u8BF7\u6C42\u660E\u786E\u6388\u6743\u3002
225
- - \u6388\u6743\u662F\u4E00\u6B21\u6027\u7684\uFF0C\u4EC5\u8986\u76D6\u7528\u6237\u660E\u786E\u6279\u51C6\u7684 Agent\u3001\u5B50\u4EFB\u52A1\u548C\u672C\u6B21\u8C03\u7528\uFF0C\u4E0D\u5F97\u6269\u5C55\u5230\u540E\u7EED review\u3001\u540E\u7EED\u7EC4\u4EF6\u6216\u5176\u4ED6 Agent\u3002
226
-
227
- **\u6D3E\u53D1\u524D\u81EA\u68C0**\uFF1A\u6BCF\u6B21\u8C03\u7528 startAgentRun \u524D\uFF0C\u5148\u6838\u5BF9 agentKey \u7684 apiSource\u3001\u6536\u85CF/\u79C1\u6709\u72B6\u6001\u3001\u5360\u7528\u72B6\u6001\uFF08\u4EC5\u5F53\u5DE5\u5177/\u901A\u9053\u660E\u786E\u8FD4\u56DE\u8BE5\u5019\u9009\u4E0D\u53EF\u7528\uFF0C\u6216\u9879\u76EE\u660E\u786E\u89C4\u5B9A\u5B58\u5728\u540C\u4E00 Agent \u7684\u8D44\u6E90\u9501\u65F6\u6210\u7ACB\uFF09\u548C\u5F53\u524D\u6388\u6743\uFF1B\u65E0\u6CD5\u786E\u8BA4\u6263\u8D39\u72B6\u6001\u65F6\u6309\u53EF\u80FD\u6263\u8D39\u5904\u7406\uFF0C\u5148\u8BE2\u95EE\uFF0C\u4E0D\u5F97\u731C\u6D4B\u3002
228
-
229
- **\u5206\u6863\u6807\u51C6\uFF08\u4E24\u8D26\u5224\u636E\uFF1A\u4E0A\u4E0B\u6587\u8D26 / \u5E76\u884C\u8D26\uFF1B\u6A21\u578B\u6210\u672C\u4E0D\u6784\u6210\u6D3E\u53D1\u7406\u7531\uFF09**\uFF1A
224
+ - \u6388\u6743\u662F\u4E00\u6B21\u6027\u7684\uFF0C\u4EC5\u8986\u76D6\u7528\u6237\u660E\u786E\u6279\u51C6\u7684 Agent\u3001\u5B50\u4EFB\u52A1\u548C\u672C\u6B21\u8C03\u7528\uFF0C\u4E0D\u5F97\u6269\u5C55\u5230\u540E\u7EED review\u3001\u540E\u7EED\u7EC4\u4EF6\u6216\u5176\u4ED6 Agent\u3002`;
225
+ var AGENT_DISPATCH_PRECHECK = `**\u6D3E\u53D1\u524D\u81EA\u68C0**\uFF1A\u6BCF\u6B21\u8C03\u7528 startAgentRun \u524D\uFF0C\u5148\u6838\u5BF9 agentKey \u7684 apiSource\u3001\u6536\u85CF/\u79C1\u6709\u72B6\u6001\u3001\u5360\u7528\u72B6\u6001\uFF08\u4EC5\u5F53\u5DE5\u5177/\u901A\u9053\u660E\u786E\u8FD4\u56DE\u8BE5\u5019\u9009\u4E0D\u53EF\u7528\uFF0C\u6216\u9879\u76EE\u660E\u786E\u89C4\u5B9A\u5B58\u5728\u540C\u4E00 Agent \u7684\u8D44\u6E90\u9501\u65F6\u6210\u7ACB\uFF09\u548C\u5F53\u524D\u6388\u6743\uFF1B\u65E0\u6CD5\u786E\u8BA4\u6263\u8D39\u72B6\u6001\u65F6\u6309\u53EF\u80FD\u6263\u8D39\u5904\u7406\uFF0C\u5148\u8BE2\u95EE\uFF0C\u4E0D\u5F97\u731C\u6D4B\u3002`;
226
+ var AGENT_COLLABORATION_FULL_PROTOCOL = `**\u5206\u6863\u6807\u51C6\uFF08\u4E24\u8D26\u5224\u636E\uFF1A\u4E0A\u4E0B\u6587\u8D26 / \u5E76\u884C\u8D26\uFF1B\u6A21\u578B\u6210\u672C\u4E0D\u6784\u6210\u6D3E\u53D1\u7406\u7531\uFF09**\uFF1A
230
227
  - **\u81EA\u5DF1\u505A**\uFF1A\u7EAF\u95EE\u7B54/\u54A8\u8BE2/\u95F2\u804A\u9ED8\u8BA4\u76F4\u63A5\u56DE\u7B54\u2014\u2014\u4F46\u82E5\u95EE\u9898\u672C\u8EAB\u662F\u5F00\u653E\u5F0F\u521B\u4F5C\u3001\u590D\u6742\u53D6\u820D\u3001\u957F\u671F\u4EA7\u54C1\u8BED\u4E49\u3001\u91CD\u5927\u51B3\u7B56\u6216\u660E\u786E\u5B58\u5728\u591A\u89C6\u89D2\u4EF7\u503C\uFF0C\u8BA4\u77E5\u6760\u6746\u547D\u4E2D\u5373\u6309\u53D1\u6563/\u4F1A\u5546\u6D3E\u53D1\uFF1B\u53EA\u6709\u786E\u5B9E\u6CA1\u6709\u65B0\u589E\u89C6\u89D2/\u8BC1\u636E/\u5E76\u884C\u6536\u76CA\u65F6\u624D\u76F4\u63A5\u56DE\u7B54\u3002\u4E24\u8D26\u5747\u4E0D\u547D\u4E2D\u7684\u4E2D\u5C0F\u5B9E\u73B0\uFF08\u5178\u578B \u22643 \u4E2A\u6587\u4EF6\u30011~2 \u6B21\u9A8C\u8BC1\u5F80\u8FD4\u3001\u65E0\u5927\u8F93\u51FA\u3001\u65E0 \u22652 \u4E2A\u72EC\u7ACB\u9886\u57DF\uFF09\u76F4\u63A5\u5B8C\u6210\uFF0C\u4E0D\u58F0\u660E\u3001\u4E0D\u6D3E\u53D1\u3002
231
228
  - **\u4E0A\u4E0B\u6587\u8D26\u547D\u4E2D \u2192 \u6D3E\u53D1**\uFF1A\u9A8C\u8BC1\u5FAA\u73AF \u22653 \u6B21\u300C\u8DD1\u547D\u4EE4\u2192\u770B\u62A5\u9519\u2192\u6539\u300D\uFF0C\u6216\u5355\u6B65\u5927\u8F93\u51FA\uFF08\u5168\u91CF typecheck \u62A5\u9519\u3001\u957F\u6D4B\u8BD5\u6808\u3001\u5927 diff\u3001\u5927\u6587\u4EF6\u8BFB\u53D6\uFF09\u2014\u2014\u91CD\u590D\u9A8C\u8BC1\u5FAA\u73AF\u3001\u5927\u8F93\u51FA\u5904\u7406\u4E0E\u673A\u68B0 inventory/\u8BC1\u636E\u5B9A\u4F4D\u4EA4\u7ED9\u5B50 Agent\uFF1B\u7236 Agent \u63A5\u6536\u7ED3\u6784\u5316\u8BC1\u636E\uFF0C\u5E76\u4EB2\u81EA\u590D\u6838\u6240\u6709\u5F71\u54CD\u5173\u952E\u51B3\u7B56\u7684\u539F\u59CB\u8BC1\u636E\u3002
232
229
  - **\u5173\u952E\u51B3\u7B56\u4E0A\u4E0B\u6587\u4E0D\u5916\u5305**\uFF1A\u4E0A\u4E0B\u6587\u8D26\u53EA\u51B3\u5B9A\u91CD\u590D\u9A8C\u8BC1\u5FAA\u73AF\u3001\u5927\u8F93\u51FA\u5904\u7406\u3001\u673A\u68B0 inventory/\u8BC1\u636E\u5B9A\u4F4D\u7684\u6D3E\u53D1\uFF1B\u6D89\u53CA\u67B6\u6784\u3001\u8BA1\u8D39\u3001\u5B89\u5168\u3001\u6743\u9650\u3001\u6570\u636E\u5B8C\u6574\u6027\u3001\u4E0D\u53EF\u9006\u8FC1\u79FB\u3001\u957F\u671F\u4EA7\u54C1\u8BED\u4E49\u65F6\uFF0C\u7F16\u6392\u8005\u5FC5\u987B\u4EB2\u81EA\u8BFB\u53D6\u8DB3\u4EE5\u51B3\u7B56\u7684\u4E00\u7EA7\u4EE3\u7801\u3001\u6B63\u5F0F\u771F\u503C\u3001\u539F\u59CB\u65E5\u5FD7\u548C\u771F\u5B9E\u6570\u636E\u8BC1\u636E\uFF1B\u5B50 Agent \u53EF\u505A\u5B9A\u4F4D\u3001\u673A\u68B0\u6536\u96C6\u3001\u72EC\u7ACB\u590D\u6838\u4E0E\u53CD\u65B9\u5BA1\u67E5\uFF0C\u4F46\u5176\u6458\u8981\u4E0D\u80FD\u66FF\u4EE3\u5173\u952E\u4E0A\u4E0B\u6587\u4EB2\u8BFB\u3002
@@ -257,16 +254,32 @@ ${AGENT_SELECTION_PRIORITY_INSTRUCTIONS}
257
254
 
258
255
  **\u62C6\u5206\u4E0E brief**\uFF1A\u6309\u72EC\u7ACB\u9886\u57DF\u62C6\uFF0C\u4E0D\u6309\u6587\u4EF6\u6570\u91CF\u62C6\uFF1B\u5171\u4EAB\u63A5\u53E3/\u5F3A\u987A\u5E8F\u4F9D\u8D56\u5148\u56FA\u5316\u5951\u7EA6\u518D\u6D3E\u53D1\uFF0C\u52FF\u8BA9\u591A\u65B9\u5404\u81EA\u731C\u540C\u4E00\u63A5\u53E3\u3002\u5B50\u4EFB\u52A1\u81EA\u5305\u542B\u3001\u53EA\u4F20\u5B8C\u6210\u8BE5\u5B50\u4EFB\u52A1\u6240\u9700\u7684\u6700\u5C0F\u5DE5\u4F5C\u96C6\uFF08\u4E0A\u4E0B\u6587\u6700\u5C0F\u5316\uFF09\uFF0C\u4E25\u7981\u8F6C\u53D1\u65E0\u5173\u5386\u53F2\u4E0E\u65E5\u5FD7\uFF1B\u7236 Agent \u4FDD\u7559\u76EE\u6807\u3001\u5951\u7EA6\u3001\u96C6\u6210\u3001\u6700\u7EC8\u9A8C\u8BC1\u4E0E\u7528\u6237\u6C9F\u901A\u3002\u6D4B\u8BD5\u7C7B DoD \u5FC5\u987B\u9489\u6B7B\u57FA\u7EBF\u7CBE\u786E\u6570\u5B57\uFF08\u6D3E\u53D1\u524D\u4EB2\u81EA\u8DD1\u6D4B\u8BD5\u8BB0\u4E0B pass/fail \u4E0E\u65E2\u6709\u5931\u8D25\u5F52\u5C5E\uFF09\uFF0C\u9A8C\u6536\u4EB2\u81EA\u590D\u8DD1\u5BF9\u7167\u2014\u2014\u8D85\u57FA\u7EBF\u5373\u6267\u884C\u8005\u5F15\u5165\u56DE\u5F52\uFF08flaky \u53E6\u884C\u7504\u522B\uFF09\uFF1B\u65E0\u6570\u5B57\u7684\u300C\u6D4B\u8BD5\u901A\u8FC7\u300D\u6309\u672A\u9A8C\u8BC1\u5904\u7406\u3002
259
256
 
260
- **Tool call \u53C2\u6570\u4F53\u91CF\u7EAA\u5F8B**\uFF1A\u4EFB\u4F55 tool_call\uFF08\u5C24\u5176 startAgentRun \u7684 task/brief \u4E0E input\uFF09\u7981\u6B62\u5185\u5D4C\u5927\u6BB5\u539F\u6587\u2014\u2014diff\u3001\u65E5\u5FD7\u3001\u957F\u6587\u6863\u3001\u6D4B\u8BD5\u8F93\u51FA\u4E00\u5F8B\u53EA\u4F20\u8DEF\u5F84\uFF08worktree + \u6587\u4EF6\u6E05\u5355\uFF09\uFF0C\u7531\u6267\u884C\u65B9\u81EA\u5DF1 git diff / \u8BFB\u6587\u4EF6\u83B7\u53D6\uFF08\u5185\u5BB9\u8FD8\u66F4\u65B0\u9C9C\uFF09\u3002\u5355\u6B21 arguments \u63A7\u5236\u5728 ~5k \u5B57\u7B26\u5185\uFF1A\u8FC7\u957F\u4F1A\u88AB\u4E0A\u6E38\u6D41\u5F0F\u622A\u65AD\u6210\u975E\u6CD5 JSON\uFF0C\u89E6\u53D1 tool-error \u540E\u6574\u8F6E\u91CD\u53D1\u3002
261
-
262
- **commit \u524D\u786C\u95E8\uFF08\u9636\u6BB5\u5212\u5206\u4E0E\u72EC\u7ACB\u5BA1\u67E5\uFF09**\uFF1A
257
+ **Tool call \u53C2\u6570\u4F53\u91CF\u7EAA\u5F8B**\uFF1A\u4EFB\u4F55 tool_call\uFF08\u5C24\u5176 startAgentRun \u7684 task/brief \u4E0E input\uFF09\u7981\u6B62\u5185\u5D4C\u5927\u6BB5\u539F\u6587\u2014\u2014diff\u3001\u65E5\u5FD7\u3001\u957F\u6587\u6863\u3001\u6D4B\u8BD5\u8F93\u51FA\u4E00\u5F8B\u53EA\u4F20\u8DEF\u5F84\uFF08worktree + \u6587\u4EF6\u6E05\u5355\uFF09\uFF0C\u7531\u6267\u884C\u65B9\u81EA\u5DF1 git diff / \u8BFB\u6587\u4EF6\u83B7\u53D6\uFF08\u5185\u5BB9\u8FD8\u66F4\u65B0\u9C9C\uFF09\u3002\u5355\u6B21 arguments \u63A7\u5236\u5728 ~5k \u5B57\u7B26\u5185\uFF1A\u8FC7\u957F\u4F1A\u88AB\u4E0A\u6E38\u6D41\u5F0F\u622A\u65AD\u6210\u975E\u6CD5 JSON\uFF0C\u89E6\u53D1 tool-error \u540E\u6574\u8F6E\u91CD\u53D1\u3002`;
258
+ var AGENT_COMMIT_REVIEW_GATE = `**commit \u524D\u786C\u95E8\uFF08\u9636\u6BB5\u5212\u5206\u4E0E\u72EC\u7ACB\u5BA1\u67E5\uFF09**\uFF1A
263
259
  - **\u9636\u6BB5\u533A\u5206**\uFF1A\u4E25\u683C\u533A\u5206\u300C\u5B9E\u73B0/\u6784\u5EFA/\u5B89\u88C5/\u7528\u6237\u6D4B\u8BD5/\u6839\u636E\u53CD\u9988\u8FED\u4EE3\u300D\u4E0E\u300C\u51C6\u5907\u63D0\u4EA4/\u5408\u5E76\u300D\u9636\u6BB5\u3002UI/\u524D\u7AEF\u7B49\u9700\u7528\u6237\u9A8C\u6536\u7684\u529F\u80FD\u5728\u5B9E\u73B0\u9636\u6BB5**\u4E0D\u5F97\u89E6\u53D1\u6216\u7B49\u5F85\u6700\u7EC8\u72EC\u7ACB review**\uFF0C\u5148\u4EA4\u4ED8\u53EF\u6D4B\u8BD5\u4EA7\u7269\uFF0C\u7B49\u5F85\u7528\u6237\u6D4B\u8BD5\u4E0E\u53CD\u9988\uFF1B\u5B89\u5168\u5173\u952E\u53D8\u66F4\u7684\u5FC5\u8981\u5BA1\u67E5\u4E0D\u53D7\u5F71\u54CD\uFF1B\u72EC\u7ACB\u7684\u53EA\u8BFB\u5BA1\u8BA1\u6216\u7528\u6237\u660E\u786E\u8981\u6C42\u7684\u63D0\u524D review \u53EF\u63D0\u524D\u8FDB\u884C\uFF0C\u4F46\u4E0D\u5F97\u963B\u585E\u7528\u6237\u6D4B\u8BD5\u6216\u4F5C\u4E3A\u63D0\u524D\u7684\u63D0\u4EA4\u95E8\u3002
264
260
  - **\u6700\u7EC8\u5BA1\u67E5\u65F6\u673A**\uFF1A\u53EA\u6709\u5F53\u7528\u6237\u660E\u786E\u786E\u8BA4\u51C6\u5907\u63D0\u4EA4/\u5408\u5E76\u65F6\uFF0C\u624D\u6D3E\u53D1\u6700\u7EC8 review\u3002\u9664 \u22642 \u6B65\u96F6\u903B\u8F91\u98CE\u9669\u7684\u673A\u68B0\u6539\u52A8\u5916\uFF0C\u6240\u6709\u4EE3\u7801\u53D8\u66F4 commit \u524D\u5FC5\u987B\u5148\u6D3E\u4E0E\u6267\u884C\u8005\u4E0D\u540C\u5B9E\u4F8B\uFF08\u4E0A\u4E0B\u6587\u9694\u79BB\u5373\u53EF\uFF09\u7684 reviewer \u5BA1\u5DE5\u4F5C\u533A diff\uFF0Creviewer \u4E0D\u53EF\u662F\u672C\u6B21\u6539\u52A8\u7684\u4F5C\u8005\uFF1B\u65E0 review \u4E0D commit\u3002\u63D0\u4EA4\u524D review \u5FAA\u73AF\uFF1A\u7528\u6237\u786E\u8BA4\u51C6\u5907\u63D0\u4EA4 \u2192 startAgentRun \u6D3E reviewer \u5BA1 diff \u2192 \u4FEE finding \u2192 \u590D\u5BA1\u76F4\u5230 APPROVE\uFF08\u65E0 CRITICAL/HIGH\uFF09\u624D\u63D0\u4EA4\uFF1BBLOCK \u5FC5\u4FEE\u3001WARNING \u62A5\u7528\u6237\u3002
265
- - **review \u8BC1\u636E\u786C\u95E8**\uFF1A\u4EC5\u5F53 reviewer \u8FD4\u56DE\u53EF\u8BFB\u7684\u6700\u7EC8\u6587\u672C\u4E14\u660E\u786E\u542B APPROVE\u3001\u65E0 CRITICAL/HIGH \u624D\u7B97\u901A\u8FC7\uFF1Bdone\u3001exit 0\u3001\u7A7A dialog\u3001messagesCount=0\u3001agentReply=null\u3001\u8D85\u65F6\u5747\u89C6\u4E3A\u672A\u5BA1\u67E5\uFF0C\u4E25\u7981\u63D0\u4EA4\u3002review context contract\uFF1A\u6D3E reviewer \u524D\u6309\u6539\u52A8\u8303\u56F4\u52A0\u8F7D\u8BE5\u4ED3\u5E93\u7684\u9879\u76EE\u6307\u4EE4\uFF08AGENTS.md \u7C7B\uFF09\u3001\u5DE5\u4F5C\u6D41/\u8BA1\u5212\u6587\u6863\u3001\u547D\u4E2D\u7684 skill \u4E0E references\uFF0C\u4EE5\u53CA touched files \u7684\u5B8C\u6574 diff\uFF0Cbrief \u91CC\u5217\u51FA\u5B9E\u9645\u52A0\u8F7D\u7684 context\uFF1B\u5177\u4F53\u6E05\u5355\u4EE5\u8BE5\u4ED3\u5E93\u81EA\u5DF1\u7684 review \u89C4\u8303\u4E3A\u51C6\uFF08bun-nolo \u89C1 nolo-plan\u300C\u5408\u5E76\u95E8\u300D\u8282\uFF09\u3002\u5BA1\u67E5\u6E05\u5355\uFF1A\u53EF\u8BFB\u6027/\u53EF\u641C\u7D22\u6027\u3001\u53EF\u7EF4\u62A4\u6027/\u5220\u9664\u6210\u672C\u3001\u53EF\u7EC4\u5408\u6027/\u590D\u7528\u3001\u91CD\u590D\u5B9E\u73B0\u3001\u53EF\u5220\u9664\u4EE3\u7801\u3002\u82E5\u5904\u4E8E\u5355 Agent \u72EC\u5360\u73AF\u5883\u3001\u5176\u4ED6 agent \u4E0D\u53EF\u8FBE\u6216\u7528\u6237\u660E\u786E\u8981\u6C42\u76F4\u63A5\u63D0\u4EA4\uFF0C\u5141\u8BB8\u5E26\u539F\u56E0\u8DF3\u8FC7\uFF08commit \u6CE8\u660E [no-review: \u539F\u56E0]\uFF09\u3002\u6D89\u53CA\u4ED3\u5E93\u6587\u4EF6\u5199\u5165\u5FC5\u987B\u7528\u72EC\u7ACB worktree\u3002\u4ED3\u5E93\u7EA7 plan / review / worktree \u7EAA\u5F8B\u4EE5 AGENTS.md \u4E3A\u51C6\u3002
266
-
267
- --- \u786E\u8BA4\u8FB9\u754C ---
261
+ - **review \u8BC1\u636E\u786C\u95E8**\uFF1A\u4EC5\u5F53 reviewer \u8FD4\u56DE\u53EF\u8BFB\u7684\u6700\u7EC8\u6587\u672C\u4E14\u660E\u786E\u542B APPROVE\u3001\u65E0 CRITICAL/HIGH \u624D\u7B97\u901A\u8FC7\uFF1Bdone\u3001exit 0\u3001\u7A7A dialog\u3001messagesCount=0\u3001agentReply=null\u3001\u8D85\u65F6\u5747\u89C6\u4E3A\u672A\u5BA1\u67E5\uFF0C\u4E25\u7981\u63D0\u4EA4\u3002review context contract\uFF1A\u6D3E reviewer \u524D\u6309\u6539\u52A8\u8303\u56F4\u52A0\u8F7D\u8BE5\u4ED3\u5E93\u7684\u9879\u76EE\u6307\u4EE4\uFF08AGENTS.md \u7C7B\uFF09\u3001\u5DE5\u4F5C\u6D41/\u8BA1\u5212\u6587\u6863\u3001\u547D\u4E2D\u7684 skill \u4E0E references\uFF0C\u4EE5\u53CA touched files \u7684\u5B8C\u6574 diff\uFF0Cbrief \u91CC\u5217\u51FA\u5B9E\u9645\u52A0\u8F7D\u7684 context\uFF1B\u5177\u4F53\u6E05\u5355\u4EE5\u8BE5\u4ED3\u5E93\u81EA\u5DF1\u7684 review \u89C4\u8303\u4E3A\u51C6\uFF08bun-nolo \u89C1 nolo-plan\u300C\u5408\u5E76\u95E8\u300D\u8282\uFF09\u3002\u5BA1\u67E5\u6E05\u5355\uFF1A\u53EF\u8BFB\u6027/\u53EF\u641C\u7D22\u6027\u3001\u53EF\u7EF4\u62A4\u6027/\u5220\u9664\u6210\u672C\u3001\u53EF\u7EC4\u5408\u6027/\u590D\u7528\u3001\u91CD\u590D\u5B9E\u73B0\u3001\u53EF\u5220\u9664\u4EE3\u7801\u3002\u82E5\u5904\u4E8E\u5355 Agent \u72EC\u5360\u73AF\u5883\u3001\u5176\u4ED6 agent \u4E0D\u53EF\u8FBE\u6216\u7528\u6237\u660E\u786E\u8981\u6C42\u76F4\u63A5\u63D0\u4EA4\uFF0C\u5141\u8BB8\u5E26\u539F\u56E0\u8DF3\u8FC7\uFF08commit \u6CE8\u660E [no-review: \u539F\u56E0]\uFF09\u3002\u6D89\u53CA\u4ED3\u5E93\u6587\u4EF6\u5199\u5165\u5FC5\u987B\u7528\u72EC\u7ACB worktree\u3002\u4ED3\u5E93\u7EA7 plan / review / worktree \u7EAA\u5F8B\u4EE5 AGENTS.md \u4E3A\u51C6\u3002`;
262
+ var AGENT_CONFIRM_BOUNDARY = `--- \u786E\u8BA4\u8FB9\u754C ---
268
263
  - \u6D89\u53CA\u4E0D\u53EF\u9006\u64CD\u4F5C\uFF08\u4FEE\u6539\u6587\u4EF6\u3001\u5220\u9664\u6570\u636E\u3001\u53D1\u9001\u6D88\u606F\u3001\u751F\u6210\u6B63\u5F0F\u6587\u4EF6\u3001\u6267\u884C\u4EA4\u6613\uFF09\u6216\u9AD8\u6210\u672C\u52A8\u4F5C\uFF08\u5927\u89C4\u6A21\u91CD\u6784/\u957F\u65F6\u8FD0\u884C/\u5927\u91CF token\uFF09\u65F6\uFF0C\u4F18\u5148\u9884\u89C8\u6216\u5411\u7528\u6237\u786E\u8BA4\uFF1B\u5DE5\u5177\u8FD4\u56DE"\u9884\u89C8/\u5F85\u786E\u8BA4"\u65F6\u6682\u505C\uFF0C\u7B49\u660E\u786E\u786E\u8BA4\u518D\u7EE7\u7EED\uFF0C\u672A\u786E\u8BA4\u524D\u4E0D\u8FDE\u7EED\u53D1\u591A\u6B21\u7834\u574F\u6027\u4FEE\u6539\u3002
269
264
  - \u6536\u5230\u300C\u5B50\u5BF9\u8BDD\u7981\u6B62\u518D\u521B\u5EFA\u5B59\u5BF9\u8BDD\u300D\uFF1D\u4F60\u5DF2\u662F\u5B50\u5BF9\u8BDD\uFF0C\u7981\u6B62\u518D\u6D3E\u53D1\uFF0C\u628A\u7ED3\u679C\u8FD4\u56DE\u7236\u5BF9\u8BDD\u5373\u53EF\u3002`;
265
+ var AGENT_COLLABORATION_INSTRUCTIONS = [
266
+ AGENT_COLLABORATION_VALUE_AND_METHOD,
267
+ AGENT_PLATFORM_CREDITS_GATE,
268
+ AGENT_DISPATCH_PRECHECK,
269
+ AGENT_COLLABORATION_FULL_PROTOCOL,
270
+ AGENT_COMMIT_REVIEW_GATE,
271
+ AGENT_CONFIRM_BOUNDARY
272
+ ].join("\n\n");
273
+ var AGENT_COLLABORATION_MIN_INSTRUCTIONS = [
274
+ `--- \u591A Agent \u6D3E\u53D1\uFF08\u6700\u5C0F\u534F\u8BAE\uFF09 ---
275
+ - startAgentRun \u542F\u52A8\u5B50 Agent\uFF1AagentKey \u5FC5\u987B\u539F\u6837\u7167\u6284 listAgents \u8FD4\u56DE\u7684 agentKey \u5B57\u6BB5\uFF08\u4E0D\u62FC\u63A5/\u4E0D\u63A8\u65AD/\u4E0D\u6362\u683C\u5F0F/\u4E0D\u4F20 name\uFF09\uFF1Bwait:false\uFF08\u9ED8\u8BA4\uFF09\u5F02\u6B65\u8FD4\u56DE runId\uFF0C\u6D3E\u53D1\u540E\u7ACB\u5373\u6536\u5C3E\u7B49\u7EC8\u6001\u901A\u77E5\uFF0C\u7981\u6B62\u8F6E\u8BE2\uFF1B\u5E76\u884C\u6D3E\u53D1\u7528\u540C\u4E00 batchId \u5F52\u7EC4\u3002
276
+ - \u5E76\u884C\u6247\u51FA\u53EA\u8DE8\u4E0D\u540C credentialGroup\uFF1A\u540C\u4E00\u51ED\u8BC1\u7981\u6B62\u5E76\u53D1\u6247\u51FA\uFF1Bcredentialed:false\uFF08\u51ED\u8BC1\u5F52\u5C5E\u672A\u77E5\uFF09\u7684 agent \u4E0D\u662F\u300C\u72EC\u7ACB\u51ED\u8BC1\u300D\uFF0C\u540C\u6279\u5E76\u53D1\u4F1A\u88AB\u5B88\u536B\u62D2\u7EDD\uFF0C\u9700\u4E32\u884C\u6D3E\u53D1\u6216\u663E\u5F0F allowUnknownCredential \u786E\u8BA4\u98CE\u9669\u3002
277
+ - \u672C\u8F6E\u672A\u6CE8\u5165\u5B8C\u6574\u7F16\u6392\u534F\u8BAE\uFF08\u65E0\u6D3E\u53D1\u610F\u56FE\uFF09\uFF1B\u5982\u786E\u9700\u591A Agent \u7F16\u6392\uFF0C\u6309\u672C\u6700\u5C0F\u534F\u8BAE\u4E0E startAgentRun \u5DE5\u5177\u63CF\u8FF0\u6267\u884C\uFF0C\u5B89\u5168\u786C\u95E8\u89C1\u4E0B\u3002`,
278
+ AGENT_PLATFORM_CREDITS_GATE,
279
+ AGENT_DISPATCH_PRECHECK,
280
+ AGENT_COMMIT_REVIEW_GATE,
281
+ AGENT_CONFIRM_BOUNDARY
282
+ ].join("\n\n");
270
283
  var WEBPAGE_ACCESS_INSTRUCTIONS = `--- \u7F51\u9875\u8BBF\u95EE\u80FD\u529B (Web Access) ---
271
284
  \u83B7\u53D6\u5916\u90E8\u4FE1\u606F\u7531\u7B80\u5165\u7E41\uFF1A
272
285
  0. \u7528\u6237\u5DF2\u7ED9\u660E\u786E URL \u2192 \u5148\u76F4\u63A5 fetch \u8FD9\u4E9B URL\uFF0C\u4E0D\u8981\u5148\u641C\u7D22\u6216\u731C\u5907\u7528\u7F51\u5740\uFF08\u6700\u9AD8\u4F18\u5148\u7EA7\u7684\u7F51\u9875\u771F\u503C\uFF09\uFF1B\u4EC5\u5F53\u6293\u53D6\u5931\u8D25\u3001\u7F3A\u5B57\u6BB5\u6216\u5185\u5BB9\u4E0D\u5339\u914D\u624D\u989D\u5916\u641C\u7D22\uFF0C\u5E76\u8BF4\u660E\u964D\u7EA7\u539F\u56E0\u3002
@@ -344,7 +357,9 @@ var TOOL_GUIDED_SECTIONS = [
344
357
  "startAgentRun",
345
358
  "controlAgentRun"
346
359
  ],
347
- build: () => AGENT_COLLABORATION_INSTRUCTIONS
360
+ // 按需注入:完整编排协议仅在有派发意图时给;无派发意图给最小协议
361
+ // (派发机制 + 安全硬门常在:平台积分授权门 / commit review 硬门)。
362
+ build: (_tools, opts) => opts?.dispatchIntent === true ? AGENT_COLLABORATION_INSTRUCTIONS : AGENT_COLLABORATION_MIN_INSTRUCTIONS
348
363
  },
349
364
  { id: "menuUsage", triggerTools: ["ask_user"], build: () => MENU_USAGE_INSTRUCTIONS },
350
365
  {
@@ -372,12 +387,12 @@ var TOOL_GUIDED_SECTION_ORDER = [
372
387
  "memoryCapture",
373
388
  "agentConfigMaintenance"
374
389
  ];
375
- function resolveToolGuidedSections(agentTools) {
390
+ function resolveToolGuidedSections(agentTools, opts) {
376
391
  const out = {};
377
392
  for (const section of TOOL_GUIDED_SECTIONS) {
378
393
  const triggered = section.triggerAnyTool ? agentTools.length > 0 : section.triggerTools.some((t) => agentTools.includes(t));
379
394
  if (triggered) {
380
- out[section.id] = section.build(agentTools);
395
+ out[section.id] = section.build(agentTools, opts);
381
396
  } else {
382
397
  out[section.id] = "";
383
398
  }
@@ -385,6 +400,49 @@ function resolveToolGuidedSections(agentTools) {
385
400
  return out;
386
401
  }
387
402
 
403
+ // packages/ai/agent/dispatchIntent.ts
404
+ var DISPATCH_INTENT_PATTERN = /(派发|派单|派个|派一|派两|派几|派人|子任务|子\s*[aA]gent|多\s*[aA]gent|多个\s*[aA]gent|并行处理|并行派发|并发派发|并行执行|并发执行|分头|分工|同时处理|后台跑|后台执行|编排|会商|发散|代码审查|独立\s*review|派.{0,4}review|dispatch|delegat|sub[\s-]?agent|sub[\s-]?task|fan[\s-]?out|orchestrat|\bbatch\b|in parallel|concurrent|paralleliz|background run|review.{0,20}(diff|code|代码))/i;
405
+ var DISPATCH_TOOL_NAMES = /* @__PURE__ */ new Set(["startAgentRun", "controlAgentRun"]);
406
+ function detectDispatchIntent(text) {
407
+ if (typeof text !== "string" || !text.trim()) return false;
408
+ return DISPATCH_INTENT_PATTERN.test(text);
409
+ }
410
+ function messageText(content) {
411
+ if (typeof content === "string") return content;
412
+ if (Array.isArray(content)) {
413
+ return content.map((part) => typeof part?.text === "string" ? part.text : "").join("\n");
414
+ }
415
+ return "";
416
+ }
417
+ function toolCallName(call) {
418
+ const nested = call?.function?.name;
419
+ if (typeof nested === "string" && nested) return nested;
420
+ const flat = call?.name;
421
+ if (typeof flat === "string" && flat) return flat;
422
+ return "";
423
+ }
424
+ function hasDispatchToolCall(msg) {
425
+ const calls = Array.isArray(msg.tool_calls) ? msg.tool_calls : Array.isArray(msg.toolCalls) ? msg.toolCalls : [];
426
+ if (calls.some((call) => DISPATCH_TOOL_NAMES.has(toolCallName(call)))) {
427
+ return true;
428
+ }
429
+ for (const field of [msg.toolName, msg.name]) {
430
+ if (typeof field === "string" && DISPATCH_TOOL_NAMES.has(field)) return true;
431
+ }
432
+ return false;
433
+ }
434
+ function detectDispatchIntentFromMessages(messages) {
435
+ if (!Array.isArray(messages)) return false;
436
+ for (const msg of messages) {
437
+ if (!msg) continue;
438
+ if (msg.role === "user" && detectDispatchIntent(messageText(msg.content))) {
439
+ return true;
440
+ }
441
+ if (hasDispatchToolCall(msg)) return true;
442
+ }
443
+ return false;
444
+ }
445
+
388
446
  // packages/ai/agent/contextCompiler.ts
389
447
  function createHash(_algo) {
390
448
  let buf = "";
@@ -535,6 +593,8 @@ export {
535
593
  buildRuntimeGuidanceBlocks,
536
594
  TOOL_GUIDED_SECTION_ORDER,
537
595
  resolveToolGuidedSections,
596
+ detectDispatchIntent,
597
+ detectDispatchIntentFromMessages,
538
598
  hashStablePrefixContent,
539
599
  estimateContextTokens,
540
600
  compileContextLayers,
@@ -326,7 +326,7 @@ async function saveDocState(arg, { dispatch, getState }) {
326
326
  ).unwrap();
327
327
  if (dbSpaceId) {
328
328
  try {
329
- const { updateContentTitle } = await import("./contentThunks-2USKJBI4.js");
329
+ const { updateContentTitle } = await import("./contentThunks-ATLWNC2D.js");
330
330
  await dispatch(
331
331
  updateContentTitle({
332
332
  spaceId: dbSpaceId,
@@ -365,7 +365,7 @@ async function saveDocState(arg, { dispatch, getState }) {
365
365
  }
366
366
  }
367
367
  async function createDocState(args, thunkApi) {
368
- const { createPageAction } = await import("./createPageAction-QFGUGZ5M.js");
368
+ const { createPageAction } = await import("./createPageAction-WNURYCWU.js");
369
369
  return createPageAction(args, thunkApi);
370
370
  }
371
371
  function subscribe(listener) {
@@ -420,6 +420,9 @@ function toSafeAgentSummary(record, options) {
420
420
  ...nextAvailableAt !== void 0 ? { nextAvailableAt } : {},
421
421
  ...credentialGroup !== void 0 ? { credentialGroup } : {},
422
422
  ...credentialKind !== void 0 ? { credentialKind } : {},
423
+ // 「未知 ≠ 独立」:无 credentialGroup 时显式 credentialed:false,调用方
424
+ // 不得把缺失解读成独立凭证(并发扇出守卫依赖这个区分)。
425
+ credentialed: credentialGroup !== void 0,
423
426
  updatedAt
424
427
  };
425
428
  }
@@ -446,7 +449,8 @@ var COMPACT_AGENT_SUMMARY_FIELDS = [
446
449
  // 所以通常根本不占字节。
447
450
  "nextAvailableAt",
448
451
  "credentialGroup",
449
- "credentialKind"
452
+ "credentialKind",
453
+ "credentialed"
450
454
  ];
451
455
  function omitNullishAgentSummaryFields(summary) {
452
456
  const result = {};
@@ -304,7 +304,7 @@ var slice = createSliceWithThunks({
304
304
  const overrides = {};
305
305
  if (args.systemPromptOverride !== void 0) overrides.prompt = args.systemPromptOverride;
306
306
  if (args.toolsOverride !== void 0) overrides.tools = args.toolsOverride;
307
- const { _executeModel } = await import("./_executeModel-UXVEB3GO.js");
307
+ const { _executeModel } = await import("./_executeModel-JIG7MRXQ.js");
308
308
  return _executeModel(
309
309
  {
310
310
  isStreaming: args.isStreaming ?? false,
@@ -325,7 +325,7 @@ var slice = createSliceWithThunks({
325
325
  * - 循环直到无工具调用或触发其他运行时停止条件
326
326
  */
327
327
  runAgent: create.asyncThunk(async (args, thunkApi) => {
328
- const { runAgentClientLoop } = await import("./runAgentClientLoop-26DG6ZEY.js");
328
+ const { runAgentClientLoop } = await import("./runAgentClientLoop-ZYENU7GH.js");
329
329
  const { content: loopContent, toolCallCount } = await runAgentClientLoop(
330
330
  {
331
331
  agentKey: args.agentKey,
@@ -341,7 +341,7 @@ var slice = createSliceWithThunks({
341
341
  * 聊天轮次流式 Agent 调用
342
342
  */
343
343
  streamAgentChatTurn: create.asyncThunk(async (args, thunkApi) => {
344
- const { streamAgentChatTurnHandler } = await import("./streamAgentChatTurn-BY7IPY5C.js");
344
+ const { streamAgentChatTurnHandler } = await import("./streamAgentChatTurn-43GPPQSN.js");
345
345
  return streamAgentChatTurnHandler(args, thunkApi);
346
346
  }),
347
347
  /**