w-dispatch-ai 1.0.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 (73) hide show
  1. package/.editorconfig +9 -0
  2. package/.eslintignore +3 -0
  3. package/.eslintrc.js +55 -0
  4. package/.jsdoc +25 -0
  5. package/LICENSE +21 -0
  6. package/README.md +207 -0
  7. package/SECURITY.md +5 -0
  8. package/babel.config.js +16 -0
  9. package/dist/w-dispatch-ai.umd.js +7 -0
  10. package/dist/w-dispatch-ai.umd.js.map +1 -0
  11. package/docs/WDispatchAi.mjs.html +110 -0
  12. package/docs/adapters.mjs.html +100 -0
  13. package/docs/dispatchAi.mjs.html +133 -0
  14. package/docs/dispatchClaude.mjs.html +190 -0
  15. package/docs/dispatchCodex.mjs.html +191 -0
  16. package/docs/dispatchOpencode.mjs.html +260 -0
  17. package/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  18. package/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  19. package/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  20. package/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  21. package/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  22. package/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  23. package/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  24. package/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  25. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  26. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
  27. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  28. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  29. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  30. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  31. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
  32. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  33. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  34. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  35. package/docs/getCliArgs.mjs.html +126 -0
  36. package/docs/getErrorResult.mjs.html +115 -0
  37. package/docs/global.html +2924 -0
  38. package/docs/index.html +84 -0
  39. package/docs/scripts/collapse.js +39 -0
  40. package/docs/scripts/commonNav.js +28 -0
  41. package/docs/scripts/linenumber.js +25 -0
  42. package/docs/scripts/nav.js +12 -0
  43. package/docs/scripts/polyfill.js +4 -0
  44. package/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  45. package/docs/scripts/prettify/lang-css.js +2 -0
  46. package/docs/scripts/prettify/prettify.js +28 -0
  47. package/docs/scripts/search.js +99 -0
  48. package/docs/styles/jsdoc.css +776 -0
  49. package/docs/styles/prettify.css +80 -0
  50. package/g.mjs +94 -0
  51. package/package.json +38 -0
  52. package/script.txt +17 -0
  53. package/src/WDispatchAi.mjs +38 -0
  54. package/src/adapters.mjs +28 -0
  55. package/src/dispatchAi.mjs +61 -0
  56. package/src/dispatchClaude.mjs +118 -0
  57. package/src/dispatchCodex.mjs +119 -0
  58. package/src/dispatchOpencode.mjs +188 -0
  59. package/src/getCliArgs.mjs +54 -0
  60. package/src/getErrorResult.mjs +43 -0
  61. package/test/tools/fakeCliForTest.mjs +139 -0
  62. package/test/unit-WDispatchAi.test.mjs +79 -0
  63. package/test/unit-adapters.test.mjs +34 -0
  64. package/test/unit-dispatchAi.test.mjs +104 -0
  65. package/test/unit-dispatchClaude.test.mjs +144 -0
  66. package/test/unit-dispatchCodex.test.mjs +113 -0
  67. package/test/unit-dispatchOpencode.test.mjs +176 -0
  68. package/test/unit-getCliArgs.test.mjs +55 -0
  69. package/test/unit-getErrorResult.test.mjs +45 -0
  70. package/toolg/addVersion.mjs +4 -0
  71. package/toolg/cleanFolder.mjs +5 -0
  72. package/toolg/gDistRollup.mjs +24 -0
  73. package/toolg/modifyReadme.mjs +4 -0
