nolo-cli 0.18.0 → 0.24.0-alpha.6

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 (133) hide show
  1. package/{_executeModel-X5PCIZN6.js → _executeModel-ARCMGGMY.js} +46 -44
  2. package/{action-LT7BRFLK.js → action-5MNAXR5B.js} +7 -6
  3. package/{addContentAction-PL3KKBDH.js → addContentAction-UNSYTVTB.js} +5 -5
  4. package/{addDialogAgentAction-FCMSKYAF.js → addDialogAgentAction-LJGNP2AO.js} +5 -5
  5. package/{agentDeleteCommand-2BZDQV36.js → agentDeleteCommand-C5PIEBMZ.js} +27 -26
  6. package/{agentEmailCommands-2QJDGRMB.js → agentEmailCommands-QTGQ3ZAD.js} +57 -55
  7. package/{agentListCommands-6VEPTKBI.js → agentListCommands-LRHBS3A5.js} +30 -26
  8. package/{agentMachineCommands-NVVHNWYI.js → agentMachineCommands-4PXIT4BP.js} +25 -24
  9. package/{agentRecordCommands-4GGRDMD4.js → agentRecordCommands-ZZPTYTYR.js} +52 -50
  10. package/{agentRunCommand-XOLQNKBZ.js → agentRunCommand-7ZTPZNUX.js} +55 -54
  11. package/{agentRunControl-Y5AFH5PQ.js → agentRunControl-SNUKXN6J.js} +6 -2
  12. package/{agentRuntimeLocal-7WYWCGL4.js → agentRuntimeLocal-QOYY5UV2.js} +19 -18
  13. package/{agentSlice-EAXPGEYV.js → agentSlice-J3W3RX2I.js} +5 -5
  14. package/{appDeleteCommands-77KR2RJ4.js → appDeleteCommands-7NS46XDH.js} +23 -22
  15. package/{appDeployCommands-K7CAHGBI.js → appDeployCommands-RSRNQ67U.js} +23 -22
  16. package/{appDeployStatusCommands-4OEKLTBT.js → appDeployStatusCommands-EF4RSGC6.js} +23 -22
  17. package/{appGetCommands-VM2WDLAZ.js → appGetCommands-YA7JWYUX.js} +23 -22
  18. package/{appListCommands-GX6BBA6U.js → appListCommands-WM2ON6JW.js} +23 -22
  19. package/{authCommand-DY6UUL6O.js → authCommand-HJP7FURK.js} +12 -13
  20. package/{authCommands-XTBV7OFZ.js → authCommands-NYZM2B2I.js} +4 -5
  21. package/{chunk-MKA6QE5E.js → chunk-2IPEVBUO.js} +126 -68
  22. package/{chunk-OWOHNGCN.js → chunk-2MBTWINN.js} +42 -3
  23. package/{chunk-K6EUAOW3.js → chunk-35RYGII3.js} +1 -1
  24. package/{chunk-TRT4I4UD.js → chunk-4POUK2BV.js} +2 -2
  25. package/{chunk-LLWKHDG4.js → chunk-4ULSC37S.js} +1 -3
  26. package/{chunk-EDV7EBOI.js → chunk-4ZH6GUJF.js} +2151 -1500
  27. package/{chunk-MVQ4TBSD.js → chunk-54VHTARN.js} +1 -1
  28. package/{chunk-L4F3I4SR.js → chunk-5HQQ4LUU.js} +4 -6
  29. package/{chunk-Z4NR32XR.js → chunk-5RGU3J7P.js} +13 -0
  30. package/{chunk-7BUYEZ6U.js → chunk-7H3UTGPM.js} +12 -72
  31. package/{chunk-RQN4SEKL.js → chunk-7W6GFNJL.js} +1 -1
  32. package/{chunk-HEGV7BH3.js → chunk-AQZCWJOG.js} +1 -1
  33. package/{chunk-3ND52WIL.js → chunk-ATWUOTJP.js} +180 -24
  34. package/chunk-CF7S2RYZ.js +376 -0
  35. package/{chunk-I2ZJKTG5.js → chunk-CGVRC2TB.js} +7 -7
  36. package/{chunk-UAIVG4J6.js → chunk-CHSCAUZN.js} +1 -8
  37. package/{chunk-KFEVY3ST.js → chunk-D34RI6NI.js} +18 -8
  38. package/{chunk-ROWQEJRP.js → chunk-DXJS7VSG.js} +3 -2
  39. package/{chunk-MHSGJW4Z.js → chunk-EHOYZRTI.js} +44 -14
  40. package/{chunk-XRZJGPFI.js → chunk-FON47ACC.js} +4 -4
  41. package/{chunk-SCTYAHYK.js → chunk-H2NAWOLH.js} +217 -141
  42. package/{chunk-MPVYDS7I.js → chunk-H6ODMJR3.js} +3 -3
  43. package/{chunk-R35XMF6F.js → chunk-H73ZV2GL.js} +352 -30
  44. package/{chunk-4T5F7YZQ.js → chunk-I6RJGORZ.js} +1 -1
  45. package/{chunk-OK6YSWLH.js → chunk-IICW77GI.js} +1 -1
  46. package/{chunk-VDXCXCXH.js → chunk-IUDMBCXC.js} +1 -1
  47. package/{chunk-AHCY2S2I.js → chunk-JADNODCQ.js} +1 -1
  48. package/{chunk-DFCFMCY6.js → chunk-JBLY6HQP.js} +2 -2
  49. package/{chunk-UGUW3FHG.js → chunk-JMSCXQUG.js} +2 -2
  50. package/{chunk-N54HIJVJ.js → chunk-KFUCLS7Z.js} +101 -9
  51. package/{chunk-FQZZLA3C.js → chunk-KXKQO4Q6.js} +17 -0
  52. package/{chunk-3Q7WHGCB.js → chunk-L65QKSVJ.js} +1 -1
  53. package/{chunk-3ZX7PERL.js → chunk-LALVWNE4.js} +20 -7
  54. package/{chunk-PJSV3IZ5.js → chunk-M3TMVJKG.js} +1 -1
  55. package/{chunk-REA4JLBH.js → chunk-M5OZCOBV.js} +7 -6
  56. package/{chunk-JLA4FXYC.js → chunk-MALVZUYL.js} +1 -1
  57. package/{chunk-GFUIQ4RY.js → chunk-MXFQHRSS.js} +1 -1
  58. package/{chunk-LSFAWXKC.js → chunk-N7J63Q6C.js} +1 -0
  59. package/{chunk-6Y7A3OQQ.js → chunk-NRY4GCKJ.js} +2 -0
  60. package/{chunk-G5U6LDLG.js → chunk-NVHPMDSZ.js} +6 -6
  61. package/{chunk-23FZYPLC.js → chunk-OJFYT3ZQ.js} +842 -1060
  62. package/{chunk-ELT65PZW.js → chunk-OXLLFZNF.js} +1 -1
  63. package/{chunk-CZ6NYQTV.js → chunk-P4QWLZGU.js} +2 -2
  64. package/{chunk-5MIDPSSK.js → chunk-PB7G5MAM.js} +3 -3
  65. package/{chunk-HWW2M4SN.js → chunk-QLVWFXZQ.js} +5 -4
  66. package/{chunk-VYHDJEQD.js → chunk-QNLLGS37.js} +136 -78
  67. package/{chunk-XHG22OEX.js → chunk-ROJI6DRT.js} +2 -2
  68. package/{chunk-BV4VEE3W.js → chunk-ROYOKSX4.js} +243 -354
  69. package/{chunk-VNAEBGDK.js → chunk-RZNYL4LW.js} +123 -26
  70. package/{chunk-RVOUXDFU.js → chunk-S6KVFOUG.js} +6 -34
  71. package/{chunk-V3ED5AWK.js → chunk-S77SCVBU.js} +27 -16
  72. package/{chunk-UBHAWFQ6.js → chunk-S7RWIPDI.js} +42 -19
  73. package/{chunk-B5TOXZAK.js → chunk-SIZQB7BD.js} +1 -1
  74. package/{chunk-DFFIZ25G.js → chunk-SLOGKB7M.js} +4 -1
  75. package/{chunk-FXUSIQC2.js → chunk-SROR5TSM.js} +1 -1
  76. package/{chunk-PIZYJVHQ.js → chunk-TN4YHAI3.js} +4 -4
  77. package/{chunk-IYEXFJPC.js → chunk-TW35GDNW.js} +64 -57
  78. package/chunk-UZ6XXCVR.js +50 -0
  79. package/{chunk-DKZFOK24.js → chunk-UZH44DWK.js} +7 -288
  80. package/{chunk-YGW4G5W5.js → chunk-X546QUDT.js} +61 -12
  81. package/chunk-YYLHWIW6.js +48 -0
  82. package/{chunk-SWDPIPOY.js → chunk-ZGVW7MSZ.js} +1 -1
  83. package/{chunk-34WPV75U.js → chunk-ZUXIXYJI.js} +1 -1
  84. package/{chunk-VC6OZXO5.js → chunk-ZWJOGMKH.js} +2 -26
  85. package/{cliExecutor-DNE7TCC4.js → cliExecutor-K3F7DMRO.js} +2 -2
  86. package/{codingSkills-36KN5NQT.js → codingSkills-EN6Z6G6U.js} +4 -4
  87. package/{createAgentAutomationAction-GNFF524X.js → createAgentAutomationAction-MKQWN4VQ.js} +19 -18
  88. package/{createDialogAction-RB55KCLO.js → createDialogAction-YWIZPLFS.js} +22 -20
  89. package/{createPageAction-Y7343GLU.js → createPageAction-74TTEIPC.js} +20 -19
  90. package/{db-W3O47YGF.js → db-W5UHK4P3.js} +150 -0
  91. package/{dbSlice-CGSRFJN3.js → dbSlice-5BKDURDL.js} +4 -4
  92. package/{dialogCommands-IAZK6YHQ.js → dialogCommands-MJIP32FL.js} +24 -23
  93. package/{dialogSlice-UQAXF23P.js → dialogSlice-KLLVH4WI.js} +24 -18
  94. package/{docCreateCommands-I2EWZGCI.js → docCreateCommands-5DN472U6.js} +24 -27
  95. package/{docDeleteCommands-IZ45UZKG.js → docDeleteCommands-HE76LBN4.js} +25 -24
  96. package/{docReadCommands-R6Z4QJYU.js → docReadCommands-XVGZSCBS.js} +24 -23
  97. package/{docStore-5HOJ4D7D.js → docStore-SPH3D6BT.js} +20 -19
  98. package/{docUpdateCommands-2LRBKQPY.js → docUpdateCommands-P7IAWUAD.js} +24 -27
  99. package/{fetchMessages-BMGVZVSE.js → fetchMessages-W4IKHPCS.js} +2 -3
  100. package/{getPricing-G7DLAST6.js → getPricing-WENPBVWH.js} +3 -3
  101. package/{handleSendMessageAction-Q4HY35WX.js → handleSendMessageAction-ZU6WJVL7.js} +23 -20
  102. package/index.js +74 -74
  103. package/{localDialogRead-4H3QJFLW.js → localDialogRead-JXTAHW2E.js} +2 -2
  104. package/{machineCommands-PKBPQKTY.js → machineCommands-NI76PVHK.js} +59 -57
  105. package/{machineWsRunDispatch-UZAW4OXJ.js → machineWsRunDispatch-W3G6NJVQ.js} +51 -49
  106. package/{models-DJFSJ7SW.js → models-DB27UAE3.js} +2 -2
  107. package/package.json +1 -1
  108. package/{read-3FMPZPER.js → read-F3L3T2WJ.js} +2 -1
  109. package/{readDocTool-VSYHKK3V.js → readDocTool-FOHWVA4R.js} +1 -1
  110. package/{readlineWorkspace-Y2RDOFZG.js → readlineWorkspace-BDH4G477.js} +880 -425
  111. package/{removeDialogAgentAction-OAGA2G3U.js → removeDialogAgentAction-QCFGIUIH.js} +8 -7
  112. package/{runAgentClientLoop-NBPIKJ6J.js → runAgentClientLoop-ZPKMXCM5.js} +45 -38
  113. package/{setDialogExtraReferencesAction-JZEXA5SL.js → setDialogExtraReferencesAction-DK4CKERU.js} +5 -5
  114. package/{setPrimaryDialogAgentAction-4ZUQQKDG.js → setPrimaryDialogAgentAction-SJSO6N27.js} +8 -7
  115. package/{settingSlice-7MNKHZ6R.js → settingSlice-XNM5AFPU.js} +6 -5
  116. package/{spaceCommands-DHCZ7J5I.js → spaceCommands-3GGBJRQR.js} +25 -24
  117. package/{spaceSlice-ZXLLG3CR.js → spaceSlice-47Z6XLFQ.js} +21 -18
  118. package/{streamAgentChatTurn-L3YW6LSB.js → streamAgentChatTurn-VT5K5JSD.js} +140 -98
  119. package/switchDialogAgentAction-4OAC6QRN.js +61 -0
  120. package/{tableCommands-BEQAGE4I.js → tableCommands-HEQYT2KP.js} +1 -1
  121. package/{toolApiClient-QI3YBNWB.js → toolApiClient-ISM4ZQX4.js} +2 -2
  122. package/{tools-ECGXR5QF.js → tools-L7RCHAPT.js} +36 -33
  123. package/{tuiSummaryLlmCaller-OMSCNHXA.js → tuiSummaryLlmCaller-3DYOLTVN.js} +6 -6
  124. package/{updateCommands-XTW55TOT.js → updateCommands-HTCOBXCA.js} +2 -2
  125. package/{updateDialogTitleAction-HQ2EUDFT.js → updateDialogTitleAction-KMPVPQ4A.js} +28 -27
  126. package/chunk-DL6EPNIK.js +0 -50
  127. package/chunk-V5R4NZP2.js +0 -78
  128. package/chunk-X4Q4UZEY.js +0 -26
  129. package/queryRunOverlay-O4LOMMPO.js +0 -161
  130. package/runOverlayPresentation-ZO4VCWEU.js +0 -11
  131. package/types-ZSTJ7MPR.js +0 -7
  132. package/{chunk-X7W4TNB4.js → chunk-CMKUBIGW.js} +3 -3
  133. package/{runtimeDoctorCommands-E2OUORHK.js → runtimeDoctorCommands-HSU632DY.js} +3 -3
