@tocca-systems/twp-cli 0.18.0 → 0.19.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.
- package/CHANGELOG.public.md +8 -0
- package/README.md +36 -4
- package/dist/{ai-dispatch-27EZS2S3.js → ai-dispatch-PNA4UF4I.js} +2 -2
- package/dist/{api-command-BH6ILQNX.js → api-command-JJJOEIZQ.js} +2 -2
- package/dist/{app-4LRDLLTV.js → app-SOQPONUU.js} +3 -3
- package/dist/auto-update-CV2MM32C.js +4 -0
- package/dist/auto-update-worker-ML7EBNQW.js +16 -0
- package/dist/{backlog-AYEKG575.js → backlog-NV7Z76R3.js} +1 -1
- package/dist/chunk-3WHC4FSG.js +15 -0
- package/dist/chunk-5WGOHFAS.js +3 -0
- package/dist/{chunk-SQSVA6AT.js → chunk-BYRM4NSC.js} +1 -1
- package/dist/chunk-DEVIQH5U.js +18 -0
- package/dist/{chunk-RQFG3OUL.js → chunk-FOFV2MNL.js} +1 -1
- package/dist/chunk-GTABFTZP.js +23 -0
- package/dist/chunk-ILKQDXI5.js +22 -0
- package/dist/{chunk-U4QQNRXF.js → chunk-MGKVUKU5.js} +1 -1
- package/dist/{chunk-7WEYBZSK.js → chunk-MIMDLO52.js} +1 -1
- package/dist/{chunk-H3JTPDCJ.js → chunk-NWABK3RZ.js} +3 -18
- package/dist/{chunk-77CQG7O7.js → chunk-VGK2JMBW.js} +3 -3
- package/dist/{chunk-63LDNYGW.js → chunk-XNLIEUAW.js} +1 -1
- package/dist/cli.js +37 -30
- package/dist/{commands-VUWI4ERO.js → commands-7D5EEQBY.js} +6 -5
- package/dist/{commands-XYKBLMXT.js → commands-EWRHQZYM.js} +56 -61
- package/dist/logout-guard-Q4MQFEGR.js +13 -0
- package/dist/{oneshot-5EM5NFTK.js → oneshot-XLLRNRLK.js} +2 -2
- package/dist/{project-OKTJ32JT.js → project-BATJQR3F.js} +1 -1
- package/dist/{run-XALXQIC3.js → run-OB3JFPSH.js} +2 -2
- package/dist/{setup-AJ56N6XO.js → setup-ROGEF3UO.js} +2 -1
- package/dist/{task-VVBXZLPU.js → task-6QUH5OXF.js} +2 -2
- package/dist/update-EXFIHTMW.js +3 -0
- package/package.json +1 -1
- package/dist/update-WDWUECN7.js +0 -21
package/CHANGELOG.public.md
CHANGED
|
@@ -11,6 +11,14 @@
|
|
|
11
11
|
`CHANGELOG.md` に残してあります。顧客向けの履歴は public 公開以降を対象とします。
|
|
12
12
|
-->
|
|
13
13
|
|
|
14
|
+
## 0.19.0
|
|
15
|
+
|
|
16
|
+
**`twp logout` が、同じ資格情報で動いている `twp task-loop` を止めてしまわないようにしました。** 同じマシンで同じプロファイルの task-loop が動いているときは、ログアウトせずに理由と影響(そのループが止まること・もう一度 `twp login` が必要になること)をお知らせします。それでもログアウトする場合は `twp logout --force` を使ってください。
|
|
17
|
+
|
|
18
|
+
**自動アップデートに対応しました。** `npm i -g @tocca-systems/twp-cli` で導入した twp は、1日1回新しい版を確認し、twp を終了したあとに自動で更新します(次に起動したときから新しい版で動きます)。更新後の初回起動では、何版から何版へ上がったかを1行でお知らせします。更新に失敗しても、いまの版のまま問題なく使えます(理由と手動の更新方法を1回だけお知らせします)。
|
|
19
|
+
|
|
20
|
+
自動アップデートを止めるには、環境変数 `TWP_NO_AUTO_UPDATE=1` を設定するか、`~/.twp/config.json` に `"auto_update": false` を書いてください。npx やプロジェクトへのローカル導入で使っている場合は自動では更新せず、新しい版があることだけをお知らせします。
|
|
21
|
+
|
|
14
22
|
## 0.16.0
|
|
15
23
|
|
|
16
24
|
`twp task-loop` が、使っている AI アカウントの枠(利用率・上限・再ログイン期限)をエージェントループ画面へ報告できるようになりました。**設定しなければ何も変わりません**(プローブの実行も送信も起きません)。
|
package/README.md
CHANGED
|
@@ -44,8 +44,9 @@ twp -p "<プロンプト>" 非対話で 1 往復だけ実行(応答は stdout
|
|
|
44
44
|
twp login ログイン(ブラウザ委譲 / --password / --token)
|
|
45
45
|
twp login --tenant <code>
|
|
46
46
|
テナントコードを先に指定する(--password のプロンプトを 1 つ省ける)
|
|
47
|
-
twp logout
|
|
48
|
-
twp
|
|
47
|
+
twp logout ログアウト(同じ資格情報で twp task-loop が稼働中なら拒否する。--force で続行)
|
|
48
|
+
twp whoami ログイン中のユーザー・テナントを表示
|
|
49
|
+
twp update npm の最新版・サーバが要求する最小バージョン・自動更新の状態を確認
|
|
49
50
|
twp --mode biz 起動時のモードを指定(dev | biz | plan)
|
|
50
51
|
twp --permission-mode denyAll
|
|
51
52
|
ツール実行の既定を上書き(plan | acceptEdits | denyAll)
|
|
@@ -170,9 +171,39 @@ twp task-loop stop
|
|
|
170
171
|
|
|
171
172
|
**モデル取次には `cli` 権限付きトークンが必要。** `twp login`(ブラウザ委譲)と `twp login --password` が発行する。`twp login --token` で保存した通常トークンは TWP API には使えるが会話は 401 になる。
|
|
172
173
|
|
|
173
|
-
###
|
|
174
|
+
### 自動アップデート
|
|
174
175
|
|
|
175
|
-
|
|
176
|
+
**`npm i -g @tocca-systems/twp-cli` で導入した場合、twp は自動で最新版へ更新される(既定で有効)。**
|
|
177
|
+
|
|
178
|
+
- 24時間に1回、バックグラウンドで npm registry の最新版を確認する(起動は待たせない)
|
|
179
|
+
- 新しい版があれば、**起動した twp が終了してから** `npm i -g @tocca-systems/twp-cli@<最新版>` を実行する。効くのは**次回起動から**で、実行中の twp は差し替えない
|
|
180
|
+
- 更新後の初回起動で `twp を 0.18.0 から 0.19.0 へ自動更新しました` のように stderr へ1行出す
|
|
181
|
+
- **失敗しても現在の版のまま動く。** 権限不足(グローバルの導入先に書けない)・registry 不達のときは、次回起動時に理由と手動の更新方法を1回だけ知らせる
|
|
182
|
+
- 通知はすべて stderr に出す(`--output json` の stdout は汚さない)
|
|
183
|
+
|
|
184
|
+
**無効化**(どちらでもよい。無効化すると確認の通信も起きない):
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
export TWP_NO_AUTO_UPDATE=1
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
```jsonc
|
|
191
|
+
// ~/.twp/config.json
|
|
192
|
+
{ "auto_update": false }
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
| 導入のしかた | 挙動 |
|
|
196
|
+
|---|---|
|
|
197
|
+
| `npm i -g`(npm のグローバル導入) | 自動で更新する |
|
|
198
|
+
| npx / プロジェクトへのローカル導入 / pnpm | 更新しない。新しい版があることと更新方法を、版ごとに1回だけ知らせる |
|
|
199
|
+
| ソースから実行(`node dist/cli.js` 等) | 何もしない |
|
|
200
|
+
| `CI` が設定された環境 / `twp task-loop` とその配下 | 何もしない |
|
|
201
|
+
|
|
202
|
+
グローバル導入かどうかは、実行中の `cli.js` の実体パスが `npm root -g` 配下にあるかで判定する。状態は `~/.twp/update-state.json` に残る(消すと次回起動で確認し直す)。
|
|
203
|
+
|
|
204
|
+
### 更新の確認(`twp update`)
|
|
205
|
+
|
|
206
|
+
`twp update` は **npm の最新版**と、**接続先のリレーが要求する最小サポートバージョン**の両方を報告し、自動アップデートが効いているかも表示する。**このコマンド自身は更新を実行しない**(実行中の自分を差し替えないため。更新は上の自動アップデートが行う)。最小サポート未満なら終了コード 1。
|
|
176
207
|
|
|
177
208
|
リレーは古いクライアントを拒否しない(`/api/cli/v1` の後方互換は恒久的に保つ)。止めるのは CLI 側で、**下限が読めない・取れないときは素通りする**(回線断やサーバ未対応で全員が使えなくなるのを避ける)。下限は `~/.twp/models.json` にプロファイル単位でキャッシュする。
|
|
178
209
|
|
|
@@ -187,6 +218,7 @@ twp 0.2.3
|
|
|
187
218
|
|
|
188
219
|
最新版 0.3.0(npm registry)
|
|
189
220
|
最小サポート 0.2.0(サーバ / https://ai-api.tocca.systems)
|
|
221
|
+
自動更新 有効(npm グローバル導入・24時間ごとに確認し、次回起動から反映)
|
|
190
222
|
判定 更新できます(必須ではありません)
|
|
191
223
|
|
|
192
224
|
npm i -g @tocca-systems/twp-cli@latest
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{failureHint,isAuthError,isCliFatalText,isRateLimited,isServerAiType,isUntrusted,maxTurnsReached,rateLimitWaitSeconds,tailForScan}from"./chunk-ZOOEH7ZE.js";import{DEFAULT_CLAUDE_LAUNCHER,activeSlotPath,
|
|
4
|
-
import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import{spawnSync}from"child_process";import fs2 from"fs";import path2 from"path";import{spawn}from"child_process";import fs from"fs";import path from"path";var FINAL_REPORT_BEGIN="<<<AI_FINAL_REPORT>>>";var FINAL_REPORT_END="<<<END_AI_FINAL_REPORT>>>";var ClaudeStreamRenderer=class{constructor(now=()=>new Date){this.now=now}now;toolNames=new Map;toolCount=0;result={subtype:null,isError:null,numTurns:null,costUsd:null,durationMs:null,tokensIn:null,tokensOut:null,rateLimited:false,resetsAt:null,finalText:""};push(line){const trimmed=line.trim();if(trimmed==="")return[];let event;try{const parsed=JSON.parse(trimmed);if(parsed===null||typeof parsed!=="\
|
|
3
|
+
import{failureHint,isAuthError,isCliFatalText,isRateLimited,isServerAiType,isUntrusted,maxTurnsReached,rateLimitWaitSeconds,tailForScan}from"./chunk-ZOOEH7ZE.js";import{detectAiClis}from"./chunk-DEVIQH5U.js";import{DEFAULT_CLAUDE_LAUNCHER,activeSlotPath,detectClaudeAutoSwitch,isClaudeAi,isUsableModelId,modelFitsRoute,resolveSpawnTarget,usesBedrock,wrapWithAutoSwitch}from"./chunk-NWABK3RZ.js";import{isForceOnly,killProcessTree,system32}from"./chunk-N2UVRM3Z.js";import{findExecutable,
|
|
4
|
+
isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import"./chunk-5WGOHFAS.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import{spawnSync}from"child_process";import fs2 from"fs";import path2 from"path";import{spawn}from"child_process";import fs from"fs";import path from"path";var FINAL_REPORT_BEGIN="<<<AI_FINAL_REPORT>>>";var FINAL_REPORT_END="<<<END_AI_FINAL_REPORT>>>";var ClaudeStreamRenderer=class{constructor(now=()=>new Date){this.now=now}now;toolNames=new Map;toolCount=0;result={subtype:null,isError:null,numTurns:null,costUsd:null,durationMs:null,tokensIn:null,tokensOut:null,rateLimited:false,resetsAt:null,finalText:""};push(line){const trimmed=line.trim();if(trimmed==="")return[];let event;try{const parsed=JSON.parse(trimmed);if(parsed===null||typeof parsed!=="\
|
|
5
5
|
object"||Array.isArray(parsed)){return[line]}event=parsed}catch{return[line]}switch(event["type"]){case"rate_limit_event":return this.onRateLimit(event);case"assistant":return this.onAssistant(event);case"user":return this.onUser(event);case"result":return this.onResult(event);default:return event["type"]==="system"?[]:[line]}}sawRateLimit(){return this.result.rateLimited}lastRateLimitNote="";onRateLimit(event){const info=event["rate_limit_info"];if(info===null||typeof info!=="object")return[];const rec=info;
|
|
6
6
|
const status=typeof rec["status"]==="string"?rec["status"]:"";const resets=typeof rec["resetsAt"]==="number"?rec["resetsAt"]:null;if(status==="")return[];const at=isSaneEpochSec(resets)?` resets=${new Date(resets*1e3).toISOString()}`:"";if(status.startsWith("allowed")){if(status==="allowed")return[];const seen=`${status}|${resets??""}`;if(seen===this.lastRateLimitNote)return[];this.lastRateLimitNote=seen;return[this.line(`\u2139\uFE0F \u4E0A\u9650\u306B\u63A5\u8FD1\uFF08status=${status}${at}\uFF09\u2014 \u5B9F\
|
|
7
7
|
\u884C\u306F\u7D99\u7D9A\u3057\u307E\u3059`)]}if(resets!==null)this.result.resetsAt=resets;this.result.rateLimited=true;return[this.line(`\u26A0\uFE0F \u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8\u901A\u77E5: status=${status}${at}`)]}onAssistant(event){const out=[];for(const block of contentBlocks(event)){if(block.type==="tool_use"){const name=typeof block.name==="string"?block.name:"tool";if(typeof block.id==="string")this.toolNames.set(block.id,name);this.toolCount+=1;out.push(this.line(`>> ${name}${toolDetail(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{
|
|
4
|
-
import"./chunk-
|
|
3
|
+
import{OUTPUT_FORMATS,evaluateQuery,exitCodeFor,fetchAllPages,redactSecretValues,renderOutput,reportError,resolveOutputFormat,withDebug}from"./chunk-VGK2JMBW.js";import"./chunk-WVS4W5FY.js";import{parseOperationArgs,repeatedValues}from"./chunk-O52CUEDO.js";import{GLOBAL_OPTIONS_HELP,HELP_TOKEN}from"./chunk-FKIZ5ZJU.js";import"./chunk-QQRJLH6B.js";import{AuthSession,NotLoggedInError,SessionExpiredError,loadCredentials}from"./chunk-XNLIEUAW.js";import{readBody}from"./chunk-QVXZEUKN.js";
|
|
4
|
+
import"./chunk-MIMDLO52.js";import"./chunk-II5RVJQN.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-JKSXUBND.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{effectiveApiUrl,resolveConfiguredOutput,resolveProfile}from"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{DEFAULT_MAX_ITEMS,DEFAULT_MAX_PAGES,envelopePaging,positiveInteger,readEnvelopeCursor,shellQuote}from"./chunk-2VISRLWS.js";
|
|
5
5
|
import{EXIT_OK,NetworkError,UsageError}from"./chunk-M3GWY6NT.js";import"./chunk-5QCAIKFE.js";import"./chunk-VSJBJXZO.js";import{readFile}from"fs/promises";import{existsSync}from"fs";import{dirname,join,resolve}from"path";import{fileURLToPath}from"url";var DIR_NAME="command-model";var cachedDir;function commandModelDir(){if(cachedDir!==void 0)return cachedDir;let current=dirname(fileURLToPath(import.meta.url));for(let depth=0;depth<6;depth+=1){const candidate=join(current,DIR_NAME);if(existsSync(join(candidate,"index.json"))){cachedDir=candidate;return cachedDir}if(existsSync(join(current,"package.json")))break;const parent=resolve(
|
|
6
6
|
current,"..");if(parent===current)break;current=parent}cachedDir=null;return cachedDir}var CommandModelMissingError=class extends Error{constructor(detail){super(`\u30B3\u30DE\u30F3\u30C9\u30E2\u30C7\u30EB\uFF08${DIR_NAME}/\uFF09\u3092\u8AAD\u3081\u307E\u305B\u3093: ${detail}
|
|
7
7
|
\u958B\u767A\u6642\u306F \`npm run generate:command-model -- --spec <api.json>\` \u3067\u751F\u6210\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);this.name="CommandModelMissingError"}};var domainCache=new Map;var routesCache=null;async function readJson(file){const dir=commandModelDir();if(dir===null)throw new CommandModelMissingError("\u30D1\u30C3\u30B1\u30FC\u30B8\u306B\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304C\u3042\u308A\u307E\u305B\u3093");const path=join(dir,file);try{return JSON.parse(await readFile(path,"utf8"))}catch(cause){throw new CommandModelMissingError(`${path} \u3092\u8AAD\u3081\u307E\u305B\u3093\uFF08${cause.message}\uFF09`)}}async function loadCommandModelRoutes(){if(routesCache!==null)return routesCache;const file=await readJson("_routes.json");if(typeof file?.routes!=="object"||file.routes===null||Array.isArray(file.routes)){throw new CommandModelMissingError("_routes.json \u306E\u5F62\u304C\u9055\u3044\u307E\u3059\uFF08routes \u304C\u8AAD\u3081\u307E\u305B\u3093\uFF09")}routesCache=file;return routesCache}async function loadCommandModelDomain(domain){const cached=domainCache.get(domain);if(cached!==void 0)return cached;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{RESIDENT_TOKEN_CAP,activateModeFiles,activatePermissionSettings,buildResidentSet,buildSystemPrompt,createAuditLogger,currentBranch,describeAuditLog,displayCwd,runTurn}from"./chunk-
|
|
4
|
-
|
|
5
|
-
__export,__require,__toESM}from"./chunk-VSJBJXZO.js";var require_react_production=__commonJS({"node_modules/react/cjs/react.production.js"(exports){"use strict";var REACT_ELEMENT_TYPE=Symbol.for("react.transitional.element");var REACT_PORTAL_TYPE=Symbol.for("react.portal");var REACT_FRAGMENT_TYPE=Symbol.for("react.fragment");var REACT_STRICT_MODE_TYPE=Symbol.for("react.strict_mode");var REACT_PROFILER_TYPE=Symbol.for("react.profiler");var REACT_CONSUMER_TYPE=Symbol.for("react.consumer");var REACT_CONTEXT_TYPE=Symbol.for("react.context");var REACT_FORWARD_REF_TYPE=Symbol.
|
|
3
|
+
import{RESIDENT_TOKEN_CAP,activateModeFiles,activatePermissionSettings,buildResidentSet,buildSystemPrompt,createAuditLogger,currentBranch,describeAuditLog,displayCwd,runTurn}from"./chunk-MGKVUKU5.js";import{isFullWidth,isWide,stringWidth,stripAnsi}from"./chunk-WVS4W5FY.js";import"./chunk-N2UVRM3Z.js";import{applyPermissionMode,checkPermission,describePermissionMode,getMode,isModeId,modeSource,nextMode}from"./chunk-BOBSH3QN.js";import{RelayError,builtinCatalog,createRuntime,
|
|
4
|
+
loadCachedCatalog,modelLabel,pickModel,toModelInfos}from"./chunk-FOFV2MNL.js";import"./chunk-XNLIEUAW.js";import"./chunk-PMOUHEJQ.js";import{checkMinSupportedVersion,isBelowMinSupported,minSupportedBlockMessage}from"./chunk-DXXFUNYN.js";import{require_fuzzysort}from"./chunk-DIMZRTLE.js";import{proxyDiagnostics}from"./chunk-J7QYPKVK.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";
|
|
5
|
+
import{__commonJS,__export,__require,__toESM}from"./chunk-VSJBJXZO.js";var require_react_production=__commonJS({"node_modules/react/cjs/react.production.js"(exports){"use strict";var REACT_ELEMENT_TYPE=Symbol.for("react.transitional.element");var REACT_PORTAL_TYPE=Symbol.for("react.portal");var REACT_FRAGMENT_TYPE=Symbol.for("react.fragment");var REACT_STRICT_MODE_TYPE=Symbol.for("react.strict_mode");var REACT_PROFILER_TYPE=Symbol.for("react.profiler");var REACT_CONSUMER_TYPE=Symbol.for("react.consumer");var REACT_CONTEXT_TYPE=Symbol.for("react.context");var REACT_FORWARD_REF_TYPE=Symbol.
|
|
6
6
|
for("react.forward_ref");var REACT_SUSPENSE_TYPE=Symbol.for("react.suspense");var REACT_MEMO_TYPE=Symbol.for("react.memo");var REACT_LAZY_TYPE=Symbol.for("react.lazy");var REACT_ACTIVITY_TYPE=Symbol.for("react.activity");var REACT_VIEW_TRANSITION_TYPE=Symbol.for("react.view_transition");var MAYBE_ITERATOR_SYMBOL=Symbol.iterator;function getIteratorFn(maybeIterable){if(null===maybeIterable||"object"!==typeof maybeIterable)return null;maybeIterable=MAYBE_ITERATOR_SYMBOL&&maybeIterable[MAYBE_ITERATOR_SYMBOL]||
|
|
7
7
|
maybeIterable["@@iterator"];return"function"===typeof maybeIterable?maybeIterable:null}var ReactNoopUpdateQueue={isMounted:function(){return false},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}};var assign=Object.assign;var emptyObject={};function Component(props,context,updater){this.props=props;this.context=context;this.refs=emptyObject;this.updater=updater||ReactNoopUpdateQueue}Component.prototype.isReactComponent={};Component.prototype.setState=
|
|
8
8
|
function(partialState,callback){if("object"!==typeof partialState&&"function"!==typeof partialState&&null!=partialState)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,partialState,callback,"setState")};Component.prototype.forceUpdate=function(callback){this.updater.enqueueForceUpdate(this,callback,"forceUpdate")};function ComponentDummy(){}ComponentDummy.prototype=Component.prototype;function PureComponent2(props,context,updater){
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{CHECK_INTERVAL_MS,DISABLE_ENV,PARENT_PID_ENV,WORKER_ENV,autoUpdateDisabledReason,classifyInstall,describeAutoUpdate,isCheckDue,listRegisteredPids,lockFilePath,onStartup,pickNotice,readUpdateState,registerRunning,resolveCliPath,runDirPath,sameNpmPath,stateFilePath,workerEnv,writeUpdateState}from"./chunk-ILKQDXI5.js";import"./chunk-DXXFUNYN.js";import"./chunk-5WGOHFAS.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";
|
|
4
|
+
import"./chunk-VSJBJXZO.js";export{CHECK_INTERVAL_MS,DISABLE_ENV,PARENT_PID_ENV,WORKER_ENV,autoUpdateDisabledReason,classifyInstall,describeAutoUpdate,isCheckDue,listRegisteredPids,lockFilePath,onStartup,pickNotice,readUpdateState,registerRunning,resolveCliPath,runDirPath,sameNpmPath,stateFilePath,workerEnv,writeUpdateState};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{fetchLatestVersion,isBehindLatest,resolveNpmCommand}from"./chunk-GTABFTZP.js";import"./chunk-FOFV2MNL.js";import"./chunk-XNLIEUAW.js";import"./chunk-PMOUHEJQ.js";import{PARENT_PID_ENV,WORKER_ENV,autoUpdateDisabledReason,classifyInstall,isCheckDue,listRegisteredPids,lockFilePath,readUpdateState,resolveCliPath,runDirPath,writeUpdateState}from"./chunk-ILKQDXI5.js";import{PACKAGE_NAME,parseVersionCore}from"./chunk-DXXFUNYN.js";import"./chunk-5WGOHFAS.js";
|
|
4
|
+
import"./chunk-J7QYPKVK.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import{execFile}from"child_process";import fs from"fs";import path from"path";var PARENT_WAIT_MAX_MS=12*60*60*1e3;var PARENT_POLL_MS=1e3;var LOCK_STALE_MS=PARENT_WAIT_MAX_MS+60*60*1e3;var INSTALL_TIMEOUT_MS=0;function childEnv(env){const next={...env};delete next[WORKER_ENV];delete next[PARENT_PID_ENV];return next}function createNpmRunner(env=process.env){const cmd=resolveNpmCommand({env});if(cmd===null)return null;return(args,timeoutMs)=>new Promise(resolve=>{execFile(cmd.file,[...cmd.prefix,...args],{timeout:timeoutMs,windowsHide:true,maxBuffer:8*1024*1024,cwd:path.dirname(lockFilePath(env)),env:childEnv(env)},(error,stdout,stderr)=>{if(error===null){resolve({ok:true,stdout:String(stdout),stderr:String(
|
|
5
|
+
stderr)});return}const e=error;resolve({ok:false,stdout:String(stdout??""),stderr:String(stderr??""),...e.killed?{error:"\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F"}:typeof e.code==="string"?{error:e.code}:{}})})})}function summarizeNpmFailure(result){const text=`${result.stderr}
|
|
6
|
+
${result.stdout}`;const code=/npm (?:ERR!|error) code (\S+)/.exec(text)?.[1]??result.error;let reason;if(code==="EACCES"||code==="EPERM"){reason=`\u30B0\u30ED\u30FC\u30D0\u30EB\u306E\u5C0E\u5165\u5148\u306B\u66F8\u304D\u8FBC\u3080\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\uFF08${code}\uFF09`}else if(code!==void 0&&/^(ENOTFOUND|ETIMEDOUT|ECONNREFUSED|ECONNRESET|EAI_AGAIN|ENETUNREACH)$/.test(code)){reason=`npm registry \u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${code}\
|
|
7
|
+
\uFF09`}else if(code!==void 0){reason=`npm \u304C\u5931\u6557\u3057\u307E\u3057\u305F\uFF08${code}\uFF09`}else{const line=text.split("\n").map(l=>l.trim()).find(l=>l!=="")??"\u4E0D\u660E\u306A\u30A8\u30E9\u30FC";reason=`npm \u304C\u5931\u6557\u3057\u307E\u3057\u305F: ${line}`}return stripTerminalControls(reason).slice(0,200)}function readInstalledVersion(cliPath){try{const pkgRoot=path.dirname(path.dirname(cliPath));const pkg=JSON.parse(fs.readFileSync(path.join(pkgRoot,"package.json"),"utf8"));
|
|
8
|
+
if(pkg.name!==PACKAGE_NAME||typeof pkg.version!=="string"||parseVersionCore(pkg.version)===null){return null}return pkg.version}catch{return null}}function isAlive(pid){try{process.kill(pid,0);return true}catch(err){return err.code==="EPERM"}}function acquireLock(env,now=Date.now()){const file=lockFilePath(env);for(let attempt=0;attempt<2;attempt++){try{fs.mkdirSync(path.dirname(file),{recursive:true,mode:448});fs.writeFileSync(file,String(process.pid),{flag:"wx",mode:384});return()=>{try{if(fs.
|
|
9
|
+
readFileSync(file,"utf8").trim()===String(process.pid))fs.rmSync(file,{force:true})}catch{}}}catch(err){if(err.code!=="EEXIST")return null;try{const holder=Number(fs.readFileSync(file,"utf8").trim());const age=now-fs.statSync(file).mtimeMs;if(Number.isInteger(holder)&&holder>0&&isAlive(holder)&&age<LOCK_STALE_MS)return null;fs.rmSync(file,{force:true})}catch{return null}}}return null}function ownsLock(env){try{return fs.readFileSync(lockFilePath(env),"utf8").trim()===String(process.pid)}catch{return false}}
|
|
10
|
+
function livingTwpPids(env){const parent=Number(env[PARENT_PID_ENV]);const candidates=new Set(listRegisteredPids(env));if(Number.isInteger(parent)&&parent>0)candidates.add(parent);candidates.delete(process.pid);const alive=[];for(const pid of candidates){if(isAlive(pid)){alive.push(pid)}else{try{fs.rmSync(path.join(runDirPath(env),String(pid)),{force:true})}catch{}}}return alive}async function defaultWaitForParent(env){const deadline=Date.now()+PARENT_WAIT_MAX_MS;while(livingTwpPids(env).length>
|
|
11
|
+
0){if(Date.now()>=deadline)return false;await new Promise(r=>setTimeout(r,PARENT_POLL_MS))}return true}async function runAutoUpdateWorker(deps={}){const env=deps.env??process.env;const now=deps.now??Date.now;if(autoUpdateDisabledReason(env)!==null)return"disabled";const release=acquireLock(env,now());if(release===null)return"locked";try{let state=readUpdateState(env);if(!isCheckDue(state,now()))return"not-due";state={...state,checked_at:new Date(now()).toISOString()};writeUpdateState(state,env);
|
|
12
|
+
const cliPath=deps.cliPath===void 0?resolveCliPath():deps.cliPath;if(cliPath===null)return"no-cli-path";const latest=await(deps.fetchLatest??(()=>fetchLatestVersion({env})))();if(latest.version===null||parseVersionCore(latest.version)===null)return"latest-unavailable";state={...readUpdateState(env),checked_at:state.checked_at,latest:latest.version};const npm=deps.npm===void 0?createNpmRunner(env):deps.npm;let kind=classifyInstall(cliPath);if(kind==="npm-local"){kind=null;if(npm!==null){const root=await npm(
|
|
13
|
+
["root","-g"],3e4);const reported=root.stdout.trim();if(root.ok&&reported!=="")kind=classifyInstall(cliPath,reported)}}if(kind===null){writeUpdateState(state,env);return"not-npm-global"}state={...state,install:{cli_path:cliPath,kind}};writeUpdateState(state,env);if(kind!=="npm-global"||npm===null)return"not-npm-global";const readVersion=deps.readInstalledVersion??readInstalledVersion;const before=readVersion(cliPath);if(before===null||!isBehindLatest(before,latest.version))return"up-to-date";if(!await(deps.
|
|
14
|
+
waitForParent??(()=>defaultWaitForParent(env)))())return"parent-still-running";const beforeInstall=readVersion(cliPath);if(beforeInstall===null||!isBehindLatest(beforeInstall,latest.version))return"up-to-date";if(!(deps.ownsLock??(()=>ownsLock(env)))())return"locked";const result=await npm(["install","-g",`${PACKAGE_NAME}@${latest.version}`,"--no-fund","--no-audit","--ignore-scripts","--loglevel=error"],INSTALL_TIMEOUT_MS);const after=readVersion(cliPath);const at=new Date(now()).toISOString();const current=readUpdateState(
|
|
15
|
+
env);if(result.ok&&after===latest.version){const next={...current,updated:{from:beforeInstall,to:latest.version,at,notified:false}};delete next.failed;writeUpdateState(next,env);return"updated"}const reason=result.ok?`\u66F4\u65B0\u5F8C\u306E\u7248\u304C ${after??"\u4E0D\u660E"} \u3067\u3057\u305F\uFF08\u671F\u5F85: ${latest.version}\uFF09`:summarizeNpmFailure(result);const alreadyNotified=current.failed?.target===latest.version&¤t.failed.notified;writeUpdateState({...current,failed:{target:latest.
|
|
16
|
+
version,reason,at,notified:alreadyNotified}},env);return"failed"}finally{release()}}export{acquireLock,createNpmRunner,livingTwpPids,readInstalledVersion,resolveNpmCommand,runAutoUpdateWorker,summarizeNpmFailure};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{
|
|
3
|
+
import{readBody}from"./chunk-QVXZEUKN.js";import{BACKLOG_BASE_PATH,BACKLOG_PROJECT_SCOPE_LABEL,BACKLOG_SCOPE_LABEL,backlogSpacePath,resolveNamed}from"./chunk-MIMDLO52.js";import"./chunk-II5RVJQN.js";import"./chunk-JKSXUBND.js";import"./chunk-J7QYPKVK.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import{isRecord,pick,requireResolved,singleRef,withResolved}from"./chunk-GFC2ASHE.js";import{ApiResponseError,
|
|
4
4
|
UsageError}from"./chunk-M3GWY6NT.js";import"./chunk-5QCAIKFE.js";import"./chunk-VSJBJXZO.js";var DEFAULT_COUNT=20;var MAX_COUNT=100;var NUMERIC=/^[0-9]+$/;function isExactNumericId(value){return NUMERIC.test(value)&&String(Number(value))===value}var ISSUE_REF=/^(?:[A-Za-z0-9_]+-[0-9]+|[0-9]+)$/;var DATE=/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/;var SPACE_COLUMNS=["id","space_url"];var PROJECT_COLUMNS=["id","projectKey","name"];var ISSUE_LIST_COLUMNS=["issueKey","summary","status","assignee","priority","dueDate","updated","descriptionTruncated"];var ISSUE_GET_COLUMNS=["id","issueKey","projectId","s\
|
|
5
5
|
ummary","description","descriptionTruncated","status","issueType","priority","assignee","createdUser","parentIssueId","startDate","dueDate","estimatedHours","actualHours","created","updated"];var COMMENT_COLUMNS=["id","created","createdUserId","createdUser","content","changeLog"];function commentRow(row){const source=isRecord(row)?row:{};const user=isRecord(source["createdUser"])?source["createdUser"]:{};return pick({...source,createdUserId:user["id"]??null,createdUser:user["name"]??null},COMMENT_COLUMNS)}
|
|
6
6
|
var ATTACHMENT_COLUMNS=["id","name","size","contentType","createdUserId","createdUser","created"];var STATUS_COLUMNS=["id","name","color"];var USER_COLUMNS=["id","userId","name","mailAddress","roleType"];var SPACE_FLAG={name:"--space",summary:"Backlog \u30B9\u30DA\u30FC\u30B9\uFF08ID / \u30B9\u30DA\u30FC\u30B9URL / \u30B5\u30D6\u30C9\u30E1\u30A4\u30F3\uFF09\u3002\u767B\u9332\u304C1\u4EF6\u306A\u3089\u7701\u7565\u3067\u304D\u307E\u3059",takesValue:true,placeholder:"<ID|URL>"};var BODY_MAX_CHARS=1e5;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{system32}from"./chunk-N2UVRM3Z.js";import{execFileSync}from"child_process";import fs from"fs";import path from"path";var DEFAULT_GRACE_MS=6e4;var InstanceLock=class{constructor(lockDir,opts={}){this.lockDir=lockDir;this.opts=opts}lockDir;opts;owned=null;acquire(){const mine=this.tryMkdir();if(mine)return{acquired:true,reason:"",note:null};const oldPid=this.readPid();if(oldPid!==null){if(this.isLoop(oldPid)){return{acquired:false,reason:`\u540C\u3058\u30DE\u30B7\u30F3\u3067\u5225\u306E task-loop \u304C\u7A3C\u50CD\u4E2D\u3067\u3059\uFF08pid=${oldPid} / \u30ED\u30C3\u30AF: ${this.lockDir}\uFF09`,note:null}}const note=`\
|
|
4
|
+
\u30ED\u30C3\u30AF\u306EPID ${oldPid} \u306F\u5225\u306E\u30D7\u30ED\u30BB\u30B9\u306B\u518D\u5229\u7528\u3055\u308C\u3066\u3044\u307E\u3059\uFF08\u30EB\u30FC\u30D7\u3067\u306F\u306A\u3044\uFF09\u2192 \u6B8B\u9AB8\u3068\u3057\u3066\u5F15\u304D\u53D6\u308A\u307E\u3059`;return this.takeOver(note)}const age=this.lockAgeMs();const grace=this.opts.graceMs??DEFAULT_GRACE_MS;if(age===null||age<grace){return{acquired:false,reason:`\u30ED\u30C3\u30AF\u304C\u4F5C\u6210\u76F4\u5F8C\u306E\u305F\u3081\u5F85\u6A5F\u5074\u306B\u5012\u3057\u307E\u3059\uFF08\u30ED\u30C3\u30AF: ${this.
|
|
5
|
+
lockDir}\uFF09`,note:null}}return this.takeOver(`\u30ED\u30C3\u30AF\u306B pid \u304C\u306A\u304F\u4F5C\u6210\u304B\u3089 ${Math.trunc(age/1e3)} \u79D2\u7D4C\u904E\u3057\u3066\u3044\u307E\u3059 \u2192 \u6B8B\u9AB8\u3068\u3057\u3066\u5F15\u304D\u53D6\u308A\u307E\u3059`)}release(){if(!this.owned)return;if(this.readPid()===process.pid){fs.rmSync(this.owned,{recursive:true,force:true})}this.owned=null}takeOver(note){fs.rmSync(this.lockDir,{recursive:true,force:true});if(this.tryMkdir())return{acquired:true,
|
|
6
|
+
reason:"",note};return{acquired:false,reason:`\u30ED\u30C3\u30AF\u306E\u5F15\u304D\u53D6\u308A\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u5225\u30D7\u30ED\u30BB\u30B9\u304C\u5148\u306B\u53D6\u5F97\u3057\u305F\u53EF\u80FD\u6027\uFF09: ${this.lockDir}`,note:null}}tryMkdir(){try{fs.mkdirSync(path.dirname(this.lockDir),{recursive:true,mode:448});fs.mkdirSync(this.lockDir,{mode:448})}catch{return false}try{fs.writeFileSync(path.join(this.lockDir,"pid"),`${process.pid}
|
|
7
|
+
`)}catch{}this.owned=this.lockDir;return true}readPid(){try{const raw=fs.readFileSync(path.join(this.lockDir,"pid"),"utf8").split("\n")[0]?.trim();const pid=Number.parseInt(raw??"",10);return Number.isInteger(pid)&&pid>0?pid:null}catch{return null}}lockAgeMs(){try{const now=this.opts.now?.()??Date.now();return now-fs.statSync(this.lockDir).mtimeMs}catch{return null}}isLoop(pid){if(this.opts.isLoopProcess)return this.opts.isLoopProcess(pid);return defaultIsLoopProcess(pid)}};function defaultIsLoopProcess(pid,deps={}){
|
|
8
|
+
try{process.kill(pid,0)}catch(err){const code=err.code;if(code==="EPERM")return true;return false}const cmdline=readCommandLine(pid,deps);if(cmdline===null)return true;return cmdline.includes("task-loop")}function readCommandLine(pid,deps={}){const platform=deps.platform??process.platform;const env=deps.env??process.env;const nonEmpty=v=>v.trim()===""?null:v;if(platform==="linux"){try{const read=deps.readProc??(p=>fs.readFileSync(`/proc/${p}/cmdline`,"utf8"));return nonEmpty(read(pid).replace(/\0/g,
|
|
9
|
+
" "))}catch{return null}}const run=deps.run??((file,args)=>execFileSync(file,[...args],{encoding:"utf8",timeout:2e4,stdio:["ignore","pipe","ignore"],windowsHide:true}));if(platform==="win32"){const ps=system32(env,"WindowsPowerShell","v1.0","powershell.exe");if(ps===null)return null;try{const filter=`ProcessId=${String(Math.trunc(pid))}`;const cmd=`(Get-CimInstance Win32_Process -Filter "${filter}").CommandLine | Out-String -Width 32767`;return nonEmpty(run(ps,["-NoProfile","-NonInteractive","-C\
|
|
10
|
+
ommand",cmd]))}catch{return null}}try{return nonEmpty(run("ps",["-ww","-p",String(Math.trunc(pid)),"-o","command="]))}catch{return null}}import fs2 from"fs";import path2 from"path";var LOCK_OWNER_FILE="owner.json";var MAX_OWNER_BYTES=4096;function lockOwnerPath(lockDir){return path2.join(lockDir,LOCK_OWNER_FILE)}function buildLockOwner(input){return{pid:input.pid,profile:input.profile,twp_home:path2.resolve(input.twpHome),project_ref:input.projectRef,project_id:input.projectId,started_at:(input.now??new Date).toISOString()}}function writeLockOwner(lockDir,owner){try{fs2.writeFileSync(lockOwnerPath(lockDir),`${JSON.stringify(owner)}\
|
|
11
|
+
|
|
12
|
+
`,{mode:384});return null}catch(err){return err.message}}function readLockOwner(lockDir){let raw;try{const st=fs2.lstatSync(lockOwnerPath(lockDir));if(!st.isFile())return{ok:false,reason:`${LOCK_OWNER_FILE} \u304C\u901A\u5E38\u306E\u30D5\u30A1\u30A4\u30EB\u3067\u306F\u3042\u308A\u307E\u305B\u3093`};if(st.size>MAX_OWNER_BYTES)return{ok:false,reason:`${LOCK_OWNER_FILE} \u304C\u5927\u304D\u3059\u304E\u307E\u3059\uFF08${st.size} \u30D0\u30A4\u30C8\uFF09`};raw=fs2.readFileSync(lockOwnerPath(lockDir),
|
|
13
|
+
"utf8")}catch(err){const code=err.code;return{ok:false,reason:code==="ENOENT"?`${LOCK_OWNER_FILE} \u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u3053\u306E\u8A18\u9332\u3092\u66F8\u304B\u306A\u3044\u65E7\u7248\u306E twp \u3067\u8D77\u52D5\u3055\u308C\u305F\u30EB\u30FC\u30D7\u306E\u53EF\u80FD\u6027\uFF09`:`${LOCK_OWNER_FILE} \u3092\u8AAD\u3081\u307E\u305B\u3093\uFF08${code??err.message}\uFF09`}}let parsed;try{parsed=JSON.parse(raw)}catch{return{ok:false,reason:`${LOCK_OWNER_FILE} \u304C JSON \u3068\u3057\u3066\u8AAD\u3081\u307E\u305B\u3093`}}
|
|
14
|
+
const o=parsed;if(o===null||typeof o!=="object"||typeof o.pid!=="number"||typeof o.profile!=="string"||o.profile===""||typeof o.twp_home!=="string"||o.twp_home===""){return{ok:false,reason:`${LOCK_OWNER_FILE} \u306B pid / profile / twp_home \u304C\u3042\u308A\u307E\u305B\u3093`}}return{ok:true,owner:{pid:o.pid,profile:o.profile,twp_home:o.twp_home,project_ref:typeof o.project_ref==="string"?o.project_ref:"",project_id:typeof o.project_id==="string"?o.project_id:"",started_at:typeof o.started_at===
|
|
15
|
+
"string"?o.started_at:""}}}function sameTwpHome(a,b,platform=process.platform){try{const sa=fs2.statSync(path2.resolve(a),{bigint:true});const sb=fs2.statSync(path2.resolve(b),{bigint:true});if(sa.ino!==0n&&sb.ino!==0n)return sa.dev===sb.dev&&sa.ino===sb.ino}catch{}const norm=p=>{let resolved=path2.resolve(p);try{resolved=fs2.realpathSync.native(resolved)}catch{}return platform==="win32"||platform==="darwin"?resolved.toLowerCase():resolved};return norm(a)===norm(b)}export{InstanceLock,defaultIsLoopProcess,buildLockOwner,writeLockOwner,readLockOwner,sameTwpHome};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
var FALSY=new Set(["0","false","no","off"]);function isBoolishTrue(raw){const v=(raw??"").trim();if(v==="")return false;return!FALSY.has(v.toLowerCase())}export{isBoolishTrue};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{DEFAULT_CLAUDE_LAUNCHER,
|
|
3
|
+
import{DEFAULT_CLAUDE_LAUNCHER,loadAiConfig}from"./chunk-NWABK3RZ.js";import{killProcessTree}from"./chunk-N2UVRM3Z.js";import{projectFileKey}from"./chunk-GY7KI5E5.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import{isBoolishTrue}from"./chunk-5WGOHFAS.js";import{twpHomeDir}from"./chunk-RZVI6PMW.js";function stringField(value,key,fallback,warnings){if(value===void 0||value===null)return fallback;if(typeof value!=="string"||value.trim()===""){warnings.push(`claude_launcher.${key} \u306F\u7A7A\u3067\u306A\u3044\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u65E2\u5B9A '${fallback}' \u3092\u4F7F\u3044\u307E\u3059\uFF09`);return fallback}return value.trim()}function argvField(value,key,fallback,warnings,allowEmpty){if(value===void 0||value===null)return fallback;
|
|
4
4
|
if(!Array.isArray(value)){warnings.push(`claude_launcher.${key} \u306F\u6587\u5B57\u5217\u306E\u914D\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u65E2\u5B9A [${fallback.join(", ")}] \u3092\u4F7F\u3044\u307E\u3059\uFF09`);return fallback}for(const v of value){if(typeof v!=="string"||v.trim()===""){warnings.push(`claude_launcher.${key} \u306E\u8981\u7D20\u306F\u7A7A\u3067\u306A\u3044\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u65E2\u5B9A [${fallback.
|
|
5
5
|
join(", ")}] \u3092\u4F7F\u3044\u307E\u3059\uFF09`);return fallback}}if(value.length===0&&!allowEmpty){warnings.push(`claude_launcher.${key} \u306F1\u3064\u4EE5\u4E0A\u306E\u5F15\u6570\u304C\u8981\u308A\u307E\u3059\uFF08\u65E2\u5B9A [${fallback.join(", ")}] \u3092\u4F7F\u3044\u307E\u3059\uFF09`);return fallback}return value.map(v=>v.trim())}function probeMatchField(value,warnings){const raw=stringField(value,"probe_match",DEFAULT_CLAUDE_LAUNCHER.probeMatch,warnings);try{new RegExp(raw,"m")}catch(err){
|
|
6
6
|
warnings.push(`claude_launcher.probe_match \u306F\u6B63\u898F\u8868\u73FE\u3068\u3057\u3066\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08${err.message}\uFF09\u3002\u65E2\u5B9A '${DEFAULT_CLAUDE_LAUNCHER.probeMatch}' \u3092\u4F7F\u3044\u307E\u3059`);return DEFAULT_CLAUDE_LAUNCHER.probeMatch}return raw}var NOT_YET_APPLIED=[{key:"probe",get:c=>c.probe},{key:"probe_match",get:c=>c.probeMatch},{key:"exec_args",get:c=>c.execArgs},{key:"active_args",get:c=>c.activeArgs}];function sameAsDefault(key,parsed){
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{DEFAULT_CLAUDE_LAUNCHER,activeSlotPath,detectClaudeAutoSwitch,spawnSyncResolved}from"./chunk-NWABK3RZ.js";import{defaultIsExecutableFile,findOnPath,joinFor}from"./chunk-PMOUHEJQ.js";import{isBoolishTrue}from"./chunk-5WGOHFAS.js";import{spawnSync}from"child_process";import{createHash}from"crypto";import fs from"fs";import os from"os";import path from"path";var DETECTABLE_AIS=["claude","codex","gemini","copilot"];function isDetectableAi(value){return DETECTABLE_AIS.includes(value)}function isSelectable(d){return d.installed&&d.blockedReason===null&&d.auth!=="unauthenticated"}function resolveDetectDeps(deps={}){return resolve(deps)}function resolve(deps){const platform=deps.platform??process.platform;return{run:deps.run??spawnSync,env:deps.env??process.env,homedir:deps.homedir??os.homedir,isExecutableFile:deps.isExecutableFile??(p=>defaultIsExecutableFile(p,platform)),existsSync:deps.existsSync??fs.existsSync,readFileSync:deps.readFileSync??(p=>fs.readFileSync(p,"utf8")),platform,
|
|
4
|
+
now:deps.now??Date.now,launcherBin:nonEmptyBin(deps.launcherBin)??DEFAULT_CLAUDE_LAUNCHER.bin}}function nonEmptyBin(value){const t=value?.trim();return t===void 0||t===""?void 0:t}var PROBE_TIMEOUT_MS=1e4;function oneLine(text){return text.replace(/\s+/g," ").trim()}function claudeConfigDir(d){const lookup={env:d.env,platform:d.platform};const bin=nonEmptyBin(d.launcherBin)??DEFAULT_CLAUDE_LAUNCHER.bin;const cas=detectClaudeAutoSwitch(bin,d.run,lookup);if(cas!==null){const active=activeSlotPath(
|
|
5
|
+
cas,d.run,lookup);if(active!==null){return{dir:active,via:`${bin} ${DEFAULT_CLAUDE_LAUNCHER.activeArgs.join(" ")}`}}}const explicit=d.env.CLAUDE_CONFIG_DIR?.trim();if(explicit!==void 0&&explicit!=="")return{dir:explicit,via:"CLAUDE_CONFIG_DIR"};return{dir:joinFor(d.platform)(d.homedir(),".claude"),via:"\u65E2\u5B9A\uFF08~/.claude\uFF09"}}var CLAUDE_AUTH_ENV=[{key:"ANTHROPIC_API_KEY",label:"ANTHROPIC_API_KEY",boolish:false},{key:"ANTHROPIC_AUTH_TOKEN",label:"ANTHROPIC_AUTH_TOKEN",boolish:false},{
|
|
6
|
+
key:"CLAUDE_CODE_OAUTH_TOKEN",label:"CLAUDE_CODE_OAUTH_TOKEN",boolish:false},{key:"AWS_BEARER_TOKEN_BEDROCK",label:"AWS_BEARER_TOKEN_BEDROCK",boolish:false},{key:"CLAUDE_CODE_USE_BEDROCK",label:"CLAUDE_CODE_USE_BEDROCK\uFF08AWS \u8CC7\u683C\u60C5\u5831\u3067\u52D5\u304D\u307E\u3059\uFF09",boolish:true},{key:"CLAUDE_CODE_USE_VERTEX",label:"CLAUDE_CODE_USE_VERTEX\uFF08GCP \u8CC7\u683C\u60C5\u5831\u3067\u52D5\u304D\u307E\u3059\uFF09",boolish:true}];function envEnabled(raw,boolish){if(boolish)return isBoolishTrue(
|
|
7
|
+
raw);return(raw??"").trim()!==""}function keychainService(configDir,homedir){const norm=configDir.normalize("NFC");if(norm===path.posix.join(homedir,".claude").normalize("NFC"))return"Claude Code-credentials";return`Claude Code-credentials-${createHash("sha256").update(norm,"utf8").digest("hex").slice(0,8)}`}function probeMacKeychain(d,configDir){const account=d.env.USER?.trim()??"";const args=["find-generic-password","-s",keychainService(configDir,d.homedir())];if(account!=="")args.push("-a",account);
|
|
8
|
+
try{const r=d.run("/usr/bin/security",args,{encoding:"utf8",timeout:PROBE_TIMEOUT_MS,stdio:"ignore"});return r.error===void 0&&r.status===0}catch{return false}}function detectClaude(d){for(const e of CLAUDE_AUTH_ENV){if(envEnabled(d.env[e.key],e.boolish)){return{auth:"authenticated",detail:`${e.label} \u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059`,blockedReason:null}}}const{dir,via}=claudeConfigDir(d);const file=joinFor(d.platform)(dir,".credentials.json");let raw;try{if(!d.existsSync(file))
|
|
9
|
+
throw new Error("ENOENT");raw=d.readFileSync(file)}catch{if(d.platform==="darwin"){if(probeMacKeychain(d,dir)){return{auth:"authenticated",detail:oneLine(`macOS Keychain \u306B\u8CC7\u683C\u60C5\u5831\u304C\u3042\u308A\u307E\u3059\uFF08${dir}\uFF09`),blockedReason:null}}return{auth:"unknown",detail:oneLine(`\u8CC7\u683C\u60C5\u5831\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF08${dir}\uFF0F${via}\uFF09\u3002macOS \u306F Keychain \u306B\u4FDD\u5B58\u3059\u308B\u305F\u3081\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u306F\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093`),
|
|
10
|
+
blockedReason:null}}return{auth:"unauthenticated",detail:oneLine(`\u8CC7\u683C\u60C5\u5831\u304C\u3042\u308A\u307E\u305B\u3093\uFF08${file}\uFF0F${via}\uFF09\u3002'claude' \u3092\u4E00\u5EA6\u8D77\u52D5\u3057\u3066\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044`),blockedReason:null}}let expiresAt;let hasToken;try{const parsed=JSON.parse(raw);hasToken=typeof parsed.claudeAiOauth?.accessToken==="string"&&parsed.claudeAiOauth.accessToken!=="";expiresAt=parsed.claudeAiOauth?.refreshTokenExpiresAt}catch{
|
|
11
|
+
return{auth:"unknown",detail:oneLine(`\u8CC7\u683C\u60C5\u5831\u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08${file}\uFF09\u3002\u30D5\u30A1\u30A4\u30EB\u304C\u58CA\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059`),blockedReason:null}}if(!hasToken){return{auth:"unauthenticated",detail:oneLine(`\u8CC7\u683C\u60C5\u5831\u306B\u30C8\u30FC\u30AF\u30F3\u304C\u3042\u308A\u307E\u305B\u3093\uFF08${file}\uFF09`),blockedReason:null}}if(typeof expiresAt==="number"&&expiresAt>
|
|
12
|
+
0&&expiresAt<d.now()){return{auth:"unauthenticated",detail:oneLine(`\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u30C8\u30FC\u30AF\u30F3\u304C\u5931\u52B9\u3057\u3066\u3044\u307E\u3059\uFF08${dir}\uFF09\u3002\u518D\u30ED\u30B0\u30A4\u30F3\u304C\u5FC5\u8981\u3067\u3059`),blockedReason:null}}return{auth:"authenticated",detail:oneLine(`\u8CC7\u683C\u60C5\u5831\u304C\u3042\u308A\u307E\u3059\uFF08${dir}\uFF0F${via}\uFF09`),blockedReason:null}}function detectCodex(d,binPath){let r;try{r=spawnSyncResolved(binPath,
|
|
13
|
+
["login","status"],{encoding:"utf8",timeout:PROBE_TIMEOUT_MS},{env:d.env,platform:d.platform},d.run)}catch(err){return{auth:"unknown",detail:oneLine(`codex login status \u3092\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\uFF08${err.message}\uFF09`),blockedReason:null}}if(r.error!==void 0){return{auth:"unknown",detail:oneLine(`codex login status \u3092\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\uFF08${r.error.message}\uFF09`),blockedReason:null}}if(r.status===null){return{auth:"unknown",detail:`codex\
|
|
14
|
+
login status \u304C ${PROBE_TIMEOUT_MS/1e3} \u79D2\u4EE5\u5185\u306B\u7D42\u308F\u308A\u307E\u305B\u3093\u3067\u3057\u305F`,blockedReason:null}}if(r.status===0)return{auth:"authenticated",detail:"codex login status: \u30ED\u30B0\u30A4\u30F3\u6E08\u307F",blockedReason:null};return{auth:"unauthenticated",detail:`codex login status \u304C\u7D42\u4E86\u30B3\u30FC\u30C9 ${r.status} \u3092\u8FD4\u3057\u307E\u3057\u305F\u3002'codex login' \u3067\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044`,
|
|
15
|
+
blockedReason:null}}function detectPending(ai){return{auth:"unknown",detail:"\u30ED\u30B0\u30A4\u30F3\u5224\u5B9A\u306E\u65B9\u6CD5\u304C\u672A\u78BA\u5B9A\u3067\u3059",blockedReason:`${ai} \u306F\u7121\u4EBA\u5B9F\u884C\u3067\u306E\u8A8D\u8A3C\u72B6\u614B\u3092\u5224\u5B9A\u3059\u308B\u65B9\u6CD5\u304C\u672A\u78BA\u5B9A\u306E\u305F\u3081\u9078\u629E\u3067\u304D\u307E\u305B\u3093`}}function detectAiClis(deps={}){const d=resolve(deps);return DETECTABLE_AIS.map(ai=>{const binPath=findOnPath(ai,d);
|
|
16
|
+
if(binPath===null){return{ai,installed:false,binPath:null,auth:"unknown",detail:"PATH \u306B\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF08\u672A\u5C0E\u5165\uFF09",blockedReason:null}}const state=ai==="claude"?detectClaude(d):ai==="codex"?detectCodex(d,binPath):detectPending(ai);return{ai,installed:true,binPath,...state}})}function formatDetection(d,index){const selectable=isSelectable(d);const mark=selectable?d.auth==="authenticated"?"\u2705":"\u2754":" ";const num=index===null?" ":`${String(
|
|
17
|
+
index).padStart(2)}.`;const state=!d.installed?"\u672A\u5C0E\u5165":d.auth==="authenticated"?"\u30ED\u30B0\u30A4\u30F3\u6E08\u307F":d.auth==="unauthenticated"?"\u672A\u30ED\u30B0\u30A4\u30F3":"\u672A\u5224\u5B9A";const blocked=d.blockedReason===null?"":`
|
|
18
|
+
\u9078\u629E\u3067\u304D\u307E\u305B\u3093: ${oneLine(d.blockedReason)}`;return`${num} ${mark} ${d.ai.padEnd(8)} ${state.padEnd(8)} ${oneLine(d.detail)}${blocked}`}export{isDetectableAi,isSelectable,resolveDetectDeps,claudeConfigDir,detectAiClis,formatDetection};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{parseVersionCore}from"./chunk-DXXFUNYN.js";import{
|
|
3
|
+
import{AuthSession,loadCredentials,withFileLock}from"./chunk-XNLIEUAW.js";import{parseVersionCore}from"./chunk-DXXFUNYN.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{effectiveApiUrl,effectiveRelayUrl,resolveConfiguredModel,resolveProfile}from"./chunk-NERYSBA4.js";import{ensureTwpHome,twpHomeDir}from"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";var MAX_EVENT_BYTES=8*1024*1024;var SseBufferOverflowError=class extends Error{constructor(limit){super(`SSE \u306E\u30A4\u30D9\u30F3\u30C8\u5883\u754C\uFF08\u7A7A\u884C\uFF09\u304C ${limit} \u30D0\u30A4\u30C8\u4EE5\u5185\u306B\u73FE\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u4E0A\u6D41\u306E\u5FDC\u7B54\u304C\u58CA\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002`)}};var SseParser=class{constructor(maxEventBytes=MAX_EVENT_BYTES){this.maxEventBytes=maxEventBytes}maxEventBytes;buffer="";pendingCr=false;push(chunk){
|
|
4
4
|
let pending=this.pendingCr?`\r${chunk}`:chunk;this.pendingCr=pending.endsWith("\r");if(this.pendingCr)pending=pending.slice(0,-1);this.buffer+=pending.replace(/\r\n/g,"\n").replace(/\r/g,"\n");if(this.buffer.length>this.maxEventBytes){this.buffer="";this.pendingCr=false;throw new SseBufferOverflowError(this.maxEventBytes)}const events=[];for(;;){const boundary=this.buffer.indexOf("\n\n");if(boundary===-1)break;const block=this.buffer.slice(0,boundary);this.buffer=this.buffer.slice(boundary+2);const parsed=parseBlock(
|
|
5
5
|
block);if(parsed)events.push(parsed)}return events}flush(){const rest=(this.pendingCr?`${this.buffer}
|
|
6
6
|
`:this.buffer).trim();this.buffer="";this.pendingCr=false;if(rest==="")return[];const parsed=parseBlock(rest);return parsed?[parsed]:[]}};function parseBlock(block){let event="message";const data=[];for(const line of block.split("\n")){if(line.startsWith(":"))continue;const colon=line.indexOf(":");const field=colon===-1?line:line.slice(0,colon);let value=colon===-1?"":line.slice(colon+1);if(value.startsWith(" "))value=value.slice(1);if(field==="event")event=value;else if(field==="data")data.push(
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{createRuntime}from"./chunk-FOFV2MNL.js";import{findExecutable}from"./chunk-PMOUHEJQ.js";import{describeAutoUpdate}from"./chunk-ILKQDXI5.js";import{PACKAGE_NAME,UPDATE_COMMAND,compareVersionCores,isBelowMinSupported,parseVersionCore}from"./chunk-DXXFUNYN.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{execFile}from"child_process";import fs from"fs";import path from"path";function resolveNpmCommand(deps={}){const platform=deps.platform??process.platform;const env=deps.env??process.env;const npmPath=(deps.find??(name=>findExecutable(name,{env,platform})))("npm");if(npmPath===null)return null;if(platform!=="win32")return{file:npmPath,prefix:[]};if(/\.exe$/i.test(npmPath))return{file:npmPath,prefix:[]};const cliJs=path.win32.join(path.win32.dirname(npmPath),"node_modules","npm","bin","npm-cli.js");return(deps.exists??fs.existsSync)(cliJs)?{file:deps.nodePath??process.
|
|
4
|
+
execPath,prefix:[cliJs]}:null}var DEFAULT_REGISTRY="https://registry.npmjs.org";function registryBase(env=process.env){const configured=env["npm_config_registry"]?.trim();if(configured===void 0||configured==="")return DEFAULT_REGISTRY;try{const url=new URL(configured);if(url.protocol!=="https:"&&url.protocol!=="http:")return DEFAULT_REGISTRY}catch{return DEFAULT_REGISTRY}return configured.replace(/\/+$/,"")}async function fetchFromRegistry(fetchImpl=httpFetch,env=process.env){const url=`${registryBase(env)}/${PACKAGE_NAME.replace(
|
|
5
|
+
"/","%2f")}`;const res=await fetchImpl(url,{headers:{Accept:"application/vnd.npm.install-v1+json"},signal:AbortSignal.timeout(5e3)});if(!res.ok){throw new Error(`registry \u304C ${res.status} \u3092\u8FD4\u3057\u307E\u3057\u305F`)}const body=await res.json();const latest=body["dist-tags"]?.latest;if(typeof latest!=="string"||parseVersionCore(latest)===null){throw new Error("registry \u306E\u5FDC\u7B54\u306B dist-tags.latest \u304C\u3042\u308A\u307E\u305B\u3093")}return{version:latest.trim(),source:"\
|
|
6
|
+
registry"}}async function fetchFromNpmCli(){const npm=resolveNpmCommand();if(npm===null){throw new Error("npm \u304C PATH \u306B\u898B\u3064\u304B\u308A\u307E\u305B\u3093")}const stdout=await new Promise((resolve,reject)=>{execFile(npm.file,[...npm.prefix,"view",PACKAGE_NAME,"version","--json"],{timeout:15e3,windowsHide:true},(error,out)=>error?reject(error):resolve(out))});const parsed=JSON.parse(stdout.trim());const latest=typeof parsed==="string"?parsed:null;if(latest===null||parseVersionCore(
|
|
7
|
+
latest)===null){throw new Error("npm view \u306E\u51FA\u529B\u304B\u3089\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F")}return{version:latest,source:"npm"}}function firstLine(message){const line=message.split("\n").map(l=>l.trim()).find(l=>l!=="")??message;return line.length>200?`${line.slice(0,200)}\u2026`:line}async function fetchLatestVersion(deps={}){const errors=[];for(const attempt of[()=>fetchFromRegistry(deps.fetchImpl??httpFetch,deps.env??process.env),
|
|
8
|
+
()=>(deps.npmView??fetchFromNpmCli)()]){try{return await attempt()}catch(err){errors.push(firstLine(err instanceof Error?err.message:String(err)))}}return{version:null,source:null,error:errors.join(" / ")}}function isPrerelease(version){return/-/.test(version.trim())}function isBehindLatest(current,latest){const currentCore=parseVersionCore(current);const latestCore=parseVersionCore(latest);if(currentCore===null||latestCore===null||latest===null)return false;const diff=compareVersionCores(currentCore,
|
|
9
|
+
latestCore);if(diff!==0)return diff<0;return isPrerelease(current)&&!isPrerelease(latest)}async function runUpdate(opts,deps={}){const out=deps.out??(text=>void process.stdout.write(stripTerminalControls(text)));const err=deps.err??(text=>void process.stderr.write(stripTerminalControls(text)));const runtime=deps.runtime??createRuntime({...opts.profile!==void 0?{profile:opts.profile}:{},cliVersion:opts.version});let floor;let floorSource;if(runtime.loggedIn){const catalog=await runtime.loadCatalog();
|
|
10
|
+
floor=catalog.minSupportedVersion;floorSource=catalog.source==="server"?"\u30B5\u30FC\u30D0":catalog.source==="cache"?"\u30AD\u30E3\u30C3\u30B7\u30E5":"\u672A\u53D6\u5F97";if(floor===null){const cached=runtime.loadCachedFloor().minSupportedVersion;if(cached!==null){floor=cached;floorSource="\u30AD\u30E3\u30C3\u30B7\u30E5"}}}else{floor=runtime.loadCachedFloor().minSupportedVersion;floorSource="\u30AD\u30E3\u30C3\u30B7\u30E5\uFF08\u672A\u30ED\u30B0\u30A4\u30F3\uFF09"}const latest=deps.fetchLatest?
|
|
11
|
+
await deps.fetchLatest():await fetchLatestVersion();const behindLatest=isBehindLatest(opts.version,latest.version);const blocked=isBelowMinSupported(opts.version,floor);out(`twp ${opts.version}
|
|
12
|
+
|
|
13
|
+
`);out(latest.version!==null?` \u6700\u65B0\u7248 ${latest.version}\uFF08${latest.source==="registry"?"npm registry":"npm view"}\uFF09
|
|
14
|
+
`:" \u6700\u65B0\u7248 \u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\n");out(` \u6700\u5C0F\u30B5\u30DD\u30FC\u30C8 ${floor??"\u6307\u5B9A\u306A\u3057"}\uFF08${floorSource} / ${runtime.relayUrl}\uFF09
|
|
15
|
+
`);out(` \u81EA\u52D5\u66F4\u65B0 ${deps.describeAutoUpdate?deps.describeAutoUpdate():describeAutoUpdate(opts.version)}
|
|
16
|
+
`);if(blocked){out(` \u5224\u5B9A \u26A0 \u66F4\u65B0\u304C\u5FC5\u8981\u3067\u3059\uFF08${floor} \u672A\u6E80\u306E\u305F\u3081\u4F1A\u8A71\u3092\u958B\u59CB\u3067\u304D\u307E\u305B\u3093\uFF09
|
|
17
|
+
|
|
18
|
+
`);out(` ${UPDATE_COMMAND}
|
|
19
|
+
`);return 1}if(behindLatest){out(" \u5224\u5B9A \u66F4\u65B0\u3067\u304D\u307E\u3059\uFF08\u5FC5\u9808\u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF09\n\n");out(` ${UPDATE_COMMAND}
|
|
20
|
+
`);return 0}out(latest.version!==null?" \u5224\u5B9A \u6700\u65B0\u3067\u3059\n":" \u5224\u5B9A \u5224\u5B9A\u3067\u304D\u307E\u305B\u3093\n");if(latest.version===null&&latest.error!==void 0){err(`
|
|
21
|
+
\u6700\u65B0\u7248\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F: ${latest.error}
|
|
22
|
+
`);err(`\u66F4\u65B0\u3059\u308B\u5834\u5408: ${UPDATE_COMMAND}
|
|
23
|
+
`)}return 0}export{resolveNpmCommand,fetchLatestVersion,isBehindLatest,runUpdate};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{PACKAGE_NAME,UPDATE_COMMAND,compareVersionCores,parseVersionCore}from"./chunk-DXXFUNYN.js";import{isBoolishTrue}from"./chunk-5WGOHFAS.js";import{loadUserConfig}from"./chunk-NERYSBA4.js";import{twpHomeDir}from"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{spawn}from"child_process";import fs from"fs";import path from"path";var CHECK_INTERVAL_MS=24*60*60*1e3;var DISABLE_ENV="TWP_NO_AUTO_UPDATE";var WORKER_ENV="TWP_AUTO_UPDATE_WORKER";var PARENT_PID_ENV="TWP_AUTO_UPDATE_PARENT_PID";function stateFilePath(env=process.env){return path.join(twpHomeDir(env),"update-state.json")}function lockFilePath(env=process.env){return path.join(twpHomeDir(env),"update.lock")}function runDirPath(env=process.env){return path.join(twpHomeDir(env),"run")}function registerRunning(env=process.env){try{const dir=runDirPath(env);fs.mkdirSync(
|
|
4
|
+
dir,{recursive:true,mode:448});const file=path.join(dir,String(process.pid));fs.writeFileSync(file,"",{mode:384});process.once("exit",()=>{try{fs.rmSync(file,{force:true})}catch{}})}catch{}}function listRegisteredPids(env=process.env){try{return fs.readdirSync(runDirPath(env)).filter(name=>/^\d+$/.test(name)).map(Number)}catch{return[]}}function readUpdateState(env=process.env){try{const parsed=JSON.parse(fs.readFileSync(stateFilePath(env),"utf8"));return parsed!==null&&typeof parsed==="object"&&
|
|
5
|
+
!Array.isArray(parsed)?parsed:{}}catch{return{}}}function writeUpdateState(state,env=process.env){const file=stateFilePath(env);const tmp=`${file}.${process.pid}.tmp`;try{fs.mkdirSync(path.dirname(file),{recursive:true,mode:448});fs.rmSync(tmp,{force:true});fs.writeFileSync(tmp,`${JSON.stringify(state,null,2)}
|
|
6
|
+
`,{mode:384,flag:"wx"});fs.renameSync(tmp,file)}catch{try{fs.rmSync(tmp,{force:true})}catch{}}}function autoUpdateDisabledReason(env=process.env){if(isBoolishTrue(env[DISABLE_ENV]))return`${DISABLE_ENV} \u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059`;if(isBoolishTrue(env["CI"]))return"CI \u74B0\u5883\uFF08CI \u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\uFF09";if(process.getuid?.()===0&&(env["SUDO_UID"]??"")!=="")return"sudo \u3067\u5B9F\u884C\u3055\u308C\u3066\u3044\u307E\u3059";
|
|
7
|
+
try{if(loadUserConfig(env).auto_update===false)return"~/.twp/config.json \u3067 auto_update: false \u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059"}catch{return"\u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB\u3092\u8AAD\u307F\u53D6\u308C\u307E\u305B\u3093"}return null}function normalizeForCompare(p,platform){const pathApi=platform==="win32"?path.win32:path.posix;const normalized=pathApi.normalize(p).replace(/[\\/]+$/,"");return platform==="win32"?normalized.toLowerCase():normalized}function realpathOr(p){
|
|
8
|
+
try{return fs.realpathSync(p)}catch{return p}}var NPM_REDACTED="***";var UUID_RE_SOURCE="[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";function sameNpmPath(npmOutput,actual,platform){const reported=normalizeForCompare(realpathOr(npmOutput),platform);const real=normalizeForCompare(actual,platform);if(!reported.includes(NPM_REDACTED))return reported===real;const pattern=reported.split(NPM_REDACTED).map(part=>part.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join(UUID_RE_SOURCE);return new RegExp(
|
|
9
|
+
`^${pattern}$`,"i").test(real)}function classifyInstall(cliPath,globalRoot=null,platform=process.platform){const pathApi=platform==="win32"?path.win32:path.posix;const pkgRoot=pathApi.dirname(pathApi.dirname(cliPath));const scopeDir=pathApi.dirname(pkgRoot);const nodeModules=pathApi.dirname(scopeDir);const[scope,name]=PACKAGE_NAME.split("/");const inNodeModules=pathApi.basename(pkgRoot)===name&&pathApi.basename(scopeDir)===scope&&pathApi.basename(nodeModules)==="node_modules";if(!inNodeModules)return"\
|
|
10
|
+
source";const segments=normalizeForCompare(cliPath,platform).split(/[\\/]/);if(segments.includes("_npx"))return"npx";if(segments.includes(".pnpm"))return"pnpm";if(globalRoot!==null&&sameNpmPath(globalRoot,nodeModules,platform))return"npm-global";return"npm-local"}function resolveCliPath(argv1=process.argv[1]){if(argv1===void 0||argv1==="")return null;try{return fs.realpathSync(argv1)}catch{return null}}function isDevBuild(version){const core=parseVersionCore(version);return core===null||core[0]===
|
|
11
|
+
0&&core[1]===0&&core[2]===0}function isNewer(a,b){const ca=parseVersionCore(a);const cb=parseVersionCore(b);return ca!==null&&cb!==null&&compareVersionCores(ca,cb)>0}function guidanceCommand(kind){switch(kind){case"npx":return`npx ${PACKAGE_NAME}@latest`;case"npm-local":return`npm i ${PACKAGE_NAME}@latest\uFF08\u30B0\u30ED\u30FC\u30D0\u30EB\u5C0E\u5165\u306A\u3089 ${UPDATE_COMMAND}\uFF09`;case"pnpm":return`pnpm add -g ${PACKAGE_NAME}@latest`;default:return UPDATE_COMMAND}}function pickNotice(state,version){
|
|
12
|
+
const u=state.updated;if(u!==void 0&&!u.notified&&u.to===version&&parseVersionCore(u.from)!==null){return{text:`twp \u3092 ${u.from} \u304B\u3089 ${u.to} \u3078\u81EA\u52D5\u66F4\u65B0\u3057\u307E\u3057\u305F\uFF08\u7121\u52B9\u5316: ${DISABLE_ENV}=1\uFF09
|
|
13
|
+
`,mark:s=>({...s,...s.updated?{updated:{...s.updated,notified:true}}:{}})}}const f=state.failed;if(f!==void 0&&!f.notified&&isNewer(f.target,version)){const reason=String(f.reason).slice(0,200);return{text:`twp \u306E\u81EA\u52D5\u66F4\u65B0\uFF08${version} \u2192 ${f.target}\uFF09\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${reason}
|
|
14
|
+
\u73FE\u5728\u306E ${version} \u306E\u307E\u307E\u52D5\u4F5C\u3057\u3066\u3044\u307E\u3059\u3002\u624B\u52D5\u3067\u66F4\u65B0: ${UPDATE_COMMAND}\uFF08\u7121\u52B9\u5316: ${DISABLE_ENV}=1\uFF09
|
|
15
|
+
`,mark:s=>({...s,...s.failed?{failed:{...s.failed,notified:true}}:{}})}}const latest=state.latest;const kind=state.install?.kind;if(latest!==void 0&&kind!==void 0&&kind!=="npm-global"&&kind!=="source"&&state.guided_for!==latest&&isNewer(latest,version)){return{text:`twp \u306E\u65B0\u3057\u3044\u7248 ${latest} \u304C\u3042\u308A\u307E\u3059\uFF08\u73FE\u5728 ${version}\uFF09\u3002\u66F4\u65B0: ${guidanceCommand(kind)}
|
|
16
|
+
`,mark:s=>({...s,guided_for:latest})}}return null}function isCheckDue(state,now=Date.now()){const at=state.checked_at===void 0?Number.NaN:Date.parse(state.checked_at);if(Number.isNaN(at))return true;return now-at>=CHECK_INTERVAL_MS||at>now+6e4}function workerEnv(env,parentPid=process.pid){const marker={...env,[WORKER_ENV]:"1",[PARENT_PID_ENV]:String(parentPid)};const underNpm=["npm_lifecycle_event","npm_execpath","npm_command"].some(k=>(env[k]??"")!=="");if(!underNpm)return marker;const next={};
|
|
17
|
+
for(const[key,value]of Object.entries(env)){if(key.startsWith("npm_"))continue;next[key]=value}for(const key of Object.keys(next)){if(key.toUpperCase()!=="PATH"||next[key]===void 0)continue;const sep=process.platform==="win32"?";":":";next[key]=next[key].split(sep).filter(dir=>!/node_modules[\\/]\.bin[\\/]?$/i.test(dir)&&!/node-gyp-bin[\\/]?$/i.test(dir)).join(sep)}return{...next,[WORKER_ENV]:"1",[PARENT_PID_ENV]:String(parentPid)}}function defaultSpawnWorker(cliPath,env){const child=spawn(process.
|
|
18
|
+
execPath,[cliPath],{detached:true,stdio:"ignore",windowsHide:true,cwd:path.dirname(twpHomeDir(env)),env:workerEnv(env)});child.on("error",()=>{});child.unref()}function onStartup(version,deps={}){const env=deps.env??process.env;try{if(autoUpdateDisabledReason(env)!==null)return false;const cliPath=deps.cliPath===void 0?resolveCliPath():deps.cliPath;if(cliPath===null||isDevBuild(version)||classifyInstall(cliPath)==="source")return false;let state=readUpdateState(env);const notice=pickNotice(state,
|
|
19
|
+
version);if(notice!==null){const err=deps.err??(t=>void process.stderr.write(t));err(stripTerminalControls(notice.text));state=notice.mark(state);writeUpdateState(state,env)}if(!isCheckDue(state,deps.now??Date.now()))return false;(deps.spawnWorker??defaultSpawnWorker)(cliPath,env);return true}catch{return false}}function describeAutoUpdate(version,env=process.env){const disabled=autoUpdateDisabledReason(env);if(disabled!==null)return`\u7121\u52B9\uFF08${disabled}\uFF09`;const cliPath=resolveCliPath();
|
|
20
|
+
if(cliPath===null||isDevBuild(version))return"\u5BFE\u8C61\u5916\uFF08\u958B\u767A\u30D3\u30EB\u30C9\uFF09";const state=readUpdateState(env);const kind=state.install?.cli_path===cliPath?state.install.kind:classifyInstall(cliPath);switch(kind){case"npm-global":return"\u6709\u52B9\uFF08npm \u30B0\u30ED\u30FC\u30D0\u30EB\u5C0E\u5165\u30FB24\u6642\u9593\u3054\u3068\u306B\u78BA\u8A8D\u3057\u3001\u6B21\u56DE\u8D77\u52D5\u304B\u3089\u53CD\u6620\uFF09";case"npm-local":return state.install?.cli_path===cliPath?
|
|
21
|
+
"\u5BFE\u8C61\u5916\uFF08npm \u306E\u30B0\u30ED\u30FC\u30D0\u30EB\u5C0E\u5165\u3067\u306F\u306A\u3044\u305F\u3081\u3001\u6848\u5185\u306E\u307F\uFF09":"\u5224\u5B9A\u4E2D\uFF08\u6B21\u56DE\u306E\u8D77\u52D5\u3067 npm \u306E\u30B0\u30ED\u30FC\u30D0\u30EB\u5C0E\u5165\u304B\u78BA\u8A8D\u3057\u307E\u3059\uFF09";case"npx":return"\u5BFE\u8C61\u5916\uFF08npx \u304B\u3089\u5B9F\u884C\u3057\u3066\u3044\u308B\u305F\u3081\u3001\u6848\u5185\u306E\u307F\uFF09";case"pnpm":return"\u5BFE\u8C61\u5916\uFF08pnpm \u3067\u5C0E\u5165\u3057\u3066\u3044\u308B\u305F\u3081\u3001\u6848\u5185\u306E\u307F\uFF09";default:
|
|
22
|
+
return"\u5BFE\u8C61\u5916\uFF08\u30BD\u30FC\u30B9\u304B\u3089\u5B9F\u884C\u3057\u3066\u3044\u308B\u305F\u3081\uFF09"}}export{CHECK_INTERVAL_MS,DISABLE_ENV,WORKER_ENV,PARENT_PID_ENV,stateFilePath,lockFilePath,runDirPath,registerRunning,listRegisteredPids,readUpdateState,writeUpdateState,autoUpdateDisabledReason,sameNpmPath,classifyInstall,resolveCliPath,pickNotice,isCheckDue,workerEnv,onStartup,describeAutoUpdate};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{
|
|
3
|
+
import{isForceOnly,killProcessTree,system32}from"./chunk-N2UVRM3Z.js";import{MODES,applyPermissionMode,checkPermission,isModeId,setActiveModes}from"./chunk-BOBSH3QN.js";import{DEFAULT_MAX_TOKENS,emptyUsage}from"./chunk-FOFV2MNL.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import{configReadDirs,ensureTwpHome,twpHomeDir}from"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import fs from"fs";import path2 from"path";import os from"os";import{realpathSync}from"fs";import{homedir}from"os";import{dirname,isAbsolute,relative,resolve,sep}from"path";var PathDeniedError=class extends Error{constructor(message){super(message);this.name="PathDeniedError"}};function resolveToolPath(input,cwd,home=homedir()){if(typeof input!=="string"||input.trim()===""){throw new PathDeniedError("path must be a non-empty string")}const expanded=expandHome(input,home);const abs=isAbsolute(expanded)?resolve(expanded):resolve(cwd,expanded);const root=realOrSelf(resolve(cwd));assertInside(abs,resolve(cwd),abs);assertNotSecret(abs,home);const real=realOrSelf(abs);if(real!==
|
|
4
4
|
abs){assertInside(real,root,abs);assertNotSecret(real,home)}return abs}function realToolPath(input,cwd,home=homedir()){return realOrSelf(resolveToolPath(input,cwd,home))}function assertInside(target,root,reported){const rel=relative(root,target);const outside=rel===".."||rel.startsWith(`..${sep}`)||isAbsolute(rel);if(outside){throw new PathDeniedError(`path escapes the working directory (${reported}). Only paths under ${root} can be accessed.`)}}function realOrSelf(target){let current=target;const rest=[];
|
|
5
5
|
for(;;){try{const real=realpathSync(current);return rest.length===0?real:resolve(real,...rest.reverse())}catch{const parent=dirname(current);if(parent===current)return target;rest.push(current.slice(parent.length+1));current=parent}}}function assertNotSecret(absPath,home=homedir(),env=process.env){const reason=secretReason(absPath,home,env);if(reason!==null)throw new PathDeniedError(`refusing to access ${absPath}: ${reason}`)}function secretReason(absPath,_home=homedir(),env=process.env){const lower=absPath.
|
|
6
6
|
toLowerCase();const segments=lower.split(sep);const base=segments[segments.length-1]??"";const parent=segments[segments.length-2]??"";if(base===".env"||base.startsWith(".env."))return".env files are denied (design \xA77)";if(segments.includes(".ssh"))return"SSH key material is denied (design \xA77)";if(parent===".git"&&base==="config"){return".git/config is denied (it can hold a GitHub token in the remote URL)"}if(base===".netrc"||base==="_netrc"||base===".npmrc")return"credential files are deni\
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{
|
|
3
|
+
import{isTaskKey}from"./chunk-II5RVJQN.js";import{ApiError}from"./chunk-JKSXUBND.js";import{loadProjectConfig,loadUserConfig}from"./chunk-NERYSBA4.js";import{twpHomeDir}from"./chunk-RZVI6PMW.js";import{UsageError}from"./chunk-M3GWY6NT.js";import{ResolveError,isSafePathSegment,resolveProjectRef,safeProjectIdPolicy}from"./chunk-5QCAIKFE.js";var BACKLOG_BASE_PATH="/api/v2/integrations/backlog";function assertBacklogPathSegment(value,label){if(!isSafePathSegment(value)){throw new ResolveError(`${label}\u3068\u3057\u3066 URL \u306B\u5165\u308C\u3089\u308C\u306A\u3044\u5024\u304C\u30B5\u30FC\u30D0\u304B\u3089\u8FD4\u308A\u307E\u3057\u305F: ${JSON.stringify(value)}\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}return value}function backlogSpacePath(spaceId,suffix=""){assertBacklogPathSegment(spaceId,
|
|
4
4
|
"Backlog \u30B9\u30DA\u30FC\u30B9 ID");return`${BACKLOG_BASE_PATH}/${encodeURIComponent(spaceId)}${suffix}`}function idString(value){if(typeof value==="number"&&Number.isFinite(value))return String(value);if(typeof value==="string"&&value.trim()!=="")return value.trim();return null}function text(value){return typeof value==="string"&&value.trim()!==""?value.trim():null}function backlogSpaceAliases(spaceUrl){const aliases=[];const trimmed=spaceUrl.trim().replace(/\/+$/,"");if(trimmed==="")return aliases;
|
|
5
5
|
let host;try{host=new URL(trimmed).host}catch{host=trimmed.replace(/^\/+/,"").split("/")[0]??""}if(host==="")return aliases;aliases.push(host);const label=host.split(".")[0];if(label!==void 0&&label!==""&&label!==host)aliases.push(label);return aliases}function backlogSpaceRow(row){const url=text(row["space_url"]);return{id:idString(row["id"]),name:url,code:null,aliases:url!==null?backlogSpaceAliases(url):[]}}function backlogProjectRow(row){return{id:idString(row["id"]),name:text(row["name"]),code:text(
|
|
6
6
|
row["projectKey"])}}function backlogStatusRow(row){return{id:idString(row["id"]),name:text(row["name"]),code:null}}function backlogUserRow(row){return{id:idString(row["id"]),name:text(row["name"]),code:null,aliases:[text(row["userId"]),text(row["mailAddress"])].filter(v=>v!==null)}}var DEFAULT_LOOKUP_SCOPE="\u3053\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8";function fold(value){return value.trim().toLowerCase()}function keysOf(ref){return[ref.id,ref.code,ref.name,...ref.aliases??[]].filter(v=>typeof v==="string"&&v.trim()!=="").map(fold)}function describe(ref){return ref.code!==void 0&&ref.code!==null&&ref.code!==""&&ref.code!==ref.name?`${ref.name}\uFF08${ref.code}\uFF09`:ref.name}async function suggest(input,candidates){try{const{default:fuzzysort}=await import("./fuzzysort-DFVKV4B4.js");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{
|
|
3
|
+
import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import{isBoolishTrue}from"./chunk-5WGOHFAS.js";import{spawnSync as spawnSync2}from"child_process";import{spawnSync}from"child_process";import fs from"fs";import path from"path";function resolveDeps(d){return{platform:d.platform??process.platform,env:d.env??process.env,findExecutable:d.findExecutable??((name,env,platform)=>findExecutable(name,{env,platform})),readFileSync:d.readFileSync??(p=>fs.readFileSync(p,"utf8")),existsSync:d.existsSync??fs.existsSync,sizeOf:d.sizeOf??(p=>fs.statSync(p).size),nodePath:d.nodePath??process.execPath}}var MAX_SHIM_BYTES=64*1024;var DENIED_NODE_FLAGS=["--require","-r","--import","--loader","--experimental-loader","--env-file","--eval","\
|
|
4
4
|
-e","--print","-p","--inspect"];function deniedNodeFlag(arg){const name=arg.split("=")[0]??arg;if(name.startsWith("--inspect"))return true;return DENIED_NODE_FLAGS.includes(name)}function escapeRegExp(v){return v.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function parseCmdShim(text){const paths=[];const re=/"%~?dp0%?[\\/]*([^"]+)"/gi;for(let m=re.exec(text);m!==null;m=re.exec(text))paths.push(m[1]??"");for(const script of paths.filter(v=>/\.[cm]?js$/i.test(v))){const esc=escapeRegExp(script);const adjacent=new RegExp(
|
|
5
5
|
`"%_prog%"([^"]*)"%~?dp0%?[\\\\/]*${esc}"`,"i").exec(text)??new RegExp(`"%~?dp0%?[\\\\/]*node\\.exe"([^"]*)"%~?dp0%?[\\\\/]*${esc}"`,"i").exec(text);if(adjacent===null)continue;const middle=adjacent[1]??"";return{target:script,viaNode:true,nodeArgs:middle.trim().split(/\s+/).filter(a=>a!=="")}}const exe=paths.find(v=>/\.(exe|com)$/i.test(v)&&!/(^|[\\/])node\.exe$/i.test(v));if(exe!==void 0)return{target:exe,viaNode:false,nodeArgs:[]};return null}function resolveSpawnTarget(file,args,deps={}){const d=resolveDeps(
|
|
6
6
|
deps);if(d.platform!=="win32")return{ok:true,file,args:[...args],note:null};const hasSeparator=/[\\/]/.test(file);const isAbsolute=isWindowsDriveAbsolute(file);if(hasSeparator&&!isAbsolute){return{ok:false,reason:`${file} \u306F\u76F8\u5BFE\u30D1\u30B9\u3067\u3059\u3002bare name \u304B\u7D76\u5BFE\u30D1\u30B9\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044`}}const resolved=isAbsolute?file:d.findExecutable(file,d.env,d.platform);if(resolved===null||resolved===""){return{ok:false,reason:`${file}\
|
|
@@ -11,7 +11,7 @@ const dir=path.win32.dirname(resolved);if(path.win32.isAbsolute(shim.target)||/^
|
|
|
11
11
|
if(!shim.viaNode){return{ok:true,file:target,args:[...args],note:`${file} \u2192 ${resolved} \u2192 ${target}`}}const bad=shim.nodeArgs.filter(a=>!a.startsWith("-")||deniedNodeFlag(a));if(bad.length>0){return{ok:false,reason:`${resolved} \u304C node \u3078\u6E21\u305D\u3046\u3068\u3057\u3066\u3044\u308B\u5F15\u6570\u3092\u8A31\u53EF\u3067\u304D\u307E\u305B\u3093\uFF08${bad.join(" ")}\uFF09`}}const colocated=path.win32.join(dir,"node.exe");const prog=d.existsSync(colocated)?colocated:d.nodePath;return{
|
|
12
12
|
ok:true,file:prog,args:[...shim.nodeArgs,target,...args],note:`${file} \u2192 ${resolved}\uFF08cmd \u30B7\u30E0\u3092\u89E3\u6C7A: ${prog} ${target}\uFF09`}}function spawnSyncResolved(file,args,options,deps={},run=spawnSync){const target=resolveSpawnTarget(file,args,deps);if(!target.ok){return{pid:0,output:[],stdout:"",stderr:"",status:null,signal:null,error:new Error(target.reason)}}return run(target.file,target.args,options)}var DEFAULT_CLAUDE_LAUNCHER={bin:"claude-auto-switch",probe:["--help"],probeMatch:"^\\s*exec\\s",execArgs:["exec","--"],activeArgs:["active","--path"]};function detectClaudeAutoSwitch(bin=DEFAULT_CLAUDE_LAUNCHER.bin,run=spawnSync2,lookup={}){const r=spawnSyncResolved(bin,[...DEFAULT_CLAUDE_LAUNCHER.probe],{encoding:"utf8",timeout:1e4},lookup,run);if(r.error!==void 0||r.status!==0)return null;const help=`${r.stdout??""}${r.stderr??""}`;return{bin,hasExec:new RegExp(DEFAULT_CLAUDE_LAUNCHER.probeMatch,
|
|
13
13
|
"m").test(help)}}function wrapWithAutoSwitch(cas,file,args){if(cas===null||!cas.hasExec)return{file,args:[...args]};return{file:cas.bin,args:[...DEFAULT_CLAUDE_LAUNCHER.execArgs,file,...args]}}function activeSlotPath(cas,run=spawnSync2,lookup={}){if(cas===null)return null;const r=spawnSyncResolved(cas.bin,[...DEFAULT_CLAUDE_LAUNCHER.activeArgs],{encoding:"utf8",timeout:1e4},lookup,run);if(r.error!==void 0||r.status!==0)return null;const out=(r.stdout??"").trim();return out===""?null:out}function isClaudeAi(ai){
|
|
14
|
-
return ai==="claude"||!["gemini","codex","copilot"].includes(ai)}import{createHash}from"crypto";import fs2 from"fs";var
|
|
14
|
+
return ai==="claude"||!["gemini","codex","copilot"].includes(ai)}import{createHash}from"crypto";import fs2 from"fs";var EXCLUSIVE_SKILL_FLOOR=["support-triage"];function normalizeSkillName(skill){return skill.trim().replace(/^twp-/,"")}var stripPrefix=normalizeSkillName;function skillOfItem(item){const explicit=(item.ai_skill??"").trim();if(explicit)return stripPrefix(explicit);const m=/\/twp-([a-z0-9-]+)/.exec(item.prompt??"");return m?.[1]??""}function ageMinutesOf(item,now){for(const raw of[item.started_at,item.updated_at,item.dequeued_at,item.created_at]){if(!raw)continue;const ts=Date.parse(raw);if(Number.
|
|
15
15
|
isNaN(ts))continue;return Math.floor((now.getTime()-ts)/6e4)}return null}function exclusiveInflightEntries(groups,opts){const now=opts.now??new Date;const staleMinutes=opts.staleHours*60;const bySkill=new Map;for(const group of groups){for(const item of group.items){const skill=skillOfItem(item);if(!skill)continue;const status=group.status==="mixed"?item.status??"unknown":group.status;const ageMinutes=ageMinutesOf(item,now);if(status==="processing"&&ageMinutes!==null&&ageMinutes>staleMinutes)continue;
|
|
16
16
|
const entry={skill,status,runner:item.runner_id??"-",ageMinutes};const prev=bySkill.get(skill);if(!prev||(entry.ageMinutes??-1)>(prev.ageMinutes??-1))bySkill.set(skill,entry)}}return[...bySkill.values()].sort((a,b)=>a.skill.localeCompare(b.skill))}function formatExclusiveEntry(entry){const age=entry.ageMinutes===null?"\u4E0D\u660E":`${entry.ageMinutes}\u5206`;return`${entry.skill} status=${entry.status} runner=${entry.runner} \u7D4C\u904E=${age}`}import path2 from"path";var BUILTIN={primary_rotation:{complex:["claude"],search:["claude"],simple:["claude"]},fallback_chains:{complex:["claude","codex"],search:["codex","gemini","copilot","claude"],simple:["codex","gemini","copilot","claude"]}};function usesBedrock(env){return isBoolishTrue(env.CLAUDE_CODE_USE_BEDROCK)}var DEFAULT_CATEGORY="complex";var EFFORTS=new Set(["low","medium","high","xhigh","max"]);var MAX_COOLDOWN_SEC=3600;var DEFAULT_COOLDOWN_SEC=300;var AI_UNUSABLE_COOLDOWN_SEC=1800;
|
|
17
17
|
function loadAiConfig(inline,file,workspace){const read=readAiConfigFile(file,workspace);const warnings=read.problem===null?[]:[read.problem.startsWith("ai_config_file \u3092\u8AAD\u3081\u307E\u305B\u3093")?`${read.problem}
|
|
@@ -33,19 +33,4 @@ return Number.isInteger(cfg)&&(cfg??0)>=0?cfg:0}cooldownDefaultSec(ai,env=proces
|
|
|
33
33
|
`${ai}@${slot}`}hasCooldownFor(ai,now=Date.now()){for(const[key,until]of this.limitedUntil){if(until<=now)continue;if(key===ai||key.startsWith(`${ai}@`))return true}return false}isRateLimited(ai,now=Date.now(),slot=null){return(this.limitedUntil.get(this.limitKey(ai,slot))??0)>now}markRateLimited(ai,seconds,now=Date.now(),slot=null){const capped=Math.min(Math.max(Math.trunc(seconds),1),MAX_COOLDOWN_SEC);this.limitedUntil.set(this.limitKey(ai,slot),now+capped*1e3);return capped}markAiUnusable(ai,now=Date.
|
|
34
34
|
now()){this.unusableUntil.set(ai,now+AI_UNUSABLE_COOLDOWN_SEC*1e3);return AI_UNUSABLE_COOLDOWN_SEC}isAiUnusable(ai,now=Date.now()){return(this.unusableUntil.get(ai)??0)>now}minCooldownRemainingSec(now=Date.now()){let min=null;for(const until of this.limitedUntil.values()){if(until<=now)continue;const remaining=Math.ceil((until-now)/1e3);if(min===null||remaining<min)min=remaining}return min}};var HIGH_RISK_LABEL=/本番|リリース|認証|認可|権限|セキュリティ|課金|給与|勤怠計算/;
|
|
35
35
|
var TIER_ALIASES=new Set(["opus","sonnet","haiku","default"]);function modelFitsRoute(model,env=process.env){if(TIER_ALIASES.has(model.trim().toLowerCase()))return true;if(model.startsWith("arn:aws:bedrock:"))return usesBedrock(env);const bedrockShaped=/(^|[./])anthropic\./.test(model);return usesBedrock(env)?bedrockShaped:!bedrockShaped}function isUsableModelId(value){return value!==""&&!value.startsWith("-")&&/^[A-Za-z0-9._:\-/[\]]+$/.test(value)}function stripPrefix2(skill){return skill.startsWith(
|
|
36
|
-
"twp-")?skill.slice(4):skill}
|
|
37
|
-
platform,now:deps.now??Date.now,launcherBin:nonEmptyBin(deps.launcherBin)??DEFAULT_CLAUDE_LAUNCHER.bin}}function nonEmptyBin(value){const t=value?.trim();return t===void 0||t===""?void 0:t}var PROBE_TIMEOUT_MS=1e4;function oneLine(text){return text.replace(/\s+/g," ").trim()}function claudeConfigDir(d){const lookup={env:d.env,platform:d.platform};const bin=nonEmptyBin(d.launcherBin)??DEFAULT_CLAUDE_LAUNCHER.bin;const cas=detectClaudeAutoSwitch(bin,d.run,lookup);if(cas!==null){const active=activeSlotPath(
|
|
38
|
-
cas,d.run,lookup);if(active!==null){return{dir:active,via:`${bin} ${DEFAULT_CLAUDE_LAUNCHER.activeArgs.join(" ")}`}}}const explicit=d.env.CLAUDE_CONFIG_DIR?.trim();if(explicit!==void 0&&explicit!=="")return{dir:explicit,via:"CLAUDE_CONFIG_DIR"};return{dir:joinFor(d.platform)(d.homedir(),".claude"),via:"\u65E2\u5B9A\uFF08~/.claude\uFF09"}}var CLAUDE_AUTH_ENV=[{key:"ANTHROPIC_API_KEY",label:"ANTHROPIC_API_KEY",boolish:false},{key:"ANTHROPIC_AUTH_TOKEN",label:"ANTHROPIC_AUTH_TOKEN",boolish:false},{
|
|
39
|
-
key:"CLAUDE_CODE_OAUTH_TOKEN",label:"CLAUDE_CODE_OAUTH_TOKEN",boolish:false},{key:"AWS_BEARER_TOKEN_BEDROCK",label:"AWS_BEARER_TOKEN_BEDROCK",boolish:false},{key:"CLAUDE_CODE_USE_BEDROCK",label:"CLAUDE_CODE_USE_BEDROCK\uFF08AWS \u8CC7\u683C\u60C5\u5831\u3067\u52D5\u304D\u307E\u3059\uFF09",boolish:true},{key:"CLAUDE_CODE_USE_VERTEX",label:"CLAUDE_CODE_USE_VERTEX\uFF08GCP \u8CC7\u683C\u60C5\u5831\u3067\u52D5\u304D\u307E\u3059\uFF09",boolish:true}];function envEnabled(raw,boolish){if(boolish)return isBoolishTrue(
|
|
40
|
-
raw);return(raw??"").trim()!==""}function keychainService(configDir,homedir){const norm=configDir.normalize("NFC");if(norm===path3.posix.join(homedir,".claude").normalize("NFC"))return"Claude Code-credentials";return`Claude Code-credentials-${createHash2("sha256").update(norm,"utf8").digest("hex").slice(0,8)}`}function probeMacKeychain(d,configDir){const account=d.env.USER?.trim()??"";const args=["find-generic-password","-s",keychainService(configDir,d.homedir())];if(account!=="")args.push("-a",
|
|
41
|
-
account);try{const r=d.run("/usr/bin/security",args,{encoding:"utf8",timeout:PROBE_TIMEOUT_MS,stdio:"ignore"});return r.error===void 0&&r.status===0}catch{return false}}function detectClaude(d){for(const e of CLAUDE_AUTH_ENV){if(envEnabled(d.env[e.key],e.boolish)){return{auth:"authenticated",detail:`${e.label} \u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059`,blockedReason:null}}}const{dir,via}=claudeConfigDir(d);const file=joinFor(d.platform)(dir,".credentials.json");let raw;try{if(!d.existsSync(
|
|
42
|
-
file))throw new Error("ENOENT");raw=d.readFileSync(file)}catch{if(d.platform==="darwin"){if(probeMacKeychain(d,dir)){return{auth:"authenticated",detail:oneLine(`macOS Keychain \u306B\u8CC7\u683C\u60C5\u5831\u304C\u3042\u308A\u307E\u3059\uFF08${dir}\uFF09`),blockedReason:null}}return{auth:"unknown",detail:oneLine(`\u8CC7\u683C\u60C5\u5831\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF08${dir}\uFF0F${via}\uFF09\u3002macOS \u306F Keychain \u306B\u4FDD\u5B58\u3059\u308B\u305F\u3081\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u306F\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093`),
|
|
43
|
-
blockedReason:null}}return{auth:"unauthenticated",detail:oneLine(`\u8CC7\u683C\u60C5\u5831\u304C\u3042\u308A\u307E\u305B\u3093\uFF08${file}\uFF0F${via}\uFF09\u3002'claude' \u3092\u4E00\u5EA6\u8D77\u52D5\u3057\u3066\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044`),blockedReason:null}}let expiresAt;let hasToken;try{const parsed=JSON.parse(raw);hasToken=typeof parsed.claudeAiOauth?.accessToken==="string"&&parsed.claudeAiOauth.accessToken!=="";expiresAt=parsed.claudeAiOauth?.refreshTokenExpiresAt}catch{
|
|
44
|
-
return{auth:"unknown",detail:oneLine(`\u8CC7\u683C\u60C5\u5831\u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08${file}\uFF09\u3002\u30D5\u30A1\u30A4\u30EB\u304C\u58CA\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059`),blockedReason:null}}if(!hasToken){return{auth:"unauthenticated",detail:oneLine(`\u8CC7\u683C\u60C5\u5831\u306B\u30C8\u30FC\u30AF\u30F3\u304C\u3042\u308A\u307E\u305B\u3093\uFF08${file}\uFF09`),blockedReason:null}}if(typeof expiresAt==="number"&&expiresAt>
|
|
45
|
-
0&&expiresAt<d.now()){return{auth:"unauthenticated",detail:oneLine(`\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u30C8\u30FC\u30AF\u30F3\u304C\u5931\u52B9\u3057\u3066\u3044\u307E\u3059\uFF08${dir}\uFF09\u3002\u518D\u30ED\u30B0\u30A4\u30F3\u304C\u5FC5\u8981\u3067\u3059`),blockedReason:null}}return{auth:"authenticated",detail:oneLine(`\u8CC7\u683C\u60C5\u5831\u304C\u3042\u308A\u307E\u3059\uFF08${dir}\uFF0F${via}\uFF09`),blockedReason:null}}function detectCodex(d,binPath){let r;try{r=spawnSyncResolved(binPath,
|
|
46
|
-
["login","status"],{encoding:"utf8",timeout:PROBE_TIMEOUT_MS},{env:d.env,platform:d.platform},d.run)}catch(err){return{auth:"unknown",detail:oneLine(`codex login status \u3092\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\uFF08${err.message}\uFF09`),blockedReason:null}}if(r.error!==void 0){return{auth:"unknown",detail:oneLine(`codex login status \u3092\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\uFF08${r.error.message}\uFF09`),blockedReason:null}}if(r.status===null){return{auth:"unknown",detail:`codex\
|
|
47
|
-
login status \u304C ${PROBE_TIMEOUT_MS/1e3} \u79D2\u4EE5\u5185\u306B\u7D42\u308F\u308A\u307E\u305B\u3093\u3067\u3057\u305F`,blockedReason:null}}if(r.status===0)return{auth:"authenticated",detail:"codex login status: \u30ED\u30B0\u30A4\u30F3\u6E08\u307F",blockedReason:null};return{auth:"unauthenticated",detail:`codex login status \u304C\u7D42\u4E86\u30B3\u30FC\u30C9 ${r.status} \u3092\u8FD4\u3057\u307E\u3057\u305F\u3002'codex login' \u3067\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044`,
|
|
48
|
-
blockedReason:null}}function detectPending(ai){return{auth:"unknown",detail:"\u30ED\u30B0\u30A4\u30F3\u5224\u5B9A\u306E\u65B9\u6CD5\u304C\u672A\u78BA\u5B9A\u3067\u3059",blockedReason:`${ai} \u306F\u7121\u4EBA\u5B9F\u884C\u3067\u306E\u8A8D\u8A3C\u72B6\u614B\u3092\u5224\u5B9A\u3059\u308B\u65B9\u6CD5\u304C\u672A\u78BA\u5B9A\u306E\u305F\u3081\u9078\u629E\u3067\u304D\u307E\u305B\u3093`}}function detectAiClis(deps={}){const d=resolve(deps);return DETECTABLE_AIS.map(ai=>{const binPath=findOnPath(ai,d);
|
|
49
|
-
if(binPath===null){return{ai,installed:false,binPath:null,auth:"unknown",detail:"PATH \u306B\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF08\u672A\u5C0E\u5165\uFF09",blockedReason:null}}const state=ai==="claude"?detectClaude(d):ai==="codex"?detectCodex(d,binPath):detectPending(ai);return{ai,installed:true,binPath,...state}})}function formatDetection(d,index){const selectable=isSelectable(d);const mark=selectable?d.auth==="authenticated"?"\u2705":"\u2754":" ";const num=index===null?" ":`${String(
|
|
50
|
-
index).padStart(2)}.`;const state=!d.installed?"\u672A\u5C0E\u5165":d.auth==="authenticated"?"\u30ED\u30B0\u30A4\u30F3\u6E08\u307F":d.auth==="unauthenticated"?"\u672A\u30ED\u30B0\u30A4\u30F3":"\u672A\u5224\u5B9A";const blocked=d.blockedReason===null?"":`
|
|
51
|
-
\u9078\u629E\u3067\u304D\u307E\u305B\u3093: ${oneLine(d.blockedReason)}`;return`${num} ${mark} ${d.ai.padEnd(8)} ${state.padEnd(8)} ${oneLine(d.detail)}${blocked}`}export{isBoolishTrue,resolveSpawnTarget,spawnSyncResolved,DEFAULT_CLAUDE_LAUNCHER,detectClaudeAutoSwitch,wrapWithAutoSwitch,activeSlotPath,isClaudeAi,normalizeSkillName,skillOfItem,exclusiveInflightEntries,formatExclusiveEntry,usesBedrock,loadAiConfig,reloadAiConfig,AiConfig,modelFitsRoute,isUsableModelId,isDetectableAi,isSelectable,resolveDetectDeps,claudeConfigDir,detectAiClis,formatDetection};
|
|
36
|
+
"twp-")?skill.slice(4):skill}export{resolveSpawnTarget,spawnSyncResolved,DEFAULT_CLAUDE_LAUNCHER,detectClaudeAutoSwitch,wrapWithAutoSwitch,activeSlotPath,isClaudeAi,normalizeSkillName,skillOfItem,exclusiveInflightEntries,formatExclusiveEntry,usesBedrock,loadAiConfig,reloadAiConfig,AiConfig,modelFitsRoute,isUsableModelId};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{stringWidth}from"./chunk-WVS4W5FY.js";import{
|
|
4
|
-
|
|
3
|
+
import{stringWidth}from"./chunk-WVS4W5FY.js";import{parseOperationArgs}from"./chunk-O52CUEDO.js";import{GLOBAL_OPTIONS_HELP,HELP_TOKEN}from"./chunk-FKIZ5ZJU.js";import{AuthSession,NotLoggedInError,SessionExpiredError,loadCredentials}from"./chunk-XNLIEUAW.js";import{Resolver,requireDefaultProject}from"./chunk-MIMDLO52.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-JKSXUBND.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{effectiveApiUrl,loadUserConfig,
|
|
4
|
+
resolveConfiguredOutput,resolveProfile}from"./chunk-NERYSBA4.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{DEFAULT_MAX_ITEMS,DEFAULT_MAX_PAGES,nextPageNotes,positiveInteger,shellQuote}from"./chunk-2VISRLWS.js";import{ApiResponseError,EXIT_API_CLIENT,EXIT_API_SERVER,EXIT_AUTH,EXIT_FAILURE,EXIT_OK,EXIT_USAGE,NetworkError,UsageError}from"./chunk-M3GWY6NT.js";import{ResolveError}from"./chunk-5QCAIKFE.js";import fs from"fs";import path from"path";var SENSITIVE_HEADERS=new Set(["authorization","proxy-authorization","cookie","set-cookie","x-api-key","x-auth-token","x-vercel-protection-bypass"]);var REDACTED="***\uFF08\u4F0F\u5B57\uFF09";var SECRET_KEY_PATTERN="[A-Za-z0-9_-]*(?:token|secret|password|passwd|api[_-]?key|credential|signature)[A-Za-z0-9_-]*";var NOT_SECRET_FLAGS="(?:starting-token)";function redactSecrets(text){return text.replace(/\bBearer\s+[^\s"'`,;)\]}]+/gi,`Bearer ${REDACTED}`).replace(new RegExp(`("${SECRET_KEY_PATTERN}"\\\
|
|
5
5
|
s*:\\s*)"(?:[^"\\\\]|\\\\.)*"`,"gi"),`$1"${REDACTED}"`).replace(new RegExp(`([?&]${SECRET_KEY_PATTERN}=)[^&\\s"'\`,;)\\]}]+`,"gi"),`$1${REDACTED}`).replace(new RegExp(`(--(?!${NOT_SECRET_FLAGS}(?:=|\\s))${SECRET_KEY_PATTERN}(?:=|\\s+))('[^']*'|"[^"]*"|[A-Za-z0-9_.~+/=|:%-]+)`,"gi"),`$1${REDACTED}`)}var SECRET_KEY_NAME=new RegExp(`^${SECRET_KEY_PATTERN}$`,"i");function redactSecretValues(value){if(Array.isArray(value))return value.map(item=>redactSecretValues(item));if(value!==null&&typeof value===
|
|
6
6
|
"object"){const out={};for(const[key,item]of Object.entries(value)){out[key]=SECRET_KEY_NAME.test(key)?REDACTED:redactSecretValues(item)}return out}return value}function formatHeaders(headers){if(!headers)return[];const entries=headers instanceof Headers?[...headers.entries()]:Array.isArray(headers)?headers:Object.entries(headers);return entries.map(([name,value])=>{const shown=SENSITIVE_HEADERS.has(name.toLowerCase())?REDACTED:redactSecrets(String(value));return` ${name.toLowerCase()}: ${shown}`})}
|
|
7
7
|
var BODY_LIMIT=4e3;function formatBody(raw){const safe=redactSecrets(stripTerminalControls(raw));return safe.length>BODY_LIMIT?`${safe.slice(0,BODY_LIMIT)}
|
|
@@ -31,7 +31,7 @@ ${operationSection}${subSection}
|
|
|
31
31
|
${GLOBAL_OPTIONS_HELP}
|
|
32
32
|
`}function renderOperationHelp(op,path2){const sections=[`twp ${path2} ${op.name} \u2014 ${op.summary}`,"","\u4F7F\u3044\u65B9:",` ${op.usage}`];if(op.description!==void 0){sections.push("",...op.description.split("\n"))}if(op.destructive===true){sections.push("","\u26A0 \u7834\u58CA\u7684\u306A\u64CD\u4F5C\u3067\u3059\u3002\u5B9F\u884C\u3059\u308B\u306B\u306F --yes \u304C\u5FC5\u8981\u3067\u3059\u3002")}if(op.flags.length>0){sections.push("","\u30AA\u30D7\u30B7\u30E7\u30F3:",alignedList(op.flags.
|
|
33
33
|
map(flag=>[flag.takesValue?`${flag.name} ${flag.placeholder??"<\u5024>"}`:flag.name,flag.summary])))}sections.push("",GLOBAL_OPTIONS_HELP,"");return sections.join("\n")}function renderUnknownOperation(resource,path2,attempted){const names=[...resource.operations.map(op=>op.name),...subresourcesOf(resource).map(sub=>`${sub.name} <\u64CD\u4F5C>`)].join(" / ");return attempted===void 0?`twp ${path2} \u306B\u306F\u64CD\u4F5C\u306E\u6307\u5B9A\u304C\u5FC5\u8981\u3067\u3059\uFF08${names}\uFF09\u3002\u8A73\u3057\u304F\u306F twp ${path2}\
|
|
34
|
-
${HELP_TOKEN}`:`twp ${path2} \u306B\u300C${attempted}\u300D\u3068\u3044\u3046\u64CD\u4F5C\u306F\u3042\u308A\u307E\u305B\u3093\uFF08${names}\uFF09\u3002\u8A73\u3057\u304F\u306F twp ${path2} ${HELP_TOKEN}`}var LOADERS={backlog:async()=>(await import("./backlog-
|
|
34
|
+
${HELP_TOKEN}`:`twp ${path2} \u306B\u300C${attempted}\u300D\u3068\u3044\u3046\u64CD\u4F5C\u306F\u3042\u308A\u307E\u305B\u3093\uFF08${names}\uFF09\u3002\u8A73\u3057\u304F\u306F twp ${path2} ${HELP_TOKEN}`}var LOADERS={backlog:async()=>(await import("./backlog-NV7Z76R3.js")).backlogDomain,project:async()=>(await import("./project-BATJQR3F.js")).projectDomain,task:async()=>(await import("./task-6QUH5OXF.js")).taskDomain};async function loadDomain(name){return LOADERS[name]()}var writeOut=text=>void process.stdout.write(text);var writeErr=text=>void process.stderr.write(text);function line(text){return text===""?"":text.endsWith("\n")?text:`${text}
|
|
35
35
|
`}function outputValue(operation,format,body){return format==="json"?operation.raw(body):operation.summarize(body)}function requiresYes(operation,yes){return operation.destructive===true&&!yes}function exitCodeForStatus(status){if(status===401)return EXIT_AUTH;if(status===429)return EXIT_API_SERVER;if(status>=400&&status<500)return EXIT_API_CLIENT;return EXIT_API_SERVER}function exitCodeFor(err){if(err instanceof UsageError)return EXIT_USAGE;if(err instanceof NotLoggedInError||err instanceof SessionExpiredError)
|
|
36
36
|
return EXIT_AUTH;if(err instanceof ApiError)return exitCodeForStatus(err.status);if(err instanceof ApiResponseError||err instanceof NetworkError)return EXIT_API_SERVER;if(err instanceof ResolveError){return err.status===null?EXIT_API_SERVER:exitCodeForStatus(err.status)}return EXIT_FAILURE}function safeText(text){return redactSecrets(stripTerminalControls(text))}function reportError(err,format,code){const message=safeText(err instanceof Error?err.message:String(err));const rawHint=err instanceof
|
|
37
37
|
UsageError?err.hint:void 0;const hint=rawHint!==void 0?safeText(rawHint):void 0;if(format==="json"){const body={code,message};if(err instanceof ApiError)body["status"]=err.status;if(err instanceof ResolveError&&err.status!==null)body["status"]=err.status;if(hint!==void 0)body["hint"]=hint;writeErr(`${JSON.stringify({error:body},null,2)}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{
|
|
3
|
+
import{httpFetch}from"./chunk-J7QYPKVK.js";import{ensureTwpHome,twpHomeDir}from"./chunk-RZVI6PMW.js";import fs2 from"fs";import path from"path";import fs from"fs";import{setTimeout as sleep}from"timers/promises";var POLL_MS=100;var STALE_MS=3e4;var DEFAULT_TIMEOUT_MS=STALE_MS+5e3;var LockTimeoutError=class extends Error{};async function withFileLock(lockPath,fn,timeoutMs=DEFAULT_TIMEOUT_MS){const deadline=Date.now()+timeoutMs;for(;;){try{const fd=fs.openSync(lockPath,"wx");fs.writeSync(fd,`${process.pid}
|
|
4
4
|
`);fs.closeSync(fd);break}catch(err){if(err.code!=="EEXIST")throw err;let stale=false;try{stale=Date.now()-fs.statSync(lockPath).mtimeMs>STALE_MS}catch{}if(stale){fs.rmSync(lockPath,{force:true});continue}if(Date.now()>=deadline){throw new LockTimeoutError(`\u30ED\u30C3\u30AF\u306E\u53D6\u5F97\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F: ${lockPath}
|
|
5
5
|
\u5225\u306E twp \u30D7\u30ED\u30BB\u30B9\u304C\u8A8D\u8A3C\u60C5\u5831\u3092\u66F4\u65B0\u4E2D\u306E\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u6B8B\u9AB8\u306A\u3089\u524A\u9664\u3057\u3066\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}await sleep(POLL_MS)}}try{return await fn()}finally{fs.rmSync(lockPath,{force:true})}}var CredentialPermissionError=class extends Error{};function credentialsPath(env=process.env){return path.join(twpHomeDir(env),"credentials.json")}function credentialsLockPath(env=process.env){return path.join(twpHomeDir(env),"credentials.lock")}async function withCredentialsLock(env,fn){ensureTwpHome(env);return withFileLock(credentialsLockPath(env),fn)}function assertDirPrivate(dir){if(process.platform==="win32")return;let st;try{st=fs2.lstatSync(dir)}catch{return}if(st.isSymbolicLink()){throw new CredentialPermissionError(
|
|
6
6
|
`${dir} \u304C\u30B7\u30F3\u30DC\u30EA\u30C3\u30AF\u30EA\u30F3\u30AF\u3067\u3059\u3002\u8A8D\u8A3C\u60C5\u5831\u306E\u7F6E\u304D\u5834\u6240\u306F\u30EA\u30F3\u30AF\u306B\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
|