@@ -0,0 +1,110 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+
5
+ <meta charset="utf-8">
6
+ <title>WDispatchAi.mjs - Documentation</title>
7
+
8
+
9
+ <script src="scripts/prettify/prettify.js"></script>
10
+ <script src="scripts/prettify/lang-css.js"></script>
11
+ <!--[if lt IE 9]>
12
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
13
+ <![endif]-->
14
+ <link type="text/css" rel="stylesheet" href="styles/prettify.css">
15
+ <link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
16
+ <script src="scripts/nav.js" defer></script>
17
+
18
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
19
+ </head>
20
+ <body>
21
+
22
+ <input type="checkbox" id="nav-trigger" class="nav-trigger" />
23
+ <label for="nav-trigger" class="navicon-button x">
24
+ <div class="navicon"></div>
25
+ </label>
26
+
27
+ <label for="nav-trigger" class="overlay"></label>
28
+
29
+ <nav >
30
+
31
+
32
+ <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#WDispatchAi">WDispatchAi</a></li><li><a href="global.html#adapters">adapters</a></li><li><a href="global.html#dispatchAi">dispatchAi</a></li><li><a href="global.html#dispatchClaude">dispatchClaude</a></li><li><a href="global.html#dispatchCodex">dispatchCodex</a></li><li><a href="global.html#dispatchOpencode">dispatchOpencode</a></li><li><a href="global.html#getCliArgs">getCliArgs</a></li><li><a href="global.html#getErrorResult">getErrorResult</a></li></ul>
33
+
34
+ </nav>
35
+
36
+ <div id="main">
37
+
38
+ <h1 class="page-title">WDispatchAi.mjs</h1>
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+ <section>
47
+ <article>
48
+ <pre class="prettyprint source linenums"><code>import keys from 'lodash-es/keys.js'
49
+ import adapters from './adapters.mjs'
50
+ import dispatchAi from './dispatchAi.mjs'
51
+ import dispatchOpencode from './dispatchOpencode.mjs'
52
+ import dispatchClaude from './dispatchClaude.mjs'
53
+ import dispatchCodex from './dispatchCodex.mjs'
54
+
55
+
56
+ // WDispatchAi.mjs — AI供應商分派層
57
+ //
58
+ // 本套件封裝「以CLI調用各家AI」的差異,對外提供單一介面。
59
+ // 依專案方針,不引用全域技能(dispatch-claude/dispatch-codex/dispatch-opencode),
60
+ // 而是把其調用方式移植於各轉接器內,方便自行偵錯、修改與擴充。
61
+
62
+
63
+ //KINDS, 由adapters鍵名產生, 令供應商清單只有一處來源
64
+ let KINDS = keys(adapters)
65
+
66
+
67
+ /**
68
+ * AI供應商分派
69
+ *
70
+ * @returns {Object} 回傳物件,其內含KINDS(可用供應商種類字串陣列),以及dispatchAi、dispatchOpencode、dispatchClaude、dispatchCodex之async函數
71
+ * @example
72
+ *
73
+ * 詳見dispatchAi、dispatchOpencode、dispatchClaude、dispatchCodex範例
74
+ *
75
+ */
76
+ let WDispatchAi = {
77
+ KINDS,
78
+ dispatchAi,
79
+ dispatchOpencode,
80
+ dispatchClaude,
81
+ dispatchCodex,
82
+ }
83
+
84
+
85
+ export default WDispatchAi
86
+ </code></pre>
87
+ </article>
88
+ </section>
89
+
90
+
91
+
92
+
93
+
94
+
95
+ </div>
96
+
97
+ <br class="clear">
98
+
99
+ <footer>
100
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Aug 09 2026 22:39:08 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
101
+ </footer>
102
+
103
+ <script>prettyPrint();</script>
104
+ <script src="scripts/polyfill.js"></script>
105
+ <script src="scripts/linenumber.js"></script>
106
+
107
+
108
+
109
+ </body>
110
+ </html>
@@ -0,0 +1,100 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+
5
+ <meta charset="utf-8">
6
+ <title>adapters.mjs - Documentation</title>
7
+
8
+
9
+ <script src="scripts/prettify/prettify.js"></script>
10
+ <script src="scripts/prettify/lang-css.js"></script>
11
+ <!--[if lt IE 9]>
12
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
13
+ <![endif]-->
14
+ <link type="text/css" rel="stylesheet" href="styles/prettify.css">
15
+ <link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
16
+ <script src="scripts/nav.js" defer></script>
17
+
18
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
19
+ </head>
20
+ <body>
21
+
22
+ <input type="checkbox" id="nav-trigger" class="nav-trigger" />
23
+ <label for="nav-trigger" class="navicon-button x">
24
+ <div class="navicon"></div>
25
+ </label>
26
+
27
+ <label for="nav-trigger" class="overlay"></label>
28
+
29
+ <nav >
30
+
31
+
32
+ <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#WDispatchAi">WDispatchAi</a></li><li><a href="global.html#adapters">adapters</a></li><li><a href="global.html#dispatchAi">dispatchAi</a></li><li><a href="global.html#dispatchClaude">dispatchClaude</a></li><li><a href="global.html#dispatchCodex">dispatchCodex</a></li><li><a href="global.html#dispatchOpencode">dispatchOpencode</a></li><li><a href="global.html#getCliArgs">getCliArgs</a></li><li><a href="global.html#getErrorResult">getErrorResult</a></li></ul>
33
+
34
+ </nav>
35
+
36
+ <div id="main">
37
+
38
+ <h1 class="page-title">adapters.mjs</h1>
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+ <section>
47
+ <article>
48
+ <pre class="prettyprint source linenums"><code>import dispatchOpencode from './dispatchOpencode.mjs'
49
+ import dispatchClaude from './dispatchClaude.mjs'
50
+ import dispatchCodex from './dispatchCodex.mjs'
51
+
52
+
53
+ /**
54
+ * 各AI供應商種類(kind)對CLI轉接器函數之對照表
55
+ *
56
+ * 本對照表為kind之唯一來源,dispatchAi以其鍵值分派,WDispatchAi以其鍵名產生KINDS,
57
+ * 新增供應商時僅須於此加入一個鍵值對即可
58
+ *
59
+ * @returns {Object} 回傳對照表物件,鍵名為供應商種類字串,鍵值為對應之dispatch函數
60
+ * @example
61
+ *
62
+ * import adapters from './src/adapters.mjs'
63
+ *
64
+ * console.log(Object.keys(adapters))
65
+ * // => ['opencode', 'claude', 'codex']
66
+ *
67
+ */
68
+ let adapters = {
69
+ opencode: dispatchOpencode,
70
+ claude: dispatchClaude,
71
+ codex: dispatchCodex,
72
+ }
73
+
74
+
75
+ export default adapters
76
+ </code></pre>
77
+ </article>
78
+ </section>
79
+
80
+
81
+
82
+
83
+
84
+
85
+ </div>
86
+
87
+ <br class="clear">
88
+
89
+ <footer>
90
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Aug 09 2026 22:39:08 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
91
+ </footer>
92
+
93
+ <script>prettyPrint();</script>
94
+ <script src="scripts/polyfill.js"></script>
95
+ <script src="scripts/linenumber.js"></script>
96
+
97
+
98
+
99
+ </body>
100
+ </html>
@@ -0,0 +1,133 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+
5
+ <meta charset="utf-8">
6
+ <title>dispatchAi.mjs - Documentation</title>
7
+
8
+
9
+ <script src="scripts/prettify/prettify.js"></script>
10
+ <script src="scripts/prettify/lang-css.js"></script>
11
+ <!--[if lt IE 9]>
12
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
13
+ <![endif]-->
14
+ <link type="text/css" rel="stylesheet" href="styles/prettify.css">
15
+ <link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
16
+ <script src="scripts/nav.js" defer></script>
17
+
18
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
19
+ </head>
20
+ <body>
21
+
22
+ <input type="checkbox" id="nav-trigger" class="nav-trigger" />
23
+ <label for="nav-trigger" class="navicon-button x">
24
+ <div class="navicon"></div>
25
+ </label>
26
+
27
+ <label for="nav-trigger" class="overlay"></label>
28
+
29
+ <nav >
30
+
31
+
32
+ <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#WDispatchAi">WDispatchAi</a></li><li><a href="global.html#adapters">adapters</a></li><li><a href="global.html#dispatchAi">dispatchAi</a></li><li><a href="global.html#dispatchClaude">dispatchClaude</a></li><li><a href="global.html#dispatchCodex">dispatchCodex</a></li><li><a href="global.html#dispatchOpencode">dispatchOpencode</a></li><li><a href="global.html#getCliArgs">getCliArgs</a></li><li><a href="global.html#getErrorResult">getErrorResult</a></li></ul>
33
+
34
+ </nav>
35
+
36
+ <div id="main">
37
+
38
+ <h1 class="page-title">dispatchAi.mjs</h1>
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+ <section>
47
+ <article>
48
+ <pre class="prettyprint source linenums"><code>import keys from 'lodash-es/keys.js'
49
+ import includes from 'lodash-es/includes.js'
50
+ import isestr from 'wsemi/src/isestr.mjs'
51
+ import adapters from './adapters.mjs'
52
+ import getErrorResult from './getErrorResult.mjs'
53
+
54
+
55
+ /**
56
+ * 依供應商種類(kind)分派至對應之CLI轉接器
57
+ *
58
+ * 三種供應商的差異(2026-08-08於本機實測確認):
59
+ * opencode支援逐次注入金鑰(OPENCODE_AUTH_CONTENT),故可多把金鑰輪替;
60
+ * claude與codex則沿用CLI既有登入狀態,無逐次金鑰概念。
61
+ * 故「輪替」的單位是「供應商條目」而非單純的金鑰:一個條目即一組(kind, model, 可選的key/provider),
62
+ * 輪到誰就用誰的CLI與模型
63
+ *
64
+ * @param {String} kind 輸入供應商種類字串,可選'opencode'、'claude'、'codex'
65
+ * @param {String} prompt 輸入提示詞字串,一律以stdin傳入子進程
66
+ * @param {Object} [opt={}] 輸入設定物件,原樣轉傳對應轉接器,各轉接器可用設定詳見dispatchOpencode、dispatchClaude、dispatchCodex,預設{}
67
+ * @returns {Promise} 回傳Promise,resolve回傳結果物件,內含ok(是否成功布林值)、stdout(標準輸出字串)、stderr(標準錯誤字串)、code(離開碼)、error(錯誤訊息字串,成功時為空字串)、durationMs(耗時毫秒)、attempts(實際嘗試次數),本函數不會reject
68
+ * @example
69
+ * //need claude, codex or opencode cli in system PATH
70
+ *
71
+ * import dispatchAi from './src/dispatchAi.mjs'
72
+ *
73
+ * let test = async () => {
74
+ *
75
+ * let r = await dispatchAi('claude', '請只回覆兩個字:完成', { model: 'sonnet' })
76
+ * console.log(r.ok, r.stdout.trim())
77
+ * // => true '完成'
78
+ *
79
+ * let re = await dispatchAi('gemini', 'abc')
80
+ * console.log(re.ok, re.error)
81
+ * // => false 'unknown ai kind: "gemini" (available: opencode, claude, codex)'
82
+ *
83
+ * }
84
+ * await test()
85
+ * .catch((err) => {
86
+ * console.log(err)
87
+ * })
88
+ *
89
+ */
90
+ async function dispatchAi(kind, prompt, opt = {}) {
91
+
92
+ //ks
93
+ let ks = keys(adapters)
94
+
95
+ //check kind, 須為對照表既有鍵名, 不可用物件取值判斷, 否則'constructor'等原型鍵會誤判為有效
96
+ if (!isestr(kind) || !includes(ks, kind)) {
97
+ return getErrorResult(`unknown ai kind: "${kind}" (available: ${ks.join(', ')})`)
98
+ }
99
+
100
+ //fn
101
+ let fn = adapters[kind]
102
+
103
+ //dispatch, prompt與opt之檢核由各轉接器自行負責
104
+ return fn(prompt, opt)
105
+ }
106
+
107
+
108
+ export default dispatchAi
109
+ </code></pre>
110
+ </article>
111
+ </section>
112
+
113
+
114
+
115
+
116
+
117
+
118
+ </div>
119
+
120
+ <br class="clear">
121
+
122
+ <footer>
123
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Aug 09 2026 22:39:08 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
124
+ </footer>
125
+
126
+ <script>prettyPrint();</script>
127
+ <script src="scripts/polyfill.js"></script>
128
+ <script src="scripts/linenumber.js"></script>
129
+
130
+
131
+
132
+ </body>
133
+ </html>
@@ -0,0 +1,190 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+
5
+ <meta charset="utf-8">
6
+ <title>dispatchClaude.mjs - Documentation</title>
7
+
8
+
9
+ <script src="scripts/prettify/prettify.js"></script>
10
+ <script src="scripts/prettify/lang-css.js"></script>
11
+ <!--[if lt IE 9]>
12
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
13
+ <![endif]-->
14
+ <link type="text/css" rel="stylesheet" href="styles/prettify.css">
15
+ <link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
16
+ <script src="scripts/nav.js" defer></script>
17
+
18
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
19
+ </head>
20
+ <body>
21
+
22
+ <input type="checkbox" id="nav-trigger" class="nav-trigger" />
23
+ <label for="nav-trigger" class="navicon-button x">
24
+ <div class="navicon"></div>
25
+ </label>
26
+
27
+ <label for="nav-trigger" class="overlay"></label>
28
+
29
+ <nav >
30
+
31
+
32
+ <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#WDispatchAi">WDispatchAi</a></li><li><a href="global.html#adapters">adapters</a></li><li><a href="global.html#dispatchAi">dispatchAi</a></li><li><a href="global.html#dispatchClaude">dispatchClaude</a></li><li><a href="global.html#dispatchCodex">dispatchCodex</a></li><li><a href="global.html#dispatchOpencode">dispatchOpencode</a></li><li><a href="global.html#getCliArgs">getCliArgs</a></li><li><a href="global.html#getErrorResult">getErrorResult</a></li></ul>
33
+
34
+ </nav>
35
+
36
+ <div id="main">
37
+
38
+ <h1 class="page-title">dispatchClaude.mjs</h1>
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+ <section>
47
+ <article>
48
+ <pre class="prettyprint source linenums"><code>import get from 'lodash-es/get.js'
49
+ import omit from 'lodash-es/omit.js'
50
+ import isbol from 'wsemi/src/isbol.mjs'
51
+ import isestr from 'wsemi/src/isestr.mjs'
52
+ import execCli from 'wsemi/src/execCli.mjs'
53
+ import getCliArgs from './getCliArgs.mjs'
54
+ import getErrorResult from './getErrorResult.mjs'
55
+
56
+
57
+ // dispatchClaude.mjs — 以Claude Code CLI呼叫Claude模型
58
+ //
59
+ // 【調用方式】參考全域技能dispatch-claude之慣例,依專案方針「不直接引用全域技能」,
60
+ // 將其調用方式移植於此,方便本專案自行偵錯、修改與擴充。
61
+ // 2026-08-08於本機實測:`claude -p --dangerously-skip-permissions --model sonnet` + stdin
62
+ // 可正確產出合規JSON摘要(15.5s)。
63
+ //
64
+ // 【認證】沿用Claude Code既有登入狀態(帳號層級),不需也不支援逐次注入API key,
65
+ // 故本轉接器無key參數——輪替時它是「一個獨立的供應商」而非「另一把金鑰」。
66
+
67
+
68
+ //預設值
69
+ let DEFAULT_EXE = 'claude'
70
+
71
+
72
+ //本轉接器自用之設定鍵, 其餘鍵一律原樣轉傳execCli
73
+ let OWN_KEYS = ['exe', 'model', 'skipPermissions', 'extraArgs', 'input']
74
+
75
+
76
+ /**
77
+ * 以Claude Code CLI呼叫Claude模型
78
+ *
79
+ * 特點:
80
+ * prompt一律走stdin而非位置參數,因摘要內文可達數萬字,當命令列參數會spawn ENAMETOOLONG;
81
+ * 沿用Claude Code既有登入狀態,無逐次注入API key之概念,故無key參數;
82
+ * 未給model時不帶`--model`旗標,由CLI自行決定使用模型;
83
+ * 預設帶`--dangerously-skip-permissions`令非互動之`-p`模式不因權限確認而卡住,
84
+ * 惟prompt含不可信內容(例如待摘要之網頁)時該內容之指示亦將無權限閘門執行,
85
+ * 可給予skipPermissions為false保留CLI權限閘門;
86
+ * 本函數不會reject,一律以結果物件之ok與error欄位回報成敗
87
+ *
88
+ * @param {String} prompt 輸入提示詞字串,一律以stdin傳入子進程
89
+ * @param {Object} [opt={}] 輸入設定物件,預設{}
90
+ * @param {String} [opt.exe='claude'] 輸入claude執行檔名稱或絕對路徑字串,給予名稱時由execCli自系統PATH解析,預設'claude'
91
+ * @param {String} [opt.model=''] 輸入模型別名或模型ID字串,例如'sonnet'、'opus',預設''代表不帶`--model`旗標
92
+ * @param {Boolean} [opt.skipPermissions=true] 輸入是否帶`--dangerously-skip-permissions`旗標布林值,false代表保留CLI權限閘門,預設true
93
+ * @param {Array} [opt.extraArgs=[]] 輸入額外命令列旗標字串陣列,將接於固定旗標之後,預設[]
94
+ * @param {Number} [opt.timeoutMs=120000] 輸入逾時毫秒正整數,逾時將強制關閉子進程及其子孫程序,預設120000
95
+ * @param {String} [opt.cwd=process.cwd()] 輸入子進程工作目錄字串,預設process.cwd()
96
+ * @param {String|Function} [opt.validate=undefined] 輸入stdout驗證規則字串或自訂驗證函數,規則字串支援'nonempty'、'json'、'min:100',多規則可用逗號串接,預設undefined代表不驗證
97
+ * @param {Number} [opt.maxRetries=0] 輸入失敗後最大重試次數非負整數,預設0
98
+ * @returns {Promise} 回傳Promise,resolve回傳結果物件,內含ok(是否成功布林值)、stdout(標準輸出字串)、stderr(標準錯誤字串)、code(離開碼)、error(錯誤訊息字串,成功時為空字串)、durationMs(耗時毫秒)、attempts(實際嘗試次數),本函數不會reject
99
+ * @example
100
+ * //need claude cli in system PATH
101
+ *
102
+ * import dispatchClaude from './src/dispatchClaude.mjs'
103
+ *
104
+ * let test = async () => {
105
+ *
106
+ * let r = await dispatchClaude('請只回覆兩個字:完成', { model: 'sonnet', timeoutMs: 120000 })
107
+ * console.log(r.ok, r.stdout.trim())
108
+ * // => true '完成'
109
+ *
110
+ * let re = await dispatchClaude('')
111
+ * console.log(re.ok, re.error)
112
+ * // => false 'prompt must be a non-empty string'
113
+ *
114
+ * }
115
+ * await test()
116
+ * .catch((err) => {
117
+ * console.log(err)
118
+ * })
119
+ *
120
+ */
121
+ async function dispatchClaude(prompt, opt = {}) {
122
+
123
+ //check prompt, 不reject故以錯誤結果物件回報
124
+ if (!isestr(prompt)) {
125
+ return getErrorResult('prompt must be a non-empty string')
126
+ }
127
+
128
+ //exe, 無效回退預設'claude', 由execCli自系統PATH解析實體路徑
129
+ let exe = get(opt, 'exe', null)
130
+ if (!isestr(exe)) {
131
+ exe = DEFAULT_EXE
132
+ }
133
+
134
+ //model, 無效時整段`--model`旗標不出現, 由CLI自行決定使用模型
135
+ let model = get(opt, 'model', null)
136
+
137
+ //skipPermissions, 非布林值回退預設true(非互動-p模式不卡權限確認)
138
+ let skipPermissions = get(opt, 'skipPermissions', null)
139
+ if (!isbol(skipPermissions)) {
140
+ skipPermissions = true
141
+ }
142
+
143
+ //extraArgs
144
+ let extraArgs = get(opt, 'extraArgs', null)
145
+
146
+ //args
147
+ let args = getCliArgs(
148
+ '-p',
149
+ skipPermissions ? '--dangerously-skip-permissions' : [],
150
+ isestr(model) ? ['--model', model] : [],
151
+ extraArgs,
152
+ )
153
+
154
+ //optCli, 剔除本轉接器自用鍵後原樣轉傳, 令呼叫端可用execCli全部設定(例如onStdout、maxBuffer)
155
+ let optCli = omit(opt, OWN_KEYS)
156
+
157
+ //execCli, prompt一律走stdin
158
+ return execCli(exe, args, {
159
+ ...optCli,
160
+ input: prompt,
161
+ })
162
+ }
163
+
164
+
165
+ export default dispatchClaude
166
+ </code></pre>
167
+ </article>
168
+ </section>
169
+
170
+
171
+
172
+
173
+
174
+
175
+ </div>
176
+
177
+ <br class="clear">
178
+
179
+ <footer>
180
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Aug 09 2026 22:39:08 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
181
+ </footer>
182
+
183
+ <script>prettyPrint();</script>
184
+ <script src="scripts/polyfill.js"></script>
185
+ <script src="scripts/linenumber.js"></script>
186
+
187
+
188
+
189
+ </body>
190
+ </html>