@@ -0,0 +1,376 @@
1
+ import {
2
+ SYSTEM_AGENT_CAPABILITIES,
3
+ SYSTEM_AGENT_CAPABILITY_IDS
4
+ } from "./chunk-UZ6XXCVR.js";
5
+
6
+ // packages/ai/tools/codeWorkDiscipline.ts
7
+ var CODE_WORK_DISCIPLINE_BODY = `## \u6548\u7387\u4F18\u5148\uFF08\u7701 token\uFF09
8
+ - \u4E0D\u590D\u8FF0\u9700\u6C42\uFF0C\u4E0D\u89E3\u91CA\u300C\u6253\u7B97\u600E\u4E48\u505A\u300D\uFF0C\u76F4\u63A5\u52A8\u624B\u3002\u6539\u5B8C\u53EA\u7528\u4E00\u4E24\u53E5\u8BDD\u8BF4\u6E05\u300C\u6539\u4E86\u4EC0\u4E48\u3001\u53BB\u54EA\u770B\u300D\u3002
9
+ - \u601D\u8003\u7B80\u77ED\uFF1A\u5B9A\u4F4D\u95EE\u9898\u5373\u53EF\uFF0C\u4E0D\u505A\u957F\u7BC7\u63A8\u6F14\u3002
10
+ - \u5C0F\u6539\u52A8\u8D70\u6700\u77ED\u8DEF\u5F84\uFF1AsearchFiles/globFiles \u5B9A\u4F4D \u2192 readFile \u786E\u8BA4 \u2192 editFile \u7CBE\u786E\u66FF\u6362\u3002\u80FD\u4E00\u6B21\u547D\u4E2D\u5C31\u4E0D\u8981\u53CD\u590D\u8BFB\u6587\u4EF6\u3002
11
+ - \u5DF2\u7ECF\u77E5\u9053\u6587\u4EF6\u548C\u4F4D\u7F6E\u65F6\uFF0C\u8DF3\u8FC7\u591A\u4F59\u7684 search/read\uFF0C\u76F4\u63A5 edit\u3002
12
+ - \u7981\u6B62\u4E3A\u4E00\u4E2A\u5C0F\u6539\u52A8\u6574\u9875\u91CD\u5199\u6216\u8FDE\u5E26\u6539\u52A8\u672A\u547D\u4E2D\u7684\u90E8\u5206\u3002
13
+
14
+ ## \u4EE3\u7801\u4FEE\u6539\u7EAA\u5F8B
15
+ - \u7F16\u8F91\u524D\u5148 readFile \u786E\u8BA4\u5F53\u524D\u5185\u5BB9\uFF0C\u907F\u514D stale hash \u9519\u8BEF\u3002
16
+ - \u53EA\u78B0\u4EFB\u52A1\u4E66\u5217\u51FA\u7684\u6587\u4EF6\uFF1B\u6539\u5B8C\u7528 \`git status --short\` \u81EA\u67E5\uFF0C\u82E5\u6539\u5230\u6E05\u5355\u5916\u6587\u4EF6\uFF0C\u5982\u5B9E\u62A5\u544A\u3002
17
+ - \u4E0D\u8981 \`git add\` / \`git commit\` / \`git push\` / \`git stash\` / \`git reset\` / \`git checkout\` / \`git clean\`\u2014\u2014\u6539\u52A8\u7559\u5728\u5DE5\u4F5C\u533A\uFF0C\u63D0\u4EA4\u7531\u8C03\u7528\u65B9\u9A8C\u6536\u540E\u5904\u7406\u3002\u4ED3\u5E93\u5E38\u6709\u591A\u4E2A\u4F1A\u8BDD\u5171\u7528\u4E00\u4E2A checkout\uFF0C\u4F60\u4E00\u63D0\u4EA4\u5C31\u4F1A\u628A\u522B\u4EBA\u7684\u5728\u9014\u6587\u4EF6\u5377\u8FDB\u6765\u3002
18
+ - \u53EA\u8DD1\u4EFB\u52A1\u91CC\u5217\u51FA\u7684\u6D4B\u8BD5\u6587\u4EF6\uFF0C\u4E0D\u8981\u8DD1 broader \u6D4B\u8BD5\uFF08broaden \u6D4B\u8BD5\u7684\u5931\u8D25\u662F\u9884\u5B58\u7684\uFF0C\u548C\u4F60\u7684\u6539\u52A8\u65E0\u5173\uFF09\u3002
19
+ - **\u5EFA\u8BAE\u6C47\u62A5**\uFF1A\u4EA4\u4ED8\u65F6\u628A\u8FC7\u7A0B\u4E2D\u53D1\u73B0\u7684**\u4EFB\u4F55\u503C\u5F97\u7528\u6237\u77E5\u9053\u7684\u4E8B**\u90FD\u5217\u51FA\u6765\uFF08\u9884\u5B58\u65E0\u5173\u6539\u52A8\u3001\u65E2\u6709\u6D4B\u8BD5\u9694\u79BB\u95EE\u9898\u3001\u6F5C\u5728\u98CE\u9669\u3001\u540E\u7EED\u53EF\u4F18\u5316\u70B9\u3001\u9700\u7528\u6237\u51B3\u7B56\u7684\u4E8B\u9879\uFF09\uFF0C\u4E0D\u8981\u53EA\u62A5\u300C\u505A\u5B8C\u4E86\u300D\u3002
20
+
21
+ ## Review \u7EAA\u5F8B\uFF08commit \u524D\u786C\u95E8\uFF09
22
+ - \u9664 \u22642 \u6B65\u96F6\u903B\u8F91\u98CE\u9669\u7684\u673A\u68B0\u6539\u52A8\uFF08\u9519\u522B\u5B57/\u683C\u5F0F/CSS \u5FAE\u8C03\uFF09\u5916\uFF0C\u6240\u6709\u4EE3\u7801\u53D8\u66F4 commit \u524D\u5FC5\u987B\u5148\u6D3E**\u5176\u4ED6 agent**\uFF08\u4E0D\u540C\u6A21\u578B\u5BB6\u65CF\u4F18\u5148\uFF09review \u5DE5\u4F5C\u533A diff\uFF08\`git diff\`\uFF0C\u672A\u63D0\u4EA4\u7684\u6539\u52A8\uFF09\u3002reviewer \u4E0D\u53EF\u662F\u81EA\u5DF1\u3002\u65E0 review \u4E0D commit\u2014\u2014\u8FD9\u662F\u786C\u95E8\uFF0C\u4E0D\u662F\u5EFA\u8BAE\u3002
23
+ - \u6D3E\u53D1\u8D70 \`startAgentRun(agentKey, task, { ephemeral: true })\`\uFF08web/\u684C\u9762\u7AEF\u6CA1\u6709 nolo CLI\uFF0C\u6240\u6709 host \u90FD\u6709\u8FD9\u4E2A\u5DE5\u5177\uFF09\u3002ephemeral \u8BA9 review \u5B8C\u6210\u540E\u4E0D\u7559 dialog \u8BB0\u5F55\u3002
24
+ - task \u91CC\u5FC5\u987B\u5199\u660E\u5BA1\u67E5\u5BF9\u8C61\uFF08\`git diff\` \u770B\u5DE5\u4F5C\u533A\u6539\u52A8\uFF0C\u6216 \`git diff alpha...HEAD\` \u770B\u5DF2\u63D0\u4EA4\u6539\u52A8\uFF09\uFF0C\u5426\u5219 reviewer \u4E0D\u77E5\u9053\u5BA1\u4EC0\u4E48\u3002
25
+ - \u6309\u89D2\u8272\u52A0\u8F7D\u5BF9\u5E94 skill\uFF1Areviewer \u5148 \`loadSkill("coding-review")\` \u62FF\u901A\u7528\u6D41\u7A0B\uFF0C\u518D\u6309\u89D2\u8272 \`loadSkill("coding-review-<role>")\` \u62FF\u68C0\u67E5\u9879\u3002\u89D2\u8272\u6E05\u5355\uFF1Acode-quality\uFF08**\u5FC5\u8DD1**\uFF09/ architecture\uFF08**\u5355\u72EC\u6D3E\u53D1**\uFF0C\u4E2D\u7EA7\u4EE5\u4E0A\u95EE\u9898\uFF09/ security\uFF08\u6309\u9700 + \u5B89\u5168\u654F\u611F\u89E6\u53D1\u5FC5\u8DD1\uFF09/ frontend-ux\uFF08\u6D89\u53CA UI \u65F6\uFF09/ backend-data\uFF08\u6D89\u53CA server \u65F6\uFF09\u3002\u89D2\u8272\u5207\u5272\u7684\u76EE\u7684\u662F\u6CE8\u610F\u529B\u9694\u79BB\u2014\u2014\u6BCF\u4E2A\u89D2\u8272\u53EA\u76EF\u81EA\u5DF1\u7684\u68C0\u67E5\u9762\uFF0C\u6309\u9700\u542F\u7528\uFF0C\u907F\u514D\u4E00\u4E2A reviewer \u80CC\u6240\u6709\u89D2\u8272\u5BFC\u81F4\u6CE8\u610F\u529B\u7A00\u91CA\u3002
26
+ - Verdict \u6807\u51C6\uFF1AAPPROVE\uFF08\u65E0 CRITICAL \u6216 HIGH\uFF09\u2192 \u53EF commit\uFF1BWARNING\uFF08\u4EC5 HIGH\uFF09\u2192 \u62A5\u544A owner \u51B3\u5B9A\uFF1BBLOCK\uFF08\u6709 CRITICAL\uFF09\u2192 \u5FC5\u987B\u5148\u4FEE\u3002
27
+ - review \u53EF\u80FD\u591A\u8F6E\u6536\u655B\uFF08\u6709 finding\u2192\u4FEE\u2192\u518D\u5BA1\u2192\u76F4\u5230 APPROVE\uFF09\u3002\u6BCF\u8F6E review \u662F\u65E0\u4E0A\u4E0B\u6587\u7684\u2014\u2014reviewer \u53EA\u770B\u5F53\u524D\u5DE5\u4F5C\u533A diff\uFF0C\u4E0D\u5E26\u4E0A\u4E00\u8F6E finding \u8BB0\u5FC6\u3002
28
+ - **\u81EA\u52A8 review \u5FAA\u73AF**\uFF1A\u4EFB\u52A1\u5B8C\u6210\u540E**\u81EA\u52A8\u8FDB\u5165 review \u5FAA\u73AF**\uFF0C\u4E0D\u8981\u505C\u5728\u300C\u6539\u5B8C\u4EA4\u4ED8\u300D\u5C31\u7B49\u8C03\u7528\u65B9\u3002\u6D41\u7A0B\uFF1A\u6539\u5B8C \u2192 \u6D3E reviewer \u5BA1\u5DE5\u4F5C\u533A diff \u2192 \u82E5\u51FA finding \u5C31\u4FEE\u590D \u2192 \u590D\u5BA1 \u2192 \u76F4\u5230 APPROVE \u624D\u63D0\u4EA4\u3002\u9664\u975E\u8C03\u7528\u65B9\u660E\u786E\u8BF4\u300C\u53EA\u6539\u4E0D\u5BA1\u300D\uFF0C\u5426\u5219\u9ED8\u8BA4\u8D70\u5B8C\u6574\u5FAA\u73AF\u3002
29
+ - \u82E5\u5904\u4E8E\u5355 Agent \u72EC\u5360\u73AF\u5883\u3001\u5176\u4ED6 agent \u4E0D\u53EF\u8FBE\u3001\u6216\u7528\u6237\u660E\u786E\u8981\u6C42\u76F4\u63A5\u63D0\u4EA4\uFF0C\u5141\u8BB8\u5E26\u539F\u56E0\u8DF3\u8FC7\uFF08commit message \u6CE8\u660E [no-review: \u539F\u56E0]\uFF09\uFF0C\u4F46\u9ED8\u8BA4\u5FC5\u987B\u6D3E review\u3002`;
30
+ var buildCodeWorkDiscipline = (heading) => `# ${heading}
31
+
32
+ ${CODE_WORK_DISCIPLINE_BODY}`;
33
+
34
+ // packages/ai/tools/toolPacks.ts
35
+ var TOOL_PACKS = {
36
+ // L1 - 核心:交互 + 自我更新,所有 Agent 必有。
37
+ // rememberMemory 已移至「长期记忆」能力包(defaultEnabled:true),用户可单关。
38
+ // searchDialogMessages 已改为内置 skill(search-dialog-messages),按需
39
+ // loadSkill 加载,不再随 CORE 常驻。
40
+ // search_all_spaces 已改为内置 skill(search-all-spaces),按需 loadSkill
41
+ // 加载,不再随 CORE 常驻;全部视图(All View)运行时只给 recommended hint,
42
+ // 不自动注入工具。search_workspace 保持常驻(分类视图的「当前空间」检索)。
43
+ CORE: [
44
+ "ask_user",
45
+ "read",
46
+ "createDoc",
47
+ "updateDoc",
48
+ "search_workspace",
49
+ "updateSelf",
50
+ "queryModelUsage",
51
+ "queryUserGrowthReport",
52
+ "createAgentAutomation",
53
+ "notifyUser",
54
+ "setTodoList"
55
+ ],
56
+ // L2 - 联网搜索:与 CAPABILITY_PACKS「web-search」对齐。
57
+ // 社交读工具属于「social-reader」包,不得因 exa_search 被旁路注入。
58
+ LIGHT_WEB: ["exa_search", "fetchWebpage"],
59
+ // 本地工作区代码读写与执行。唯一真相源——「代码执行」能力包与 coding skill
60
+ // 都从这里取。以前两边各抄一份(coding 还多抄了 agent-orchestration 那 3 个),
61
+ // 改一个忘另一个就会静默不同步。
62
+ CODE: [
63
+ "readFile",
64
+ "writeFile",
65
+ "editFile",
66
+ "applyEdit",
67
+ "applyLineEdits",
68
+ "codeSearch",
69
+ "globFiles",
70
+ "searchFiles",
71
+ "listFiles",
72
+ "execShell",
73
+ "launchProcess",
74
+ "listProcesses"
75
+ ],
76
+ // 表格读写。唯一真相源——app-builder 能力包与 table object skill 都从这里取,
77
+ // 以前两边各抄一份,改一个忘另一个就会静默不同步。
78
+ TABLE: [
79
+ "createTable",
80
+ "addTableRow",
81
+ "addTableRows",
82
+ "queryTableRows",
83
+ "updateTableRow",
84
+ "deleteTableRow"
85
+ ],
86
+ // L3 - 深度浏览器:全套复杂网页交互(与「full-browser」包对齐)
87
+ FULL_BROWSER: [
88
+ "browser_openSession",
89
+ "browser_closeSession",
90
+ "browser_click",
91
+ "browser_typeText",
92
+ "browser_readContent",
93
+ "browser_selectOption",
94
+ "fetchWebpage"
95
+ ]
96
+ };
97
+ var SYSTEM_AGENT_CAPABILITY_PACKS = SYSTEM_AGENT_CAPABILITIES.map((capability) => ({ ...capability }));
98
+ var CAPABILITY_PACKS = [
99
+ ...SYSTEM_AGENT_CAPABILITY_PACKS,
100
+ {
101
+ id: "long-term-memory",
102
+ label: "\u957F\u671F\u8BB0\u5FC6",
103
+ description: "\u5BF9\u8BDD\u524D\u81EA\u52A8\u8F7D\u5165\u9AD8\u76F8\u5173\u8BB0\u5FC6\uFF0C\u5E76\u5141\u8BB8 agent \u6309\u9700\u67E5\u8BE2\u6216\u5199\u5165\u957F\u671F\u8BB0\u5FC6\u3002",
104
+ tools: ["queryMemory", "rememberMemory"],
105
+ defaultEnabled: true,
106
+ icon: "\u{1F9E0}"
107
+ },
108
+ {
109
+ id: "full-browser",
110
+ label: "\u6DF1\u5EA6\u6D4F\u89C8\u5668",
111
+ description: "\u5B8C\u6574\u6D4F\u89C8\u5668\u81EA\u52A8\u5316\uFF1A\u6253\u5F00\u9875\u9762\u3001\u70B9\u51FB\u3001\u8F93\u5165\u3001\u8BFB\u53D6\u52A8\u6001\u6E32\u67D3\u5185\u5BB9\u3002",
112
+ tools: TOOL_PACKS.FULL_BROWSER,
113
+ defaultEnabled: false,
114
+ icon: "\u{1F5A5}"
115
+ },
116
+ {
117
+ id: "social-reader",
118
+ label: "\u793E\u4EA4\u5185\u5BB9\u8BFB\u53D6",
119
+ description: "\u8BFB\u53D6 X/Twitter \u5E16\u5B50\u3001\u5C0F\u7EA2\u4E66\u7528\u6237\u753B\u50CF\u7B49\u793E\u4EA4\u5E73\u53F0\u5185\u5BB9\u3002",
120
+ tools: ["read_x_post", "read_xhs_profile"],
121
+ defaultEnabled: false,
122
+ icon: "\u{1F4E1}"
123
+ },
124
+ {
125
+ id: "code",
126
+ label: "\u4EE3\u7801\u6267\u884C",
127
+ description: "\u8BFB\u5199\u4EE3\u7801\u6587\u4EF6\u3001\u641C\u7D22\u4EE3\u7801\u5E93\u3001\u6267\u884C shell \u547D\u4EE4\u2014\u2014\u8BA9 agent \u80FD\u6539\u4EE3\u7801\u3001\u8DD1\u6D4B\u8BD5\u3002",
128
+ tools: [...TOOL_PACKS.CODE],
129
+ defaultEnabled: false,
130
+ icon: "\u{1F4BB}",
131
+ promptPatch: buildCodeWorkDiscipline("\u4EE3\u7801\u6267\u884C\u80FD\u529B\u5305 \u2014 \u64CD\u4F5C\u7EAA\u5F8B")
132
+ },
133
+ {
134
+ id: "skills",
135
+ label: "\u6280\u80FD\u52A0\u8F7D",
136
+ description: "\u6309\u540D\u52A0\u8F7D\u5DE5\u4F5C\u533A\u6280\u80FD\uFF08SKILL.md\uFF09\u5E76\u8BFB\u53D6\u6280\u80FD\u6587\u6863\u2014\u2014\u8BA9 agent \u5728\u9700\u8981\u65F6\u628A\u5BF9\u5E94\u6280\u80FD\u7684\u65B9\u6CD5\u8BBA\u3001\u547D\u4EE4\u548C\u6D41\u7A0B\u62C9\u8FDB\u4E0A\u4E0B\u6587\u518D\u6267\u884C\u3002",
137
+ tools: ["loadSkill", "readSkillDoc"],
138
+ defaultEnabled: true,
139
+ icon: "\u{1F4DA}"
140
+ },
141
+ {
142
+ id: "app-builder",
143
+ label: "\u5E94\u7528\u6784\u5EFA",
144
+ description: "\u6784\u5EFA/\u4FEE\u6539/\u53D1\u5E03 Web \u5E94\u7528\uFF1A\u8BFB\u53D6\u5E94\u7528\u6E90\u7801\u3001\u5B9A\u70B9\u4FEE\u6539\u3001\u9884\u68C0\u3001\u90E8\u7F72\uFF0C\u65E0\u9700\u7F16\u7A0B\u7ECF\u9A8C\u3002",
145
+ tools: [
146
+ "appRead",
147
+ "appFileList",
148
+ "appFileSearch",
149
+ "appFileRead",
150
+ "appFileReplace",
151
+ "appFileWrite",
152
+ "appList",
153
+ ...TOOL_PACKS.TABLE,
154
+ "openAIGptImage"
155
+ ],
156
+ defaultEnabled: false,
157
+ icon: "\u{1F5A5}",
158
+ // 部署那三件(预检 / 部署 / 删除)拆去 app-deploy,这里组合回来:
159
+ // 对外行为不变,但用户可以单独关掉发布权限而保留改代码的能力。
160
+ includes: ["app-deploy"],
161
+ promptPatch: `# \u5E94\u7528\u6784\u5EFA\u80FD\u529B\u5305 \u2014 \u64CD\u4F5C\u7EAA\u5F8B
162
+
163
+ ## \u6548\u7387\u4F18\u5148\uFF08\u7701 token\uFF09
164
+ - \u4E0D\u590D\u8FF0\u7528\u6237\u9700\u6C42\uFF0C\u4E0D\u89E3\u91CA\u4F60\u300C\u6253\u7B97\u600E\u4E48\u505A\u300D\uFF0C\u76F4\u63A5\u52A8\u624B\u3002\u6539\u5B8C\u53EA\u7528\u4E00\u4E24\u53E5\u8BDD\u8BF4\u6E05\u300C\u6539\u4E86\u4EC0\u4E48\u3001\u53BB\u54EA\u770B\u300D\u3002
165
+ - \u601D\u8003\u7B80\u77ED\uFF1A\u5B9A\u4F4D\u95EE\u9898\u5373\u53EF\uFF0C\u4E0D\u505A\u957F\u7BC7\u63A8\u6F14\u3002
166
+ - \u5C0F\u6539\u52A8\uFF08\u6539\u6587\u5B57\u3001\u989C\u8272\u3001\u95F4\u8DDD\u3001\u5706\u89D2\u3001\u5355\u4E2A\u7EC4\u4EF6\uFF09\u8D70\u6700\u77ED\u8DEF\u5F84\uFF1A\`appFileSearch\` \u6216 \`appFileRead\` \u5B9A\u4F4D \u2192 \`appFileReplace\` \u7CBE\u786E\u66FF\u6362 \u2192 \`appPreflight\` \u2192 \`appDeploy\`\u3002\u80FD\u4E00\u6B21\u547D\u4E2D\u5C31\u4E0D\u8981\u53CD\u590D\u8BFB\u6587\u4EF6\u3002
167
+ - \u5DF2\u7ECF\u77E5\u9053\u6587\u4EF6\u548C\u4F4D\u7F6E\u65F6\uFF0C\u8DF3\u8FC7\u591A\u4F59\u7684 search/read\uFF0C\u76F4\u63A5 replace\u3002
168
+ - \u7981\u6B62\u4E3A\u4E00\u4E2A\u5C0F\u6539\u52A8\u6574\u9875\u91CD\u5199\u6216\u8FDE\u5E26\u6539\u52A8\u672A\u547D\u4E2D\u7684\u90E8\u5206\u3002
169
+
170
+ ## \u5B9A\u70B9\u4FEE\u6539
171
+ - \u5982\u679C\u4E0A\u4E0B\u6587\u91CC\u5E26\u6709\u7528\u6237\u300C\u9009\u4E2D\u7684\u5143\u7D20\u300D\uFF08cssPath / HTML \u7247\u6BB5 / \u6E90\u7801\u4F4D\u7F6E\uFF09\uFF0C\u76F4\u63A5\u636E\u6B64\u5B9A\u4F4D\uFF0C\u4E0D\u8981\u518D\u5168\u5C40\u641C\u7D22\u3002
172
+ - \u4FEE\u6539\u6536\u655B\u5728\u547D\u4E2D\u7684\u5143\u7D20\u53CA\u5176\u6837\u5F0F\u6765\u6E90\uFF08\u7EC4\u4EF6 / \u7C7B / design token\uFF09\u3002
173
+
174
+ ## \u6301\u7EED\u8FED\u4EE3\u6D41\u7A0B
175
+ - \u7528\u6237\u8981\u6539\u529F\u80FD\u6216\u6837\u5F0F\u65F6\uFF0C\u5148\u7528 appList \u627E\u5230\u76EE\u6807\u5E94\u7528\uFF0C\u518D\u7528 appRead \u5224\u65AD\u5F53\u524D\u662F\u6E90\u7801\u5DE5\u4F5C\u533A\u8FD8\u662F\u90E8\u7F72\u4EA7\u7269\uFF1B\u4E00\u65E6\u62FF\u5230 appId\uFF0C\u540E\u7EED\u90FD\u5FC5\u987B\u590D\u7528\u540C\u4E00\u4E2A appId\u3002
176
+ - \u6539\u5B8C\u8D70\u300C\u5E94\u7528\u53D1\u5E03\u300D\u80FD\u529B\u5305\u7684\u9884\u68C0\u90E8\u7F72\u6D41\u7A0B\uFF08appPreflight \u2192 appDeploy\uFF09\u3002\u82E5\u8BE5\u80FD\u529B\u5305\u672A\u542F\u7528\uFF0C\u8BF4\u660E\u672C agent \u53EA\u6709\u6539\u4EE3\u7801\u6743\u9650\u6CA1\u6709\u53D1\u5E03\u6743\u9650\uFF0C\u5982\u5B9E\u544A\u77E5\u7528\u6237\u3002
177
+
178
+ ## Nolo React SSR \u7EF4\u62A4\u7EAA\u5F8B\uFF08\u5F53\u524D\u9ED8\u8BA4\u8DEF\u5F84\uFF09
179
+ - \u65B0\u5EFA\u548C\u7EF4\u62A4\u7684\u5E94\u7528\u4F18\u5148\u8D70 Nolo React SSR\uFF08framework: "nolo-react", renderMode: "ssr"\uFF09\u3002
180
+ - \u5F53 appRead \u8FD4\u56DE workspaceRef / sourceFiles / sourceOmitted \u65F6\uFF0C\u4E0D\u8981\u6574\u7AD9\u91CD\u5199\uFF1B\u4F7F\u7528\u53D7\u9650 workspace \u6587\u4EF6\u5DE5\u5177\uFF1AappFileList / appFileSearch / appFileRead / appFileReplace / appFileWrite\u3002
181
+ - \u5C0F\u6539\u52A8\u5FC5\u987B\u4F18\u5148 appFileReplace\uFF1B\u53EA\u6709\u65B0\u5EFA\u6587\u4EF6\u6216\u786E\u5B9E\u9700\u8981\u6574\u6587\u4EF6\u91CD\u5199\u65F6\u624D appFileWrite\u3002
182
+ - \u4E0D\u8981\u9759\u9ED8\u628A nolo-react \u5E94\u7528\u9000\u56DE react-spa \u6216\u5355\u6587\u4EF6 Worker\u3002
183
+ - \u89C6\u89C9\u5FAE\u8C03\u4F18\u5148\u6539 theme / tokens / design system\uFF1B\u65E7\u5199\u6CD5\u5E94\u7528\u53EF\u5148\u505A\u6700\u5C0F token \u8FC1\u79FB\uFF0C\u518D\u6539\u89C6\u89C9\u53C2\u6570\u3002
184
+
185
+ ## \u8868\u5355 / \u6570\u636E\u6536\u96C6
186
+ - \u7559\u8A00\u3001\u8054\u7CFB\u8868\u5355\u3001\u9884\u7EA6\u3001\u8BA2\u9605\u3001\u53CD\u9988\u6536\u96C6\u4F18\u5148\u7528\u8868\u5DE5\u5177\uFF0C\u4E0D\u8981\u81EA\u5DF1\u53D1\u660E JSON \u6587\u4EF6\u5B58\u50A8\u3002
187
+ - \u516C\u5F00\u7F51\u9875\u8868\u5355\u5148 createTable\uFF0C\u5E76\u914D\u7F6E publicIntake\uFF08enabled\u3001slug\u3001allowedFields\u3001requiredFields\u3001\u53EF\u9009 honeypotField\uFF09\u3002
188
+ - \u516C\u5F00\u8BBF\u5BA2\u63D0\u4EA4\u53EA\u80FD\u8C03\u7528 /api/table/public-submit\uFF1B\u4E0D\u8981\u628A tenantId\u3001tableId\u3001token \u5199\u8FDB\u516C\u5F00\u5E94\u7528\u4EE3\u7801\u3002
189
+
190
+ ## \u9879\u76EE\u7D20\u6750
191
+ - \u9996\u9875\u63D2\u753B\u3001\u5C01\u9762\u3001\u6A2A\u5E45\u3001\u6309\u94AE\u56FE\u6807\u7B49\u89C6\u89C9\u7D20\u6750\uFF0C\u4F18\u5148 openAIGptImage\uFF0C\u518D\u63A5\u5165\u5E94\u7528\u3002
192
+
193
+ ## \u901A\u9053\u5F02\u5E38\u6B62\u635F
194
+ - \u5982\u679C\u5DE5\u5177\u8FD4\u56DE HTML / \u975E JSON / transport failure / retryable=false\uFF0C\u505C\u6B62\u81EA\u52A8\u91CD\u8BD5\uFF0C\u8BF4\u660E\u662F\u5E73\u53F0\u901A\u9053\u5F02\u5E38\u3002
195
+
196
+ ## \u7F3A\u5C11\u6E90\u7801\u8981\u8BF4\u660E\u98CE\u9669
197
+ - \u5982\u679C appRead \u8BFB\u51FA\u6765\u7684\u662F HTML \u58F3\u3001importmap\u3001\u538B\u7F29 bundle\uFF0C\u5FC5\u987B\u5148\u544A\u77E5\u7528\u6237\u5F53\u524D\u66F4\u50CF\u90E8\u7F72\u4EA7\u7269\u800C\u4E0D\u662F\u53EF\u7EF4\u62A4\u6E90\u7801\uFF0C\u5F97\u5230\u786E\u8BA4\u540E\u518D\u7EE7\u7EED\u5927\u6539\u3002
198
+ `
199
+ },
200
+ {
201
+ id: "app-deploy",
202
+ label: "\u5E94\u7528\u53D1\u5E03",
203
+ description: "\u9884\u68C0\u5E76\u53D1\u5E03\u5E94\u7528\u5230\u7EBF\u4E0A\uFF0C\u4EE5\u53CA\u5220\u9664\u5DF2\u53D1\u5E03\u7684\u5E94\u7528\u3002\u4E0E\u300C\u5E94\u7528\u6784\u5EFA\u300D\u5206\u5F00\uFF0C\u53EF\u4EE5\u53EA\u7ED9\u6539\u4EE3\u7801\u7684\u80FD\u529B\u800C\u4E0D\u7ED9\u53D1\u5E03\u6743\u9650\u3002",
204
+ tools: ["appPreflight", "appDeploy", "appDelete"],
205
+ defaultEnabled: false,
206
+ icon: "\u{1F680}",
207
+ promptPatch: `# \u5E94\u7528\u53D1\u5E03\u80FD\u529B\u5305 \u2014 \u64CD\u4F5C\u7EAA\u5F8B
208
+
209
+ ## \u9884\u68C0\u4E0E\u90E8\u7F72
210
+ - \u6BCF\u6B21\u4FEE\u6539\u540E\uFF1AappPreflight \u2192 appDeploy\uFF1BappDeploy \u5FC5\u987B\u7EE7\u7EED\u4F20\u540C\u4E00\u4E2A appId\u3002
211
+ - \u6536\u5230 repairPlan \u5C31\u76F4\u63A5\u4FEE\uFF1A\u6309\u8FD4\u56DE issues \u5B9A\u70B9\u4FEE\u590D\u5E76\u91CD\u65B0\u9884\u68C0\uFF0C\u4E0D\u8981\u6574\u7AD9\u91CD\u5199\uFF0C\u4E5F\u4E0D\u8981\u5148\u95EE\u7528\u6237\u8981\u4E0D\u8981\u4FEE\u3002
212
+ - \u672A\u7ECF\u7528\u6237\u786E\u8BA4\u4E0D\u8981 appDelete\u3002
213
+
214
+ ## \u90E8\u7F72\u5E94\u7B54\u6A21\u677F
215
+ \u90E8\u7F72\u6210\u529F\u540E\uFF1A
216
+ "\u2705 \u4F60\u7684\u5E94\u7528\u5DF2\u7ECF\u597D\u4E86\uFF01
217
+
218
+ \u{1F517} \u8BBF\u95EE\u94FE\u63A5\uFF1A[URL]
219
+
220
+ \u8FD9\u4E2A\u5E94\u7528\u53EF\u4EE5\u5E2E\u4F60 [\u4E00\u53E5\u8BDD\u529F\u80FD\u63CF\u8FF0]\u3002\u60F3\u8981\u4FEE\u6539\u6216\u6DFB\u52A0\u529F\u80FD\uFF0C\u76F4\u63A5\u544A\u8BC9\u6211\u5C31\u884C\uFF01"`
221
+ },
222
+ {
223
+ id: "video-transcription",
224
+ label: "\u89C6\u9891\u8F6C\u5199",
225
+ description: "\u8D34\u89C6\u9891\u94FE\u63A5\u5373\u53EF\u8F6C\u5199\u4E3A\u5E26\u6807\u70B9\u6587\u672C\u4E0E SRT\u3002\u652F\u6301 B \u7AD9\u5206 P\uFF08\u9ED8\u8BA4\u5168\u90E8\u5904\u7406\uFF09\u3001YouTube \u7B49\uFF1B\u6296\u97F3\u8BF7\u5728\u684C\u9762\u7AEF\u6D4F\u89C8\u5668\u4F7F\u7528\u3002",
226
+ tools: ["transcribeVideo"],
227
+ defaultEnabled: false,
228
+ icon: "\u{1F3AC}",
229
+ promptPatch: `# \u89C6\u9891\u8F6C\u5199\u80FD\u529B\u5305
230
+
231
+ ## \u7528\u6CD5
232
+ - \u7528\u6237\u8D34\u4E0A\u89C6\u9891\u94FE\u63A5\u65F6\uFF0C\u76F4\u63A5\u8C03\u7528 \`transcribeVideo({ url })\`\uFF0C\u4E0D\u8981\u5148\u95EE\u8981\u4E0D\u8981\u8F6C\u5199\u3002
233
+ - B \u7AD9\u5206 P / \u5408\u96C6\uFF1A\u7F3A\u7701\u5904\u7406\u5168\u90E8\uFF1B\u82E5\u7528\u6237\u6307\u5B9A\u300C\u53EA\u8981\u7B2C 3\u30014 \u96C6\u300D\u5219\u4F20 \`p: [3, 4]\`\u3002
234
+ - \u8FD4\u56DE\u91CC\u7684 \`processedParts\` / \`availableParts\` \u5FC5\u987B\u5411\u7528\u6237\u8BF4\u6E05\u695A\uFF0C\u907F\u514D\u9759\u9ED8\u4E22\u5206 P\u3002
235
+ - \u6296\u97F3\u82E5\u62A5\u300C\u8BE5\u5E73\u53F0\u9700\u8981\u767B\u5F55\u6001\uFF0C\u8BF7\u5728\u684C\u9762\u7AEF\u6D4F\u89C8\u5668\u4E2D\u4F7F\u7528\u300D\uFF0C\u63D0\u793A\u7528\u6237\u6539\u8D70\u684C\u9762\u7AEF\u6D4F\u89C8\u80FD\u529B\uFF0C\u4E0D\u8981\u5C1D\u8BD5\u4F20 cookie\u3002
236
+ `
237
+ }
238
+ ];
239
+ var CAPABILITY_PACK_BY_ID = CAPABILITY_PACKS.reduce(
240
+ (acc, pack) => {
241
+ acc[pack.id] = pack;
242
+ return acc;
243
+ },
244
+ {}
245
+ );
246
+ var PACK_MANAGED_TOOLS = new Set(
247
+ CAPABILITY_PACKS.flatMap((pack) => pack.tools)
248
+ );
249
+ var DEFAULT_ENABLED_PACKS = CAPABILITY_PACKS.filter(
250
+ (pack) => pack.defaultEnabled
251
+ ).map((pack) => pack.id);
252
+ var ALWAYS_ON_PACK_IDS = [
253
+ "long-term-memory",
254
+ "skills"
255
+ ];
256
+ function resolveEffectiveEnabledPacks(args) {
257
+ const base = args.enabledPacks ?? [];
258
+ if (args.declaredOnly === true) return [...base];
259
+ return [
260
+ .../* @__PURE__ */ new Set([
261
+ ...base,
262
+ ...base.length === 0 ? args.emptyFallbackPacks ?? [] : [],
263
+ ...args.hostPacks ?? [],
264
+ ...ALWAYS_ON_PACK_IDS
265
+ ])
266
+ ];
267
+ }
268
+ var SYSTEM_BUILTIN_SKILL_PACK_IDS = SYSTEM_AGENT_CAPABILITY_IDS;
269
+ var DEFAULT_MOUNT_SYSTEM_CAPABILITY_IDS = ["agent-orchestration"];
270
+ function getDefaultSystemCapabilityTools() {
271
+ const ids = DEFAULT_MOUNT_SYSTEM_CAPABILITY_IDS;
272
+ return SYSTEM_AGENT_CAPABILITY_PACKS.filter((pack) => ids.includes(pack.id)).flatMap((pack) => [...pack.tools]);
273
+ }
274
+ function addDefaultSystemCapabilityTools(toolNames) {
275
+ return [.../* @__PURE__ */ new Set([...toolNames, ...getDefaultSystemCapabilityTools()])];
276
+ }
277
+ function applySystemBuiltinSkillFilter(toolNames, systemBuiltinSkills) {
278
+ if (!systemBuiltinSkills) return toolNames;
279
+ const disabledToolSet = /* @__PURE__ */ new Set();
280
+ for (const packId of SYSTEM_BUILTIN_SKILL_PACK_IDS) {
281
+ const enabled = systemBuiltinSkills[packId];
282
+ if (enabled === false) {
283
+ const pack = CAPABILITY_PACK_BY_ID[packId];
284
+ if (pack) pack.tools.forEach((t) => disabledToolSet.add(t));
285
+ }
286
+ }
287
+ if (disabledToolSet.size === 0) return toolNames;
288
+ return toolNames.filter((t) => !disabledToolSet.has(t));
289
+ }
290
+ function collectPackIdsWithIncludes(enabledPacks) {
291
+ const out = [];
292
+ const seen = /* @__PURE__ */ new Set();
293
+ const visit = (id) => {
294
+ if (seen.has(id)) return;
295
+ seen.add(id);
296
+ out.push(id);
297
+ for (const child of CAPABILITY_PACK_BY_ID[id]?.includes ?? []) visit(child);
298
+ };
299
+ for (const id of enabledPacks ?? []) visit(id);
300
+ return out;
301
+ }
302
+ function expandEnabledPacks(enabledPacks, explicitTools = []) {
303
+ const packTools = collectPackIdsWithIncludes(enabledPacks).map((id) => CAPABILITY_PACK_BY_ID[id]?.tools ?? []).flat();
304
+ return [.../* @__PURE__ */ new Set([...packTools, ...explicitTools ?? []])];
305
+ }
306
+ function expandEnabledPackPromptPatches(enabledPacks) {
307
+ return collectPackIdsWithIncludes(enabledPacks).map((id) => CAPABILITY_PACK_BY_ID[id]?.promptPatch).filter((patch) => typeof patch === "string" && patch.length > 0);
308
+ }
309
+ function appendEnabledPackPromptPatches(prompt, enabledPacks) {
310
+ const patches = expandEnabledPackPromptPatches(enabledPacks);
311
+ if (patches.length === 0) return prompt ?? void 0;
312
+ const base = typeof prompt === "string" ? prompt.trim() : "";
313
+ const addition = patches.join("\n\n");
314
+ if (!base) return addition;
315
+ if (base.includes(addition)) return base;
316
+ return `${base}
317
+
318
+ ${addition}`;
319
+ }
320
+ var FORCED_TOOLS = ["ask_user"];
321
+ function applyDisabledTools(toolNames, disabledTools) {
322
+ if (!Array.isArray(disabledTools) || disabledTools.length === 0) {
323
+ return toolNames;
324
+ }
325
+ const disabled = new Set(disabledTools);
326
+ const forced = new Set(FORCED_TOOLS);
327
+ return toolNames.filter((name) => !disabled.has(name) || forced.has(name));
328
+ }
329
+ var WEB_SEARCH_TOOL_NAMES = /* @__PURE__ */ new Set([
330
+ "fetchWebpage",
331
+ "exa_search",
332
+ "firecrawl_scrape",
333
+ "firecrawl_search"
334
+ ]);
335
+ function isWebSearchTool(name) {
336
+ return WEB_SEARCH_TOOL_NAMES.has(name);
337
+ }
338
+ function isBrowserTool(name) {
339
+ return name.startsWith("browser_");
340
+ }
341
+ function addDefaultLightWebToolsForConfiguredAgents(toolNames, agentConfig) {
342
+ const explicitToolNames = Array.isArray(
343
+ agentConfig?.toolSurface?.explicitToolNames
344
+ ) ? agentConfig.toolSurface.explicitToolNames : agentConfig?.toolNames;
345
+ if (!Array.isArray(explicitToolNames) || explicitToolNames.length === 0)
346
+ return toolNames;
347
+ const webSearch = explicitToolNames.some(isWebSearchTool);
348
+ if (!webSearch) return toolNames;
349
+ return [.../* @__PURE__ */ new Set([...toolNames, ...TOOL_PACKS.LIGHT_WEB])];
350
+ }
351
+ function applyDefaultWebToolPacks(args) {
352
+ const enhanced = new Set(args.toolNames);
353
+ if (!args.skipWeb && args.toolNames.some(isWebSearchTool)) {
354
+ TOOL_PACKS.LIGHT_WEB.forEach((t) => enhanced.add(t));
355
+ }
356
+ if (args.toolNames.some(isBrowserTool)) {
357
+ TOOL_PACKS.FULL_BROWSER.forEach((t) => enhanced.add(t));
358
+ }
359
+ return [...enhanced];
360
+ }
361
+
362
+ export {
363
+ buildCodeWorkDiscipline,
364
+ TOOL_PACKS,
365
+ CAPABILITY_PACKS,
366
+ resolveEffectiveEnabledPacks,
367
+ addDefaultSystemCapabilityTools,
368
+ applySystemBuiltinSkillFilter,
369
+ expandEnabledPacks,
370
+ expandEnabledPackPromptPatches,
371
+ appendEnabledPackPromptPatches,
372
+ FORCED_TOOLS,
373
+ applyDisabledTools,
374
+ addDefaultLightWebToolsForConfiguredAgents,
375
+ applyDefaultWebToolPacks
376
+ };
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  MODEL_LOOKUP_MAP
3
- } from "./chunk-UAIVG4J6.js";
4
- import {
5
- addContentAction
6
- } from "./chunk-ELT65PZW.js";
3
+ } from "./chunk-CHSCAUZN.js";
7
4
  import {
8
5
  ALL_MODELS
9
- } from "./chunk-LLWKHDG4.js";
6
+ } from "./chunk-4ULSC37S.js";
7
+ import {
8
+ addContentAction
9
+ } from "./chunk-OXLLFZNF.js";
10
10
  import {
11
11
  upload
12
- } from "./chunk-XRZJGPFI.js";
12
+ } from "./chunk-FON47ACC.js";
13
13
  import {
14
14
  PUBLIC_DEEPSEEK_V4_FLASH_AGENT_KEY,
15
15
  PUBLIC_KIMI_K26_IMAGE_AGENT_KEY
16
- } from "./chunk-3ND52WIL.js";
16
+ } from "./chunk-ATWUOTJP.js";
17
17
  import {
18
18
  getRuntimeServerContext
19
19
  } from "./chunk-XMLRJUU5.js";
