nolo-cli 0.186.0 → 0.187.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 (62) hide show
  1. package/{_executeModel-WTNQE227.js → _executeModel-35LFG5KF.js} +12 -12
  2. package/{agentDeleteCommand-KJFY6C7J.js → agentDeleteCommand-TMFQR6QL.js} +11 -11
  3. package/{agentEmailCommands-CGXK25TI.js → agentEmailCommands-JZ6GYJ4H.js} +13 -13
  4. package/{agentListCommands-PRG4ZBJC.js → agentListCommands-PFZRMIAI.js} +2 -2
  5. package/{agentMachineCommands-OVFR25AO.js → agentMachineCommands-BT643ADE.js} +3 -3
  6. package/{agentRecordCommands-V233UFDQ.js → agentRecordCommands-LJ5EWR67.js} +12 -12
  7. package/{agentRunCommand-CNBQZ4PZ.js → agentRunCommand-6CPXONR3.js} +14 -14
  8. package/{agentRuntimeLocal-CBDP2OYK.js → agentRuntimeLocal-3QBUFZEC.js} +2 -2
  9. package/{agentSlice-XC35R4QW.js → agentSlice-RW25WUPR.js} +1 -1
  10. package/{appDeleteCommands-OP4GGXEJ.js → appDeleteCommands-WEBDQMVH.js} +2 -2
  11. package/{appDeployCommands-LHTVLNL5.js → appDeployCommands-HFZ3I7Z4.js} +2 -2
  12. package/{appDeployStatusCommands-BSDDQU7S.js → appDeployStatusCommands-TVBQOFIY.js} +2 -2
  13. package/{appGetCommands-LNHGUJKF.js → appGetCommands-Y5RKR25C.js} +2 -2
  14. package/{appListCommands-RGOFZV5M.js → appListCommands-4UZIZPB3.js} +2 -2
  15. package/{chunk-5BSIT4IP.js → chunk-37ZDGCX6.js} +8 -8
  16. package/{chunk-IOQHM7ID.js → chunk-4ALQFIFF.js} +720 -92
  17. package/{chunk-Z4AZSU7X.js → chunk-4GZ2LY5F.js} +12 -8
  18. package/{chunk-KQFC7IPI.js → chunk-6HFMPUSN.js} +2 -2
  19. package/{chunk-AU7AXHUL.js → chunk-7KWPNGVJ.js} +57 -21
  20. package/{chunk-5STT2WW5.js → chunk-BRBG72OP.js} +7 -7
  21. package/{chunk-3SMSREBB.js → chunk-CDUK5BF6.js} +2 -2
  22. package/{chunk-ZN2PUXZ2.js → chunk-DK7QNJVM.js} +2 -2
  23. package/{chunk-TGH6MIC7.js → chunk-ECAGROXS.js} +2 -2
  24. package/{chunk-TIHN5AXV.js → chunk-IOB5RBBZ.js} +1 -1
  25. package/{chunk-7XY4VVIL.js → chunk-J5Y3BXJP.js} +124 -22
  26. package/{chunk-PHD5UL5B.js → chunk-PEOLOK72.js} +1 -1
  27. package/{chunk-MKAWH3AL.js → chunk-PL6YNOF7.js} +10 -10
  28. package/chunk-Q6RMLYSA.js +385 -0
  29. package/{chunk-DKYQN6DO.js → chunk-QBMO66MI.js} +3 -3
  30. package/{chunk-DIP5EVZD.js → chunk-SIX7N4AH.js} +2 -2
  31. package/{chunk-TURPPK3Y.js → chunk-TB7E6UEO.js} +1 -1
  32. package/{chunk-KBW2QSGY.js → chunk-VMMS7L64.js} +3 -3
  33. package/{chunk-ZPRV4GQD.js → chunk-XJECR5M3.js} +2 -2
  34. package/{chunk-CH3QKJ2T.js → chunk-ZV6ESGA7.js} +2 -2
  35. package/{chunk-SL2TDPXF.js → chunk-ZXUPGFJ5.js} +6 -6
  36. package/{commandRegistry-2J53NSBR.js → commandRegistry-6EEZMM43.js} +40 -40
  37. package/{contentThunks-TFYSYUDO.js → contentThunks-EPHFLF62.js} +3 -3
  38. package/{createAgentAutomationAction-KCODNBWN.js → createAgentAutomationAction-MFE4QIL4.js} +3 -3
  39. package/{createDialogAction-RGDFOBVN.js → createDialogAction-SGOXQ7BC.js} +4 -4
  40. package/{createPageAction-XXI7D2CN.js → createPageAction-OTNUT7WI.js} +3 -3
  41. package/{dialogCommands-6MR232CJ.js → dialogCommands-KNE72SUM.js} +2 -2
  42. package/{dialogSlice-IZAIMZXJ.js → dialogSlice-PHPLFD5F.js} +2 -2
  43. package/{docCreateCommands-DAZJ2Y5E.js → docCreateCommands-MG67RHCR.js} +2 -2
  44. package/{docDeleteCommands-XO26LNIO.js → docDeleteCommands-2UAG5JVZ.js} +2 -2
  45. package/{docReadCommands-77XGRLD6.js → docReadCommands-JKJJ4FNU.js} +2 -2
  46. package/{docStore-IRZWBI3X.js → docStore-HI7P3MVA.js} +1 -1
  47. package/{docUpdateCommands-QXN3MJAJ.js → docUpdateCommands-6D7ADVPS.js} +2 -2
  48. package/{handleSendMessageAction-E6PA6K6X.js → handleSendMessageAction-YAO4RDWU.js} +8 -8
  49. package/index.js +3 -3
  50. package/{localRuntimeAdapter-ATJCBXFO.js → localRuntimeAdapter-4J62I4YU.js} +11 -11
  51. package/{machineCommands-T4XT4J4G.js → machineCommands-XW5I55QW.js} +12 -12
  52. package/{machineWsRunDispatch-VZZHV4G7.js → machineWsRunDispatch-W5VEHHMI.js} +12 -12
  53. package/package.json +1 -1
  54. package/{readlineWorkspace-4RIJTRPN.js → readlineWorkspace-EE6JMRIW.js} +14 -14
  55. package/{runAgentClientLoop-7DKG2KL2.js → runAgentClientLoop-BU6GOWQI.js} +10 -10
  56. package/skillDiscovery-F3TMVQOJ.js +28 -0
  57. package/{spaceCommands-PHLKQ2AW.js → spaceCommands-GTQQ6GFS.js} +2 -2
  58. package/{streamAgentChatTurn-2764VROY.js → streamAgentChatTurn-MHRXV7XZ.js} +13 -13
  59. package/{tools-UJELIY4A.js → tools-YA5NIWI7.js} +7 -7
  60. package/{updateDialogTitleAction-HUFWSVYC.js → updateDialogTitleAction-M6U2VK5L.js} +3 -3
  61. package/chunk-VEA7H5FG.js +0 -173
  62. package/skillDiscovery-QC35EQY4.js +0 -18
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-QYPE3TS3.js";
15
15
  import {
16
16
  runLlm
17
- } from "./chunk-KBW2QSGY.js";
17
+ } from "./chunk-VMMS7L64.js";
18
18
  import {
19
19
  getApproxPricePerImage
20
20
  } from "./chunk-4JH2UMJR.js";
@@ -7225,6 +7225,7 @@ var space_locale_default = {
7225
7225
  unpin: "Unpin",
7226
7226
  favorite: "Favorite",
7227
7227
  unfavorite: "Unfavorite",
7228
+ favoriteDetailMissingHint: "Favorited item \u2014 opening it will show its title",
7228
7229
  quickAddToRail: "Add to Rail Shortcut",
7229
7230
  quickRemoveFromRail: "Remove from Rail Shortcut",
7230
7231
  quickMoveRailUp: "Move Rail Shortcut Up",
@@ -7551,6 +7552,7 @@ var space_locale_default = {
7551
7552
  unpin: "\u53D6\u6D88\u7F6E\u9876",
7552
7553
  favorite: "\u6536\u85CF",
7553
7554
  unfavorite: "\u53D6\u6D88\u6536\u85CF",
7555
+ favoriteDetailMissingHint: "\u6536\u85CF\u9879\uFF0C\u6253\u5F00\u540E\u4F1A\u663E\u793A\u6807\u9898",
7554
7556
  quickAddToRail: "\u52A0\u5165\u5FEB\u6377",
7555
7557
  quickRemoveFromRail: "\u4ECE\u5FEB\u6377\u79FB\u9664",
7556
7558
  quickMoveRailUp: "\u5FEB\u6377\u4E0A\u79FB",
@@ -7876,6 +7878,7 @@ var space_locale_default = {
7876
7878
  unpin: "\u53D6\u6D88\u7F6E\u9802",
7877
7879
  favorite: "\u6536\u85CF",
7878
7880
  unfavorite: "\u53D6\u6D88\u6536\u85CF",
7881
+ favoriteDetailMissingHint: "\u6536\u85CF\u9805\uFF0C\u958B\u555F\u5F8C\u6703\u986F\u793A\u6A19\u984C",
7879
7882
  quickAddToRail: "\u52A0\u5165\u5FEB\u6377",
7880
7883
  quickRemoveFromRail: "\u5F9E\u5FEB\u6377\u79FB\u9664",
7881
7884
  quickMoveRailUp: "\u5FEB\u6377\u4E0A\u79FB",
@@ -8202,6 +8205,7 @@ var space_locale_default = {
8202
8205
  unpin: "\u30D4\u30F3\u7559\u3081\u89E3\u9664",
8203
8206
  favorite: "\u304A\u6C17\u306B\u5165\u308A",
8204
8207
  unfavorite: "\u304A\u6C17\u306B\u5165\u308A\u89E3\u9664",
8208
+ favoriteDetailMissingHint: "\u304A\u6C17\u306B\u5165\u308A\u9805\u76EE\u3002\u958B\u304F\u3068\u30BF\u30A4\u30C8\u30EB\u304C\u8868\u793A\u3055\u308C\u307E\u3059",
8205
8209
  quickAddToRail: "\u30EC\u30FC\u30EB\u306B\u8FFD\u52A0",
8206
8210
  quickRemoveFromRail: "\u30EC\u30FC\u30EB\u304B\u3089\u524A\u9664",
8207
8211
  quickMoveRailUp: "\u30EC\u30FC\u30EB\u5185\u3067\u4E0A\u3078\u79FB\u52D5",
@@ -11067,7 +11071,7 @@ var messageSlice = createSliceWithThunks({
11067
11071
  runtimeOptions: args.runtimeOptions
11068
11072
  });
11069
11073
  if (agentKeyToUse) {
11070
- const { streamAgentChatTurn } = await import("./agentSlice-XC35R4QW.js");
11074
+ const { streamAgentChatTurn } = await import("./agentSlice-RW25WUPR.js");
11071
11075
  await dispatch(
11072
11076
  streamAgentChatTurn({
11073
11077
  agentKey: agentKeyToUse,
@@ -13881,7 +13885,7 @@ var deleteDialogThunk = async (payload, thunkApi) => {
13881
13885
  }
13882
13886
  if (isCurrentDialog) {
13883
13887
  await thunkApi.dispatch(resetMsgs());
13884
- const { clearPendingAttachments: clearPendingAttachments2 } = await import("./dialogSlice-IZAIMZXJ.js");
13888
+ const { clearPendingAttachments: clearPendingAttachments2 } = await import("./dialogSlice-PHPLFD5F.js");
13885
13889
  dispatch(clearPendingAttachments2());
13886
13890
  }
13887
13891
  return { dialogKey, isCurrentDialog, attachmentPlan };
@@ -13889,15 +13893,15 @@ var deleteDialogThunk = async (payload, thunkApi) => {
13889
13893
 
13890
13894
  // packages/chat/dialog/dialogSlice.ts
13891
13895
  var runCreateDialogAction = async (args, thunkApi) => {
13892
- const { createDialogAction } = await import("./createDialogAction-RGDFOBVN.js");
13896
+ const { createDialogAction } = await import("./createDialogAction-SGOXQ7BC.js");
13893
13897
  return createDialogAction(args, thunkApi);
13894
13898
  };
13895
13899
  var runCreateAgentAutomationAction = async (args, thunkApi) => {
13896
- const { createAgentAutomationAction } = await import("./createAgentAutomationAction-KCODNBWN.js");
13900
+ const { createAgentAutomationAction } = await import("./createAgentAutomationAction-MFE4QIL4.js");
13897
13901
  return createAgentAutomationAction(args, thunkApi);
13898
13902
  };
13899
13903
  var runUpdateDialogTitleAction = async (args, thunkApi) => {
13900
- const { updateDialogTitleAction } = await import("./updateDialogTitleAction-HUFWSVYC.js");
13904
+ const { updateDialogTitleAction } = await import("./updateDialogTitleAction-M6U2VK5L.js");
13901
13905
  return updateDialogTitleAction(args, thunkApi);
13902
13906
  };
13903
13907
  var runAddDialogAgentAction = async (args, thunkApi) => {
@@ -13921,7 +13925,7 @@ var runSetDialogExtraReferencesAction = async (args, thunkApi) => {
13921
13925
  return setDialogExtraReferencesAction(args, thunkApi);
13922
13926
  };
13923
13927
  var runHandleSendMessageAction = async (args, thunkApi) => {
13924
- const { handleSendMessageAction } = await import("./handleSendMessageAction-E6PA6K6X.js");
13928
+ const { handleSendMessageAction } = await import("./handleSendMessageAction-YAO4RDWU.js");
13925
13929
  return handleSendMessageAction(args, thunkApi);
13926
13930
  };
13927
13931
  function clearDialogState() {
@@ -13934,7 +13938,7 @@ var createPageAndAddReference = createAsyncThunk(
13934
13938
  async (payload, { dispatch, getState, rejectWithValue }) => {
13935
13939
  const { slateData, jsonData, title, type, fileId, groupId, dialogKey } = payload;
13936
13940
  try {
13937
- const { createDocState } = await import("./docStore-IRZWBI3X.js");
13941
+ const { createDocState } = await import("./docStore-HI7P3MVA.js");
13938
13942
  const pageKey = await createDocState(
13939
13943
  { slateData, title },
13940
13944
  { dispatch, getState }
@@ -2,7 +2,7 @@ import {
2
2
  clipMultilineText,
3
3
  fetchAndSerializeTable,
4
4
  waitForAbortableDelay
5
- } from "./chunk-ZPRV4GQD.js";
5
+ } from "./chunk-XJECR5M3.js";
6
6
  import {
7
7
  isGatewayHttpStatus
8
8
  } from "./chunk-NF64D32W.js";
@@ -21,7 +21,7 @@ import {
21
21
  } from "./chunk-AGIM7IMJ.js";
22
22
  import {
23
23
  fetchAndCacheMessages
24
- } from "./chunk-Z4AZSU7X.js";
24
+ } from "./chunk-4GZ2LY5F.js";
25
25
  import {
26
26
  createSpaceKey
27
27
  } from "./chunk-UAD2WT54.js";
@@ -2,16 +2,19 @@ import {
2
2
  load
3
3
  } from "./chunk-KHCLMKZZ.js";
4
4
  import {
5
- buildSkillDiscoveryLayer
6
- } from "./chunk-VEA7H5FG.js";
5
+ DEFAULT_SKILL_CATALOG_BUDGET,
6
+ applySkillDescriptionBudget,
7
+ buildSkillDiscoveryCatalogLayer,
8
+ mapDiscoveredSkillsToCatalogEntries,
9
+ resolveSkillCatalog,
10
+ resolveSkillCatalogSync
11
+ } from "./chunk-Q6RMLYSA.js";
7
12
 
8
13
  // packages/agent-runtime/skillDiscovery.ts
9
14
  import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
10
15
  import { join } from "node:path";
11
16
  var SKILL_SCAN_DIRS = [".agents/skills"];
12
- var MAX_DISCOVERED_SKILLS = 50;
13
- var MAX_DISCOVERY_DESC_BUDGET = 4e3;
14
- var MIN_DESC_LENGTH = 80;
17
+ var MAX_DISCOVERED_SKILLS = DEFAULT_SKILL_CATALOG_BUDGET.maxEntries;
15
18
  function parseSkillFrontmatter(filePath) {
16
19
  try {
17
20
  const content = readFileSync(filePath, "utf8").slice(0, 2048);
@@ -57,17 +60,7 @@ function discoverSkills(cwd) {
57
60
  } catch {
58
61
  }
59
62
  }
60
- const totalDescLen = skills.reduce((sum, s) => sum + s.description.length, 0);
61
- if (totalDescLen > MAX_DISCOVERY_DESC_BUDGET && skills.length > 0) {
62
- const scale = MAX_DISCOVERY_DESC_BUDGET / totalDescLen;
63
- for (const s of skills) {
64
- const targetLen = Math.max(MIN_DESC_LENGTH, Math.floor(s.description.length * scale));
65
- if (s.description.length > targetLen) {
66
- s.description = s.description.slice(0, targetLen).trimEnd();
67
- }
68
- }
69
- }
70
- return skills;
63
+ return applySkillDescriptionBudget(skills);
71
64
  }
72
65
  function resolveSkillByName(cwd, name) {
73
66
  const trimmed = name.trim();
@@ -94,21 +87,64 @@ function resolveSkillByName(cwd, name) {
94
87
  }
95
88
  return null;
96
89
  }
97
- function buildSkillDiscoveryContextLayer(cwd) {
90
+ function listLocalWorkspaceSkillCatalogEntries(cwd) {
91
+ return mapDiscoveredSkillsToCatalogEntries(discoverSkills(cwd));
92
+ }
93
+ function createLocalWorkspaceSkillCatalogSource() {
94
+ return {
95
+ id: "local-workspace",
96
+ list: (query) => query.cwd ? listLocalWorkspaceSkillCatalogEntries(query.cwd) : []
97
+ };
98
+ }
99
+ var collectSources = (args) => [
100
+ ...args.includeLocalWorkspace === false || !args.cwd ? [] : [createLocalWorkspaceSkillCatalogSource()],
101
+ ...args.sources ?? []
102
+ ];
103
+ async function collectWorkspaceSkillCatalog(args) {
104
+ return resolveSkillCatalog(
105
+ collectSources(args),
106
+ { cwd: args.cwd },
107
+ args.budget ?? DEFAULT_SKILL_CATALOG_BUDGET
108
+ );
109
+ }
110
+ function collectWorkspaceSkillCatalogSync(args) {
111
+ return resolveSkillCatalogSync(
112
+ collectSources(args),
113
+ { cwd: args.cwd },
114
+ args.budget ?? DEFAULT_SKILL_CATALOG_BUDGET,
115
+ // HIGH-1:注入来源里混进异步实现时,跳过它并在 skillCatalog 里打 warn,
116
+ // 而不是抛错把「已经收集到的本地文件技能」一起丢掉。
117
+ { onAsyncSource: "skip" }
118
+ );
119
+ }
120
+ function buildSkillDiscoveryContextLayerFromCatalog(catalog) {
121
+ return buildSkillDiscoveryCatalogLayer(catalog);
122
+ }
123
+ function buildSkillDiscoveryContextLayer(cwd, options = {}) {
98
124
  try {
99
- return buildSkillDiscoveryLayer(discoverSkills(cwd), cwd);
100
- } catch {
125
+ return buildSkillDiscoveryCatalogLayer(
126
+ collectWorkspaceSkillCatalogSync({ cwd, sources: options.sources })
127
+ );
128
+ } catch (error) {
129
+ console.warn(
130
+ `[skillDiscovery] \u6280\u80FD\u76EE\u5F55\u88C5\u914D\u5931\u8D25\uFF0C\u672C\u8F6E\u4E0D\u5E26\u6280\u80FD\u7D22\u5F15\u8FD0\u884C\uFF1A${error instanceof Error ? error.message : String(error)}`
131
+ );
101
132
  return null;
102
133
  }
103
134
  }
104
- function buildSkillDiscoveryContextBlock(cwd) {
105
- return buildSkillDiscoveryContextLayer(cwd)?.content ?? null;
135
+ function buildSkillDiscoveryContextBlock(cwd, options = {}) {
136
+ return buildSkillDiscoveryContextLayer(cwd, options)?.content ?? null;
106
137
  }
107
138
 
108
139
  export {
109
140
  parseSkillFrontmatter,
110
141
  discoverSkills,
111
142
  resolveSkillByName,
143
+ listLocalWorkspaceSkillCatalogEntries,
144
+ createLocalWorkspaceSkillCatalogSource,
145
+ collectWorkspaceSkillCatalog,
146
+ collectWorkspaceSkillCatalogSync,
147
+ buildSkillDiscoveryContextLayerFromCatalog,
112
148
  buildSkillDiscoveryContextLayer,
113
149
  buildSkillDiscoveryContextBlock
114
150
  };
@@ -5,7 +5,7 @@ import {
5
5
  inlineImageUrlsForCustomProvider,
6
6
  prepareTools,
7
7
  shouldInlineImageUrlsForAgent
8
- } from "./chunk-DIP5EVZD.js";
8
+ } from "./chunk-SIX7N4AH.js";
9
9
  import {
10
10
  CONFIRMATION_INPUT_KEYS,
11
11
  INVALID_TOOL_ARGS_REPLACEMENT,
@@ -14,16 +14,16 @@ import {
14
14
  performFetchRequest,
15
15
  sanitizeOutboundMessages,
16
16
  stripModelToolArgs
17
- } from "./chunk-CH3QKJ2T.js";
17
+ } from "./chunk-ZV6ESGA7.js";
18
18
  import {
19
19
  findToolExecutor,
20
20
  toolDefinitionsByName
21
- } from "./chunk-5BSIT4IP.js";
21
+ } from "./chunk-37ZDGCX6.js";
22
22
  import {
23
23
  classifyApiError,
24
24
  classifyGenerationError,
25
25
  extractErrorDiagnostics
26
- } from "./chunk-KQFC7IPI.js";
26
+ } from "./chunk-6HFMPUSN.js";
27
27
  import {
28
28
  createSSEParser,
29
29
  createToolRunId,
@@ -32,7 +32,7 @@ import {
32
32
  toolRunSetPending,
33
33
  toolRunStarted,
34
34
  toolRunSucceeded
35
- } from "./chunk-ZPRV4GQD.js";
35
+ } from "./chunk-XJECR5M3.js";
36
36
  import {
37
37
  getPublicImageAgentMode
38
38
  } from "./chunk-VIDPVFP3.js";
@@ -45,10 +45,10 @@ import {
45
45
  messageStreaming,
46
46
  toolResultNeedsUserConfirmation,
47
47
  updateToolMessage
48
- } from "./chunk-Z4AZSU7X.js";
48
+ } from "./chunk-4GZ2LY5F.js";
49
49
  import {
50
50
  streamAgentChatTurn
51
- } from "./chunk-KBW2QSGY.js";
51
+ } from "./chunk-VMMS7L64.js";
52
52
  import {
53
53
  addActiveController,
54
54
  removeActiveController,
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  fetchReferenceContents,
3
3
  resolveReferenceAssets
4
- } from "./chunk-KQFC7IPI.js";
4
+ } from "./chunk-6HFMPUSN.js";
5
5
  import {
6
6
  updateTokensAction
7
- } from "./chunk-Z4AZSU7X.js";
7
+ } from "./chunk-4GZ2LY5F.js";
8
8
  import {
9
9
  applyUpdateTokensFulfilled
10
10
  } from "./chunk-OWYYDMGJ.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  addContentToSpace
3
- } from "./chunk-PHD5UL5B.js";
3
+ } from "./chunk-PEOLOK72.js";
4
4
  import {
5
5
  format,
6
6
  prepareAndPersistMessage,
7
7
  uiAskChoiceFunc,
8
8
  uiAskChoiceFunctionSchema
9
- } from "./chunk-Z4AZSU7X.js";
9
+ } from "./chunk-4GZ2LY5F.js";
10
10
  import {
11
11
  formatISO
12
12
  } from "./chunk-ZRAU6T47.js";
@@ -333,7 +333,7 @@ async function saveDocState(arg, { dispatch, getState }) {
333
333
  ).unwrap();
334
334
  if (dbSpaceId) {
335
335
  try {
336
- const { updateContentTitle } = await import("./contentThunks-TFYSYUDO.js");
336
+ const { updateContentTitle } = await import("./contentThunks-EPHFLF62.js");
337
337
  await dispatch(
338
338
  updateContentTitle({
339
339
  spaceId: dbSpaceId,
@@ -372,7 +372,7 @@ async function saveDocState(arg, { dispatch, getState }) {
372
372
  }
373
373
  }
374
374
  async function createDocState(args, thunkApi) {
375
- const { createPageAction } = await import("./createPageAction-XXI7D2CN.js");
375
+ const { createPageAction } = await import("./createPageAction-OTNUT7WI.js");
376
376
  return createPageAction(args, thunkApi);
377
377
  }
378
378
  function subscribe(listener) {
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-62TBKWTV.js";
7
7
  import {
8
8
  clearCliLocalRuntimePreparedAgentCache
9
- } from "./chunk-7XY4VVIL.js";
9
+ } from "./chunk-J5Y3BXJP.js";
10
10
  import {
11
11
  readCredentialAvailability
12
12
  } from "./chunk-R4BMKAR5.js";
@@ -60,7 +60,7 @@ import {
60
60
  import {
61
61
  inlineImageUrlsForCustomProvider,
62
62
  prepareTools
63
- } from "./chunk-DIP5EVZD.js";
63
+ } from "./chunk-SIX7N4AH.js";
64
64
  import {
65
65
  getServerProviderSecret
66
66
  } from "./chunk-HS7MLR74.js";
@@ -82,7 +82,7 @@ import {
82
82
  resolveCliLocalRuntimeKeyCapability,
83
83
  resolveCliLocalSpawnDispatch,
84
84
  resolveStartAgentRunCwd
85
- } from "./chunk-5BSIT4IP.js";
85
+ } from "./chunk-37ZDGCX6.js";
86
86
  import {
87
87
  deriveCredentialGroup,
88
88
  deriveCustomProviderCredentialGroup
@@ -93,7 +93,7 @@ import {
93
93
  } from "./chunk-KFHREHUQ.js";
94
94
  import {
95
95
  resolveAgentRequiredPackIds
96
- } from "./chunk-ZPRV4GQD.js";
96
+ } from "./chunk-XJECR5M3.js";
97
97
  import {
98
98
  getDefaultCliLocalRuntimeDb
99
99
  } from "./chunk-FDLDMJTM.js";
@@ -105,14 +105,14 @@ import {
105
105
  resolveBuiltinPlatformAgentConfig,
106
106
  runKeyed,
107
107
  validateAskChoiceInput
108
- } from "./chunk-Z4AZSU7X.js";
108
+ } from "./chunk-4GZ2LY5F.js";
109
109
  import {
110
110
  BUILTIN_DIALOG_LLM_CHAT_FALLBACK_MODEL,
111
111
  BUILTIN_TITLE_LLM_CONFIG
112
112
  } from "./chunk-523DITKR.js";
113
113
  import {
114
114
  fetchServerSyncedCredential
115
- } from "./chunk-KBW2QSGY.js";
115
+ } from "./chunk-VMMS7L64.js";
116
116
  import {
117
117
  isTombstoneRecord
118
118
  } from "./chunk-D2MDMY2M.js";
@@ -169,7 +169,7 @@ import {
169
169
  runExecShellGates,
170
170
  validateConfiguredRootExecutionLease,
171
171
  verifyOwnerRouteAck
172
- } from "./chunk-IOQHM7ID.js";
172
+ } from "./chunk-4ALQFIFF.js";
173
173
  import {
174
174
  accumulateGeminiChunks,
175
175
  buildGeminiGenerateContentRequest,
@@ -4201,60 +4201,153 @@ import { dirname as dirname4, extname, join as join6 } from "node:path";
4201
4201
  import { fileURLToPath } from "node:url";
4202
4202
 
4203
4203
  // packages/cli/client/localRunExecutionIsolation.ts
4204
+ var UNSANDBOXED_HOST_EXECUTION_MESSAGE = "\u672C\u673A\u6267\u884C\u65E0\u6C99\u76D2\u9694\u79BB\uFF0C\u547D\u4EE4\u76F4\u63A5\u4F5C\u7528\u4E8E\u4F60\u7684\u5DE5\u4F5C\u533A";
4205
+ function normalizeIsolationPlatform(value) {
4206
+ return typeof value === "string" && value.trim() ? value.trim().toLowerCase() : "unknown";
4207
+ }
4208
+ function isSandboxBackendAvailableOnPlatform(platform) {
4209
+ return normalizeIsolationPlatform(platform) === "linux";
4210
+ }
4204
4211
  function resolveLocalRunExecutionIsolationFact(args) {
4205
4212
  const recordedAt = args.nowMs ?? Date.now();
4213
+ const platform = normalizeIsolationPlatform(args.platform);
4214
+ const sandboxBackend = resolveSandboxBackendSupport({
4215
+ platform,
4216
+ dockerWorkloadEnabled: args.dockerWorkloadEnabled,
4217
+ instaboxWorkloadEnabled: args.instaboxWorkloadEnabled,
4218
+ bwrapWorkloadAvailable: args.bwrapWorkloadAvailable,
4219
+ override: args.sandboxBackend
4220
+ });
4221
+ const finish = (fact) => ({
4222
+ ...fact,
4223
+ platform,
4224
+ sandboxBackend,
4225
+ notice: buildIsolationNotice({ fact, platform, sandboxBackend })
4226
+ });
4206
4227
  if (args.dockerWorkloadEnabled) {
4207
- return {
4228
+ return finish({
4208
4229
  surface: "docker-sandbox",
4209
4230
  isolation: "container",
4210
4231
  sandbox: "docker",
4211
4232
  reason: "docker-workload",
4212
4233
  note: "\u672C run \u7684\u5DE5\u4F5C\u533A\u5DE5\u5177\u65CF\uFF08execShell / readFile / writeFile / editFile / globFiles / grepFiles\uFF09\u8D70\u672C\u673A sbx \u4E91\u6C99\u76D2\uFF08container \u8FB9\u754C\uFF09\uFF0C\u5BBF\u4E3B\u6267\u884C\u5668\u96F6\u8C03\u7528\u3002",
4213
4234
  recordedAt
4214
- };
4235
+ });
4236
+ }
4237
+ if (args.instaboxWorkloadEnabled) {
4238
+ return finish({
4239
+ surface: "instabox-sandbox",
4240
+ isolation: "container",
4241
+ sandbox: "instabox",
4242
+ reason: "instabox-workload",
4243
+ note: "\u672C run \u8D70 `runtimeKey=instabox`\uFF1AexecShell \u4E0E\u6587\u4EF6\u5DE5\u5177\uFF08readFile / writeFile / editFile / globFiles / grepFiles\uFF09\u90FD\u5728 Instabox \u4E91\u5BB9\u5668\u6267\u884C\u540E\u7AEF\u5B8C\u6210\uFF08container \u8FB9\u754C\uFF09\uFF0C\u96A7\u9053\u663E\u5F0F\u62D2\u7EDD\u56DE\u843D\u5BBF\u4E3B\uFF1B\u4E0D\u652F\u6301\u7684\u5DE5\u4F5C\u533A\u5DE5\u5177\u76F4\u63A5\u62A5\u9519\uFF0C\u4E0D\u4F1A\u843D\u5230\u672C\u673A\u3002\u9694\u79BB\u5F3A\u5EA6\u4E0E\u5BBF\u4E3B\u5E73\u53F0\u65E0\u5173\uFF08darwin / win32 \u4E0A\u540C\u6837\u662F\u5BB9\u5668\uFF09\u3002",
4244
+ recordedAt
4245
+ });
4215
4246
  }
4216
4247
  if (args.bwrapWorkloadAvailable === true) {
4217
- return {
4248
+ return finish({
4218
4249
  surface: "bwrap-os-sandbox",
4219
4250
  isolation: "os-sandbox",
4220
4251
  sandbox: "bwrap",
4221
4252
  reason: "bwrap-execshell-only",
4222
4253
  note: "\u672C run \u7684 execShell \u8D70\u672C\u673A linux-bubblewrap-v1\uFF08user namespace + seccomp\uFF09\uFF1BreadFile / writeFile / editFile / globFiles / grepFiles **\u4ECD\u5728\u5BBF\u4E3B\u6267\u884C**\uFF0C\u9694\u79BB\u53EA\u8986\u76D6 shell\u3002",
4223
4254
  recordedAt
4224
- };
4255
+ });
4225
4256
  }
4226
4257
  if (args.runtimeKey === "local") {
4227
- return {
4258
+ return finish({
4228
4259
  surface: "host",
4229
4260
  isolation: "none",
4230
4261
  sandbox: "host",
4231
4262
  reason: "host-explicit-writes",
4232
4263
  note: "\u672C run \u7531\u8C03\u7528\u65B9**\u663E\u5F0F\u70B9\u540D runtimeKey=local**\uFF1A\u5728\u5BBF\u4E3B\u5DE5\u4F5C\u533A\u6267\u884C\u4E14**\u65E0\u9694\u79BB**\uFF0C\u5199\u64CD\u4F5C\u76F4\u63A5\u4F5C\u7528\u4E8E\u5BBF\u4E3B\u6587\u4EF6\u7CFB\u7EDF\uFF08\u4E0D\u843D docker \u526F\u672C\uFF09\u3002\u6388\u6743\u786E\u8BA4\u7531\u8C03\u7528\u65B9\u53E6\u884C\u8BB0\u5F55\uFF0C\u672C\u6587\u4EF6\u4E0D\u63A8\u65AD\u3002",
4233
4264
  recordedAt
4234
- };
4265
+ });
4235
4266
  }
4236
4267
  if (args.readOnly === true) {
4237
- return {
4268
+ return finish({
4238
4269
  surface: "host",
4239
4270
  isolation: "none",
4240
4271
  sandbox: "host",
4241
4272
  reason: "read-only-host",
4242
4273
  note: "\u53EA\u8BFB\u6D3E\u53D1\uFF08\u8C03\u7528\u65B9\u58F0\u660E readOnly\uFF0C\u65E0\u5199\u5DE5\u5177\uFF09\uFF1A\u7559\u5728\u5BBF\u4E3B\u6267\u884C\u4E14**\u65E0\u9694\u79BB**\uFF1B\u5B83\u5199\u4E0D\u4E86\u6587\u4EF6\uFF0C\u8D77\u6C99\u76D2\u662F\u7EAF\u6D6A\u8D39\u3002",
4243
4274
  recordedAt
4244
- };
4275
+ });
4245
4276
  }
4246
- return {
4277
+ if (platform !== "unknown" && !isSandboxBackendAvailableOnPlatform(platform)) {
4278
+ return finish({
4279
+ surface: "host",
4280
+ isolation: "none",
4281
+ sandbox: "host",
4282
+ reason: "host-no-sandbox-backend",
4283
+ note: `\u672C run \u5728\u5BBF\u4E3B\u6267\u884C\u4E14**\u65E0\u9694\u79BB**\uFF1A${platform} \u4E0A\u6CA1\u6709\u53EF\u9694\u79BB\u672C\u673A\u6267\u884C\u7684\u6C99\u76D2\u540E\u7AEF\uFF08macOS \u7684 seatbelt \u4EC5\u6709\u7C7B\u578B\u58F0\u660E\u3001\u65E0\u5B9E\u73B0\uFF1BWindows \u65E0\u5BF9\u5E94\u673A\u5236\uFF09\uFF0C\u547D\u4EE4\u4E0E\u6587\u4EF6\u5199\u5165\u76F4\u63A5\u4F5C\u7528\u4E8E\u5BBF\u4E3B\u5DE5\u4F5C\u533A\u3002\u8981\u9694\u79BB\u8BF7\u7528 --runtime-key docker\u3002`,
4284
+ recordedAt
4285
+ });
4286
+ }
4287
+ return finish({
4247
4288
  surface: "host",
4248
4289
  isolation: "none",
4249
4290
  sandbox: "host",
4250
4291
  reason: "host-no-sandbox",
4251
4292
  note: "\u672C run \u5728\u5BBF\u4E3B\u6267\u884C\u4E14**\u65E0\u9694\u79BB**\uFF08\u672A\u8D70 docker \u901A\u9053\uFF0C\u4E5F\u6CA1\u6709\u53EF\u7528\u7684 bwrap workload\uFF09\u3002\u5199\u64CD\u4F5C\u76F4\u63A5\u4F5C\u7528\u4E8E\u5BBF\u4E3B\u5DE5\u4F5C\u533A\uFF1B\u6D3E\u53D1\u578B run \u7684\u9ED8\u8BA4\u843D\u70B9\u662F\u672C\u673A docker \u6C99\u76D2\uFF0C\u4EA4\u4E92\u5F0F run \u53EF\u7528 --runtime-key docker\uFF08\u6216 --local \u663E\u5F0F\u58F0\u660E\u672C\u673A\u6267\u884C\uFF09\u3002",
4252
4293
  recordedAt
4294
+ });
4295
+ }
4296
+ function resolveSandboxBackendSupport(args) {
4297
+ if (args.override) return args.override;
4298
+ if (args.dockerWorkloadEnabled || args.instaboxWorkloadEnabled || args.bwrapWorkloadAvailable === true) {
4299
+ return "available";
4300
+ }
4301
+ if (args.platform === "unknown") return "unknown";
4302
+ if (!isSandboxBackendAvailableOnPlatform(args.platform)) return "none-on-platform";
4303
+ return args.bwrapWorkloadAvailable === false ? "unavailable" : "unknown";
4304
+ }
4305
+ function buildIsolationNotice(args) {
4306
+ if (args.fact.reason === "read-only-host") return null;
4307
+ if (args.fact.isolation !== "none") return null;
4308
+ if (args.sandboxBackend !== "none-on-platform" && args.sandboxBackend !== "unavailable") {
4309
+ return null;
4310
+ }
4311
+ const why = args.sandboxBackend === "none-on-platform" ? `${args.platform} \u4E0A\u6CA1\u6709\u53EF\u9694\u79BB\u672C\u673A\u6267\u884C\u7684\u6C99\u76D2\u540E\u7AEF` + (args.platform === "darwin" ? "\uFF08seatbelt \u4EC5\u6709\u7C7B\u578B\u58F0\u660E\u3001\u65E0\u5B9E\u73B0\uFF09" : "") : "\u672C\u673A\u6C99\u76D2\u540E\u7AEF\u4E0D\u53EF\u7528\uFF08Linux \u9700\u8981 bwrap \u4E0E user namespace\uFF09";
4312
+ return {
4313
+ code: "host-execution-unsandboxed",
4314
+ level: "warn",
4315
+ message: `${UNSANDBOXED_HOST_EXECUTION_MESSAGE}\uFF1A${why}\uFF0Crun \u4ECD\u5728\u5BBF\u4E3B\u8FDB\u7A0B\u91CC\u8DD1\u3002`,
4316
+ platform: args.platform,
4317
+ reason: args.fact.reason,
4318
+ sandboxBackend: args.sandboxBackend
4253
4319
  };
4254
4320
  }
4255
4321
  function describeLocalRunExecutionIsolation(fact) {
4256
4322
  return `execution isolation: ${fact.isolation} (sandbox: ${fact.sandbox}, target: ${fact.surface}) \u2014 ${fact.note}`;
4257
4323
  }
4324
+ var emittedNoticeKeys = /* @__PURE__ */ new Set();
4325
+ function createLocalRunIsolationNoticeEmitter(args) {
4326
+ const seen = args.seen ?? emittedNoticeKeys;
4327
+ return (fact, context) => {
4328
+ const notice = fact.notice;
4329
+ if (!notice) return false;
4330
+ const key = `${notice.platform}:${notice.sandboxBackend}:${notice.reason}`;
4331
+ if (seen.has(key)) return false;
4332
+ seen.add(key);
4333
+ args.sink({
4334
+ message: notice.message,
4335
+ fields: {
4336
+ event: "execution_isolation_unsandboxed",
4337
+ code: notice.code,
4338
+ level: notice.level,
4339
+ isolation: fact.isolation,
4340
+ sandbox: fact.sandbox,
4341
+ surface: fact.surface,
4342
+ reason: fact.reason,
4343
+ platform: fact.platform,
4344
+ sandboxBackend: fact.sandboxBackend,
4345
+ ...context ?? {}
4346
+ }
4347
+ });
4348
+ return true;
4349
+ };
4350
+ }
4258
4351
  function recordLocalRunExecutionIsolation(args) {
4259
4352
  const path = joinPath(args.runsDir, `${args.runId}.isolation.json`);
4260
4353
  args.fs.mkdirSync?.(args.runsDir, { recursive: true });
@@ -12386,6 +12479,11 @@ function setCliAutoCompactionSummaryFallback(caller) {
12386
12479
  function getCliAutoCompactionSummaryFallback() {
12387
12480
  return cliAutoCompactionSummaryFallback;
12388
12481
  }
12482
+ var emitRunIsolationNotice = createLocalRunIsolationNoticeEmitter({
12483
+ sink: ({ message, fields }) => {
12484
+ getLogger("cli.localRuntimeAdapter").child({ fields }).warn(`[nolo] ${message}`);
12485
+ }
12486
+ });
12389
12487
  function createCliLocalRuntimeAdapter(deps) {
12390
12488
  const now = deps.now ?? Date.now;
12391
12489
  const createId = deps.createId ?? createFallbackId;
@@ -12538,16 +12636,20 @@ function createCliLocalRuntimeAdapter(deps) {
12538
12636
  }
12539
12637
  };
12540
12638
  const recordRunExecutionIsolation = async () => {
12639
+ const fact = resolveLocalRunExecutionIsolationFact({
12640
+ runtimeKey: dockerRuntimeEnabled ? "docker" : instaboxRuntimeEnabled ? "instabox" : runtimeKey === "local" ? "local" : void 0,
12641
+ dockerWorkloadEnabled: dockerRuntimeEnabled,
12642
+ // MEDIUM-1(review):instabox 是容器隔离通道(execShell + 文件工具 bridge,
12643
+ // 显式拒绝回落宿主),darwin / win32 上同样不是宿主执行。不传这一项会落进
12644
+ // 「本平台没有隔离后端」分支,产出「本机执行无沙盒隔离」的误报。
12645
+ instaboxWorkloadEnabled: instaboxRuntimeEnabled,
12646
+ platform: process.platform
12647
+ });
12648
+ const runId = asOptionalTrimmedString(deps.env?.NOLO_AGENT_RUN_ID) ?? "interactive";
12649
+ emitRunIsolationNotice(fact, { runId });
12541
12650
  try {
12542
12651
  const { writeFileSync: writeFileSync4, mkdirSync: mkdirSync4 } = await import("node:fs");
12543
12652
  const { resolveRunsDir: resolveRunsDir2 } = await import("./agentRunControl-SBHIICUQ.js");
12544
- const fact = resolveLocalRunExecutionIsolationFact({
12545
- // F1:显式点名宿主执行的 run 在审计里必须与 docker 沙盒区分开
12546
- // (reason: host-explicit-writes vs docker-workload)。
12547
- runtimeKey: dockerRuntimeEnabled ? "docker" : runtimeKey === "local" ? "local" : void 0,
12548
- dockerWorkloadEnabled: dockerRuntimeEnabled
12549
- });
12550
- const runId = asOptionalTrimmedString(deps.env?.NOLO_AGENT_RUN_ID) ?? "interactive";
12551
12653
  recordLocalRunExecutionIsolation({
12552
12654
  runId,
12553
12655
  runsDir: resolveRunsDir2(deps.env),
@@ -7,7 +7,7 @@ import {
7
7
  deleteDialog,
8
8
  runtime_default,
9
9
  toast
10
- } from "./chunk-Z4AZSU7X.js";
10
+ } from "./chunk-4GZ2LY5F.js";
11
11
  import {
12
12
  formatISO
13
13
  } from "./chunk-ZRAU6T47.js";