@@ -4,7 +4,6 @@ import {
4
4
  PLATFORM_HOSTED_KIMI_K26_MODEL,
5
5
  PLATFORM_HOSTED_KIMI_PROVIDER,
6
6
  cloudflareModels,
7
- deepSeekModels,
8
7
  deepinfraModels,
9
8
  fireworksModels,
10
9
  getCloudflareWorkersAiChatCompletionsUrl,
@@ -15,7 +14,7 @@ import {
15
14
  platformHostedModels,
16
15
  xaiModels,
17
16
  zaiModels
18
- } from "./chunk-MKA6QE5E.js";
17
+ } from "./chunk-2IPEVBUO.js";
19
18
  import {
20
19
  __export
21
20
  } from "./chunk-4VNS5WPM.js";
@@ -4708,7 +4707,6 @@ var moonshotAllModels = [...moonshotModels, ...kimiCodeModels];
4708
4707
  var qwenAllModels = [...qwenModels, ...qwenTokenPlanModels];
4709
4708
  var MODEL_MAP = {
4710
4709
  // anthropic: anthropicModels,
4711
- deepseek: deepSeekModels,
4712
4710
  google: googleModels,
4713
4711
  openai: openAIModels,
4714
4712
  deepinfra: deepinfraModels,
@@ -4815,11 +4813,6 @@ var API_ENDPOINTS = {
4815
4813
  xai: {
4816
4814
  default: "https://api.x.ai/v1/chat/completions"
4817
4815
  },
4818
- deepseek: {
4819
- // No `responses` entry: the official DeepSeek provider was retired and no
4820
- // deepseek model declares endpointKey "responses", so it was unreachable.
4821
- default: "https://api.deepseek.com/chat/completions"
4822
- },
4823
4816
  deepinfra: {
4824
4817
  default: "https://api.deepinfra.com/v1/openai/chat/completions"
4825
4818
  },
@@ -34,7 +34,9 @@ function shouldStripReasoningContentForOutbound(provider, model) {
34
34
  const p = provider?.trim().toLowerCase();
35
35
  const m = model?.trim().toLowerCase();
36
36
  if (!p || !m) return false;
37
- if (p === "deepseek" || p === "nolo") return m === "deepseek-v4-flash";
37
+ if (p === "deepseek" || p === "nolo") {
38
+ return m === "deepseek-v4-flash" || m === "deepseek-v4-pro";
39
+ }
38
40
  return false;
39
41
  }
40
42
 
@@ -94,17 +96,20 @@ var normalizeToolOutput = (content) => {
94
96
  };
95
97
  var toResponsesTools = (tools) => {
96
98
  if (!Array.isArray(tools) || tools.length === 0) return void 0;
97
- return tools.map((tool) => {
99
+ const normalized = tools.map((tool) => {
98
100
  const fn = tool?.function;
99
- if (!fn?.name) return null;
101
+ const name = fn?.name ?? tool?.name;
102
+ if (!name) return null;
103
+ const parameters = fn?.parameters ?? tool?.parameters;
100
104
  return {
101
105
  type: "function",
102
- name: fn.name,
103
- description: fn.description,
104
- parameters: sanitizeResponsesParameters(fn.parameters),
105
- strict: fn.strict
106
+ name,
107
+ ...typeof (fn?.description ?? tool?.description) === "string" ? { description: fn?.description ?? tool?.description } : {},
108
+ parameters: sanitizeResponsesParameters(parameters),
109
+ ...fn?.strict !== void 0 || tool?.strict !== void 0 ? { strict: fn?.strict ?? tool?.strict } : {}
106
110
  };
107
111
  }).filter(Boolean);
112
+ return normalized.length > 0 ? normalized : void 0;
108
113
  };
109
114
  var convertMessagesToResponsesInput = (messages, options) => {
110
115
  const input = [];
@@ -121,7 +126,12 @@ var convertMessagesToResponsesInput = (messages, options) => {
121
126
  }
122
127
  const role = message.role;
123
128
  if (role === "assistant" && !options?.stripReasoningContent && typeof message.reasoning_content === "string" && message.reasoning_content) {
124
- input.push({ type: "reasoning", content: message.reasoning_content });
129
+ input.push({
130
+ type: "reasoning",
131
+ content: [
132
+ { type: "reasoning_text", text: message.reasoning_content }
133
+ ]
134
+ });
125
135
  }
126
136
  const contentParts = normalizeMessageParts(message.content, role);
127
137
  if (contentParts.length > 0) {
@@ -28,7 +28,8 @@ function canonicalizeNoloServerUrl(value) {
28
28
  // packages/cli/client/profileConfig.ts
29
29
  var normalizeProfileServerUrl = canonicalizeNoloServerUrl;
30
30
  function getDefaultProfileConfigPath() {
31
- return join(homedir(), ".nolo", "config.json");
31
+ const noloHome = process.env.NOLO_HOME?.trim();
32
+ return noloHome ? join(noloHome, "config.json") : join(homedir(), ".nolo", "config.json");
32
33
  }
33
34
  function loadProfileConfig(path = getDefaultProfileConfigPath()) {
34
35
  if (!existsSync(path)) return null;
@@ -89,8 +90,8 @@ function buildCliRuntimeEnv(processEnv, config) {
89
90
  const explicitAuthToken = processEnv.AUTH_TOKEN || processEnv.AUTH;
90
91
  const explicitServerUrl = processEnv.NOLO_SERVER || processEnv.NOLO_SERVER_URL || processEnv.BASE_URL;
91
92
  return {
92
- ...processEnv,
93
93
  ...profileEnv,
94
+ ...processEnv,
94
95
  ...explicitAuthToken ? { AUTH_TOKEN: explicitAuthToken } : {},
95
96
  ...explicitServerUrl ? {
96
97
  NOLO_SERVER: explicitServerUrl,
@@ -1,6 +1,10 @@
1
1
  import {
2
2
  getModelConfig
3
- } from "./chunk-UAIVG4J6.js";
3
+ } from "./chunk-CHSCAUZN.js";
4
+ import {
5
+ isPlatformHostedClaudeModel,
6
+ isPlatformHostedGrokModel
7
+ } from "./chunk-2IPEVBUO.js";
4
8
  import {
5
9
  asTrimmedLowercaseString
6
10
  } from "./chunk-QSJ3HFEF.js";
@@ -28,11 +32,10 @@ function pickAgentRuntimeInferenceOptions(agentConfig) {
28
32
 
29
33
  // packages/agent-runtime/platformProviderEndpoints.ts
30
34
  var OPENAI_RESPONSES_ENDPOINT = "https://api.openai.com/v1/responses";
35
+ var DEEPSEEK_RESPONSES_ENDPOINT = "https://api.deepseek.com/responses";
36
+ var XAI_CHAT_COMPLETIONS_ENDPOINT = "https://api.x.ai/v1/chat/completions";
31
37
  var PLATFORM_CHAT_COMPLETIONS_ENDPOINTS = {
32
38
  deepinfra: "https://api.deepinfra.com/v1/openai/chat/completions",
33
- // DeepSeek official API endpoint removed — all DeepSeek models now route
34
- // through the nolo provider (Ollama Cloud). See providerRegistry.ts.
35
- // deepseek: "https://api.deepseek.com/chat/completions",
36
39
  fireworks: "https://api.fireworks.ai/inference/v1/chat/completions",
37
40
  google: "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions",
38
41
  openai: "https://api.openai.com/v1/chat/completions",
@@ -41,12 +44,16 @@ var PLATFORM_CHAT_COMPLETIONS_ENDPOINTS = {
41
44
  qwen: "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions",
42
45
  // Moonshot AI(月之暗面)开放平台 OpenAI 兼容模式(按量计费)
43
46
  moonshot: "https://api.moonshot.cn/v1/chat/completions",
44
- // Open-source default: nolo provider 中转 ollama cloud。
45
- // 内部多后端组合路由不开源,由内部 provider 路由层接管。
47
+ // Non-DeepSeek hosted models use Ollama Cloud. DeepSeek Flash is routed
48
+ // separately to the official DeepSeek Responses endpoint.
46
49
  nolo: "https://ollama.com/v1/chat/completions"
47
50
  };
48
51
  function isOpenAiResponsesModel(args) {
49
52
  const provider = asTrimmedLowercaseString(args.provider);
53
+ if (provider === "nolo" || provider === "deepseek") {
54
+ const model = args.model?.trim().toLowerCase();
55
+ return model === "deepseek-v4-flash" || model === "deepseek-v4-pro";
56
+ }
50
57
  if (provider !== "openai") return false;
51
58
  if (args.endpointKey === "responses") return true;
52
59
  if (!args.model) return false;
@@ -57,16 +64,27 @@ function isOpenAiResponsesModel(args) {
57
64
  }
58
65
  }
59
66
  function resolvePlatformResponsesEndpoint(provider) {
60
- return asTrimmedLowercaseString(provider) === "openai" ? OPENAI_RESPONSES_ENDPOINT : void 0;
67
+ const normalized = asTrimmedLowercaseString(provider);
68
+ if (normalized === "openai") return OPENAI_RESPONSES_ENDPOINT;
69
+ if (normalized === "nolo" || normalized === "deepseek") {
70
+ return DEEPSEEK_RESPONSES_ENDPOINT;
71
+ }
72
+ return void 0;
61
73
  }
62
74
  var PLATFORM_PROVIDER_ENDPOINT_ALIASES = {
63
75
  "ollama-cloud": "nolo",
64
76
  deepseek: "nolo"
65
77
  };
66
- function resolvePlatformChatCompletionsEndpoint(provider) {
78
+ function resolvePlatformChatCompletionsEndpoint(provider, model) {
67
79
  const key = asTrimmedLowercaseString(provider);
68
80
  if (!key) return void 0;
69
81
  const aliased = PLATFORM_PROVIDER_ENDPOINT_ALIASES[key] ?? key;
82
+ if (aliased === "nolo" && isPlatformHostedClaudeModel(model)) {
83
+ return PLATFORM_CHAT_COMPLETIONS_ENDPOINTS.deepinfra;
84
+ }
85
+ if (aliased === "nolo" && isPlatformHostedGrokModel(model)) {
86
+ return XAI_CHAT_COMPLETIONS_ENDPOINT;
87
+ }
70
88
  return PLATFORM_CHAT_COMPLETIONS_ENDPOINTS[aliased];
71
89
  }
72
90
 
@@ -87,7 +105,10 @@ function resolvePlatformProviderEndpoint(agentConfig) {
87
105
  })) {
88
106
  return resolvePlatformResponsesEndpoint(provider) ?? "";
89
107
  }
90
- const endpoint = resolvePlatformChatCompletionsEndpoint(provider);
108
+ const endpoint = resolvePlatformChatCompletionsEndpoint(
109
+ provider,
110
+ agentConfig.model
111
+ );
91
112
  if (!endpoint) {
92
113
  throw new Error(`Platform chat provider does not support provider "${provider}".`);
93
114
  }
@@ -228,7 +249,11 @@ async function buildProviderExecutionPlan(args) {
228
249
  }
229
250
  }
230
251
  if (!apiKey2 && agentConfig.credentialSynced && args.syncFetcher && credentialRef2) {
231
- const synced = await args.syncFetcher(credentialRef2);
252
+ let synced = null;
253
+ try {
254
+ synced = await args.syncFetcher(credentialRef2);
255
+ } catch {
256
+ }
232
257
  const trimmed = asTrimmedString(synced);
233
258
  if (trimmed) {
234
259
  try {
@@ -295,9 +320,10 @@ async function buildProviderExecutionPlan(args) {
295
320
  serverUrl: resolvePlatformServerUrl(env),
296
321
  authToken: resolvePlatformAuthToken(env),
297
322
  agentKey: agentConfig.key,
298
- ...agentConfig.apiSource ? { apiSource: agentConfig.apiSource } : {},
299
- ...agentConfig.apiKey?.trim() ? { apiKey: agentConfig.apiKey.trim() } : {},
300
- ...agentConfig.apiKeyHeader?.trim() ? { apiKeyHeader: agentConfig.apiKeyHeader.trim() } : {}
323
+ ...agentConfig.apiSource ? { apiSource: agentConfig.apiSource } : {}
324
+ // Platform agents use the server-managed provider credential. Never
325
+ // forward a raw credential from a stale/local agent record through the
326
+ // platform proxy; credentials are resolved by the platform server.
301
327
  };
302
328
  }
303
329
  let apiKey = "";
@@ -309,7 +335,11 @@ async function buildProviderExecutionPlan(args) {
309
335
  }
310
336
  }
311
337
  if (!apiKey && agentConfig.credentialSynced && args.syncFetcher && credentialRef) {
312
- const synced = await args.syncFetcher(credentialRef);
338
+ let synced = null;
339
+ try {
340
+ synced = await args.syncFetcher(credentialRef);
341
+ } catch {
342
+ }
313
343
  const trimmed = asTrimmedString(synced);
314
344
  if (trimmed) {
315
345
  try {