@tocca-systems/twp-cli 0.22.0 → 0.23.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.
@@ -11,6 +11,12 @@
11
11
  `CHANGELOG.md` に残してあります。顧客向けの履歴は public 公開以降を対象とします。
12
12
  -->
13
13
 
14
+ ## 0.23.0
15
+
16
+ 会話の中で AI が TWP のデータを調べて使えるようになりました。AI は必要な操作を検索し、内容を確かめてから実行します。TWP のデータを読む・書く操作は、実行前に確認が表示されます(削除は毎回確認します)。
17
+
18
+ プロジェクトコードに小文字や空白を使っている場合でも、エージェントループがタスクの進み具合を正しく読み取れるようになりました。タスクが先に進んでいるのに同じ作業の再開が止められる、リリースを止めている不具合の修正が後回しになる、といったことが起きなくなります。
19
+
14
20
  ## 0.22.0
15
21
 
16
22
  AI が git の差分や履歴を読むときに、リポジトリ側で設定された外部の差分表示コマンドを実行しないようになりました。信用できないリポジトリで「変更点を見て」と頼んだだけで、そのリポジトリが仕込んだコマンドが動いてしまうことを防ぎます。差分そのものは通常どおり表示されます。
package/README.md CHANGED
@@ -389,14 +389,14 @@ mode: dev
389
389
  "permissions": {
390
390
  "allow": ["Bash(git status:*)", "Bash(npm test)", "Write(src/**)", "git(log:*)"],
391
391
  "ask": ["Bash(git push:*)"],
392
- "deny": ["Bash(rm:*)", "twp_delete_task"]
392
+ "deny": ["Bash(rm:*)", "twp_delete_project-task"]
393
393
  }
394
394
  }
395
395
  ```
396
396
 
397
397
  | 書き方 | 意味 |
398
398
  |---|---|
399
- | `Bash` / `twp_update_task` | そのツール全体 |
399
+ | `Bash` / `twp_update_project-task` | そのツール全体 |
400
400
  | `Bash(git status:*)` | `git status` で始まるコマンド(語の区切りで一致) |
401
401
  | `Bash(npm test)` | そのコマンドと完全一致 |
402
402
  | `Write(src/**)` / `Edit(src/*.ts)` / `Read(~/notes/**)` | パスの glob(素の相対と `/` 始まりは作業ディレクトリ基準・`//` 始まりは絶対パス・`~/` はホーム)。`Edit` は `write_file` も含む |
@@ -414,7 +414,8 @@ mode: dev
414
414
  - **拒否ルールは「よくある書き方を止める網」であって、書いたコマンドを確実に止める境界ではない。** `sudo rm` `/bin/rm` `then rm` `$(rm …)` のような書き方には当たるが、`find -exec rm` のように引数の中から起動するものは拾えない。確実に止めたいならツールごと拒否する(`Bash`)か、業務・プランモードを使う
415
415
  - `Read(...)` の拒否は `grep` / `glob` にも効くが、**探索の起点がその範囲の中にあるときだけ**(リポジトリ全体を起点にした `grep` は、拒否した範囲の中まで読む)。確実に読ませないなら `Read` ごと拒否するか業務・プランモードを使う
416
416
  - 設定ファイルが読めない間は、読み取りも含めて**すべての自動許可が確認に変わる**(`-p` では確認できないので拒否になる)
417
- - `twp_call`(ツールを名前で呼ぶメタツール)は**中で実行されるツールの名前**で判定するよう権限エンジン側は用意してある。`twp_call` そのものを許可しても何も緩まない。**ただし `twp_call` 自体はまだ無い**(今後のバージョンで追加)
417
+ - `twp_call`(ツールを名前で呼ぶメタツール)は**中で実行されるツールの名前**(例: `twp_list_project-task`)で判定する。`twp_call` そのものを許可しても何も緩まない。TWP API のツールは読み取りも含めて既定で確認が出る(`-p` では拒否になる)ので、確認なしで使わせたいツールは名前で許可する(例: `--allowed-tools twp_list_project-task`)。**削除系(`destructive`)は許可ルールがあっても毎回確認する**
418
+ - モデルが TWP を調べる手順は `twp_search_tools`(名前と1行説明だけ)→ `twp_describe_tools`(スキーマ)→ `twp_call`(実行)。カタログはパッケージ同梱のコマンドモデルで、ネットワークに取りに行かない。同じドメインを続けて使うときは `twp_mount` で次のターンから常駐させられる
418
419
 
419
420
  ### 承認画面
420
421
 
@@ -1,26 +1,14 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{readBody}from"./chunk-QVXZEUKN.js";import{NO_REDACT_FLAG,NO_REDACT_NOTICE,exitCodeFor,fetchAllPages,reportError}from"./chunk-RKJ6B2KL.js";import{redactSecretValues,renderOutput,withDebug}from"./chunk-3XG457E3.js";import{parseOperationArgs,repeatedValues}from"./chunk-O52CUEDO.js";import"./chunk-JB27KNCX.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-JKSXUBND.js";import"./chunk-II5RVJQN.js";import{DEFAULT_MAX_ITEMS,DEFAULT_MAX_PAGES,envelopePaging,
4
- positiveInteger,readEnvelopeCursor,shellQuote}from"./chunk-2VISRLWS.js";import"./chunk-X4RS5VBH.js";import{GLOBAL_OPTIONS_HELP}from"./chunk-TAN5I2DP.js";import{HELP_TOKEN}from"./chunk-PEGUHUTD.js";import"./chunk-QQRJLH6B.js";import{AuthSession,NotLoggedInError,SessionExpiredError,loadCredentials}from"./chunk-XNLIEUAW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{effectiveApiUrl,resolveConfiguredOutput,resolveProfile}from"./chunk-NERYSBA4.js";
5
- import"./chunk-RZVI6PMW.js";import{OUTPUT_FORMATS,resolveOutputFormat}from"./chunk-K2ONOH3L.js";import"./chunk-WVS4W5FY.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{evaluateQuery}from"./chunk-E4H22AO5.js";import{EXIT_OK,NetworkError,UsageError}from"./chunk-M3GWY6NT.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
- 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
- \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;
8
- if(!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(domain)){throw new CommandModelMissingError(`\u30C9\u30E1\u30A4\u30F3\u540D\u3068\u3057\u3066\u4E0D\u6B63\u3067\u3059: ${domain}`)}const file=await readJson(`${domain}.json`);if(typeof file?.domain!=="string"||!Array.isArray(file?.operations)){throw new CommandModelMissingError(`${domain}.json \u306E\u5F62\u304C\u9055\u3044\u307E\u3059\uFF08domain / operations \u304C\u8AAD\u3081\u307E\u305B\u3093\uFF09`)}domainCache.set(domain,file);return file}var MIN_SEGMENT_CHARS=3;var parsedCache=new WeakMap;function splitSegments(path){return path.split("/").filter(segment=>segment!=="")}function parseRoutes(routes){const cached=parsedCache.get(routes);if(cached!==void 0)return cached;const parsed=[];for(const[key,domain]of Object.entries(routes.routes)){const space=key.indexOf(" ");if(space<=0)continue;const template=key.slice(space+1);parsed.push({method:key.slice(0,space),template,domain,segments:splitSegments(template).map(segment=>/^\{[^/{}]+\}$/.
3
+ import{CommandModelMissingError,MAX_REPORTED_VIOLATIONS,loadCommandModelDomain,loadCommandModelRoutes,validateBody,validateQuery}from"./chunk-NZ7WI4RZ.js";import{readBody}from"./chunk-QVXZEUKN.js";import{NO_REDACT_FLAG,NO_REDACT_NOTICE,exitCodeFor,fetchAllPages,reportError}from"./chunk-7LTTKKQA.js";import{renderOutput}from"./chunk-APYYF7H6.js";import{redactSecretValues,withDebug}from"./chunk-EQWW2F5V.js";import{parseOperationArgs,repeatedValues}from"./chunk-O52CUEDO.js";
4
+ import"./chunk-JB27KNCX.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-JKSXUBND.js";import"./chunk-II5RVJQN.js";import{DEFAULT_MAX_ITEMS,DEFAULT_MAX_PAGES,envelopePaging,positiveInteger,readEnvelopeCursor,shellQuote}from"./chunk-2VISRLWS.js";import"./chunk-X4RS5VBH.js";import{GLOBAL_OPTIONS_HELP}from"./chunk-TAN5I2DP.js";import{HELP_TOKEN}from"./chunk-PEGUHUTD.js";import"./chunk-QQRJLH6B.js";import{AuthSession,NotLoggedInError,SessionExpiredError,
5
+ loadCredentials}from"./chunk-XNLIEUAW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{effectiveApiUrl,resolveConfiguredOutput,resolveProfile}from"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import{OUTPUT_FORMATS,resolveOutputFormat}from"./chunk-K2ONOH3L.js";import"./chunk-WVS4W5FY.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{evaluateQuery}from"./chunk-E4H22AO5.js";import{EXIT_OK,NetworkError,UsageError}from"./chunk-M3GWY6NT.js";
6
+ import"./chunk-VSJBJXZO.js";var MIN_SEGMENT_CHARS=3;var parsedCache=new WeakMap;function splitSegments(path){return path.split("/").filter(segment=>segment!=="")}function parseRoutes(routes){const cached=parsedCache.get(routes);if(cached!==void 0)return cached;const parsed=[];for(const[key,domain]of Object.entries(routes.routes)){const space=key.indexOf(" ");if(space<=0)continue;const template=key.slice(space+1);parsed.push({method:key.slice(0,space),template,domain,segments:splitSegments(template).map(segment=>/^\{[^/{}]+\}$/.
9
7
  test(segment)?null:segment)})}parsedCache.set(routes,parsed);return parsed}function matches(route,segments){if(route.segments.length!==segments.length)return false;return route.segments.every((literal,i)=>literal===null||literal===segments[i])}function compareSpecificity(a,b){const literals=route=>route.segments.filter(segment=>segment!==null).length;const diff=literals(b)-literals(a);if(diff!==0)return diff;for(let i=0;i<a.segments.length;i+=1){const aLiteral=a.segments[i]!==null;const bLiteral=b.
10
8
  segments[i]!==null;if(aLiteral!==bLiteral)return aLiteral?-1:1}return 0}function lookupRoute(routes,method,path){const segments=splitSegments(path);const hits=parseRoutes(routes).filter(route=>matches(route,segments));const sameMethod=hits.filter(route=>route.method===method).sort(compareSpecificity);const best=sameMethod[0];if(best!==void 0)return{kind:"matched",domain:best.domain,template:best.template};if(hits.length>0){const[top]=[...hits].sort(compareSpecificity);const template=top.template;
11
9
  const methods=[...new Set(hits.filter(route=>route.template===template).map(route=>route.method))].sort();return{kind:"method-mismatch",template,methods}}return{kind:"unknown"}}function pickOperation(operations,method,template){return operations.find(op=>op.method===method&&op.path===template)??null}async function suggestRoutes(routes,path,limit=5){const{default:fuzzysort}=await import("./fuzzysort-DFVKV4B4.js");const parsed=parseRoutes(routes);const templates=[...new Set(parsed.map(route=>route.
12
10
  template))];const literals=new Set(parsed.flatMap(route=>route.segments.filter(segment=>segment!==null)));const kept=splitSegments(path).filter(segment=>literals.has(segment)||!/\d/.test(segment));for(let length=kept.length;length>=2;length-=1){const head=kept.slice(0,length-1);const last=kept[length-1];for(let cut=last.length;cut>=Math.min(MIN_SEGMENT_CHARS,last.length);cut-=1){const results=fuzzysort.go(`/${[...head,last.slice(0,cut)].join("/")}`,templates,{limit});if(results.length>0)return results.
13
- map(result=>result.target)}}return[]}var MAX_REPORTED_VIOLATIONS=20;function isRecord(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function typesOf(schema){const type=schema["type"];if(typeof type==="string")return[type];if(Array.isArray(type)&&type.every(t=>typeof t==="string"))return type;return null}var INTEGER_STRING=/^[+-]?\d+$/;var BOOLEAN_STRINGS=new Set(["0","1","true","false","yes","no","on","off"]);var NUMBER_STRING=/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?$/;function matchesType(type,value){switch(type){case"\
14
- null":return value===null;case"string":return typeof value==="string";case"integer":return typeof value==="number"&&Number.isInteger(value)||typeof value==="string"&&INTEGER_STRING.test(value);case"number":return typeof value==="number"&&Number.isFinite(value)||typeof value==="string"&&NUMBER_STRING.test(value);case"boolean":return typeof value==="boolean"||value===0||value===1||typeof value==="string"&&BOOLEAN_STRINGS.has(value.toLowerCase());case"array":case"object":return typeof value==="obje\
15
- ct"&&value!==null;default:return true}}function describe(value){if(value===null)return"null";if(Array.isArray(value))return"\u914D\u5217";if(typeof value==="object")return"\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8";if(typeof value==="string")return`\u6587\u5B57\u5217\uFF08${[...value].length} \u6587\u5B57\uFF09`;return`${typeof value==="number"?"\u6570\u5024":typeof value==="boolean"?"\u771F\u507D\u5024":typeof value} ${String(value)}`}function numericValue(value){if(typeof value==="number")return value;
16
- if(typeof value==="string"&&NUMBER_STRING.test(value))return Number(value);return null}var PHP_DELIMITED=/^([^A-Za-z0-9\\\s^])[\s\S]*\1[A-Za-z]*$/;function compilePattern(pattern){if(PHP_DELIMITED.test(pattern))return null;try{return new RegExp(pattern,"u")}catch{return null}}function walk(schema,value,at,out){if(!isRecord(schema))return;const types=typesOf(schema);if(types!==null&&!types.some(type=>matchesType(type,value))){out.push(`${at}: ${types.join(" / ")} \u3092\u671F\u5F85\u3057\u307E\u3057\u305F\u304C ${describe(
17
- value)} \u3067\u3059`);return}if(value===null)return;const enumValues=schema["enum"];if(Array.isArray(enumValues)&&enumValues.length>0){const allowed=enumValues.filter(item=>item!==null).map(item=>String(item));if(!allowed.includes(String(value))){out.push(`${at}: ${allowed.join(" / ")} \u306E\u3044\u305A\u308C\u304B\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u53D7\u3051\u53D6\u3063\u305F\u5024: ${describe(value)}\uFF09`)}}if(typeof value==="string"){const length=[...value].length;
18
- const max=schema["maxLength"];const min=schema["minLength"];if(typeof max==="number"&&length>max)out.push(`${at}: ${max} \u6587\u5B57\u4EE5\u5185\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08${length} \u6587\u5B57\uFF09`);if(typeof min==="number"&&length<min)out.push(`${at}: ${min} \u6587\u5B57\u4EE5\u4E0A\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08${length} \u6587\u5B57\uFF09`);const pattern=schema["pattern"];if(typeof pattern==="string"){const re=compilePattern(pattern);if(re!==null&&!re.
19
- test(value))out.push(`${at}: \u5F62\u5F0F\u304C\u9055\u3044\u307E\u3059\uFF08${pattern}\uFF09`)}}const numeric=types?.some(type=>type==="integer"||type==="number")?numericValue(value):null;if(numeric!==null){const minimum=schema["minimum"];const maximum=schema["maximum"];if(typeof minimum==="number"&&numeric<minimum)out.push(`${at}: ${minimum} \u4EE5\u4E0A\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08${numeric}\uFF09`);if(typeof maximum==="number"&&numeric>maximum)out.push(`${at}: ${maximum} \u4EE5\
20
- \u4E0B\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08${numeric}\uFF09`)}if(Array.isArray(value)){const maxItems=schema["maxItems"];const minItems=schema["minItems"];if(typeof maxItems==="number"&&value.length>maxItems)out.push(`${at}: \u8981\u7D20\u306F ${maxItems} \u4EF6\u4EE5\u5185\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08${value.length} \u4EF6\uFF09`);if(typeof minItems==="number"&&value.length<minItems)out.push(`${at}: \u8981\u7D20\u306F ${minItems} \u4EF6\u4EE5\u4E0A\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08${value.
21
- length} \u4EF6\uFF09`);if(isRecord(schema["items"]))value.forEach((item,i)=>walk(schema["items"],item,`${at}[${i}]`,out));return}if(isRecord(value)){const required=schema["required"];if(Array.isArray(required)){for(const key of required){if(typeof key==="string"&&!Object.prototype.hasOwnProperty.call(value,key))out.push(`${at}.${key}: \u5FC5\u9808\u3067\u3059`)}}const properties=schema["properties"];if(isRecord(properties)){for(const[key,child]of Object.entries(properties)){if(Object.prototype.hasOwnProperty.
22
- call(value,key))walk(child,value[key],`${at}.${key}`,out)}}}}function validateBody(schema,body){const out=[];walk(schema,body,"body",out);return out}function validateQuery(params,query){const out=[];for(const param of params){const has=Object.prototype.hasOwnProperty.call(query,param.name)&&query[param.name]!==void 0;if(!has){if(param.required)out.push(`query.${param.name}: \u5FC5\u9808\u3067\u3059`);continue}if(param.source!=="spec")continue;const declared=param.type;const types=typeof declared===
23
- "string"?[declared]:Array.isArray(declared)?declared.filter(t=>typeof t==="string"):[];const checked=types.filter(type=>type==="integer"||type==="number"||type==="boolean");if(checked.length===0||types.includes("string"))continue;const raw=query[param.name];if(types.includes("null")&&raw==="")continue;if(!checked.some(type=>matchesType(type,raw))){out.push(`query.${param.name}: ${checked.join(" / ")} \u3092\u671F\u5F85\u3057\u307E\u3057\u305F\u304C ${describe(raw)} \u3067\u3059`)}}return out}var API_COMMAND_HELP=`twp api \u2014 API \u306E\u30D1\u30B9\u3092\u76F4\u63A5\u53E9\u304F\uFF08\u30A8\u30B9\u30B1\u30FC\u30D7\u30CF\u30C3\u30C1\uFF09
11
+ map(result=>result.target)}}return[]}var API_COMMAND_HELP=`twp api \u2014 API \u306E\u30D1\u30B9\u3092\u76F4\u63A5\u53E9\u304F\uFF08\u30A8\u30B9\u30B1\u30FC\u30D7\u30CF\u30C3\u30C1\uFF09
24
12
 
25
13
  \u4F7F\u3044\u65B9:
26
14
  twp api <\u30D1\u30B9> [\u30AA\u30D7\u30B7\u30E7\u30F3]
@@ -1,8 +1,9 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{buildDiffLines,diffStat}from"./chunk-VRBI2NPI.js";import{RESIDENT_TOKEN_CAP,activateModeFiles,activatePermissionSettings,buildResidentSet,buildSystemPrompt,createAuditLogger,currentBranch,describeAuditLog,displayCwd,executeTool,findProjectTwpSubdir,localTools,lstatOrNull,parseFrontMatter,parseRule,persistProjectAllow,projectPermissionsPath,projectRootFor,readFileTool,resolveGitExecutable,runTurn,secretReason}from"./chunk-5ISIXBKD.js";import"./chunk-N2UVRM3Z.js";import{parseArgv}from"./chunk-I2QFW7EK.js";
4
- import{applyPermissionMode,checkPermission,describePermissionMode,getMode,isModeId,modeSource,nextMode}from"./chunk-BOBSH3QN.js";import"./chunk-PEGUHUTD.js";import"./chunk-QQRJLH6B.js";import{RelayError,builtinCatalog,createRuntime,loadCachedCatalog,modelLabel,pickModel,toModelInfos}from"./chunk-PI5DUWNZ.js";import"./chunk-XNLIEUAW.js";import{proxyDiagnostics}from"./chunk-J7QYPKVK.js";import"./chunk-PMOUHEJQ.js";import{checkMinSupportedVersion,isBelowMinSupported,
5
- minSupportedBlockMessage}from"./chunk-DXXFUNYN.js";import"./chunk-NERYSBA4.js";import{configReadDirs,twpHomeDir}from"./chunk-RZVI6PMW.js";import{require_fuzzysort}from"./chunk-DIMZRTLE.js";import{isFullWidth,isWide,stringWidth,stripAnsi}from"./chunk-WVS4W5FY.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";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.
3
+ import{buildDiffLines,diffStat}from"./chunk-VRBI2NPI.js";import{RESIDENT_TOKEN_CAP,activateModeFiles,activatePermissionSettings,buildResidentSet,buildSystemPrompt,createAuditLogger,createTwpToolkit,currentBranch,describeAuditLog,displayCwd,executeTool,findProjectTwpSubdir,localTools,lstatOrNull,parseFrontMatter,parseRule,persistProjectAllow,projectPermissionsPath,projectRootFor,readFileTool,residentInputs,resolveGitExecutable,runTurn,secretReason}from"./chunk-7PRQ7JW2.js";import"./chunk-NZ7WI4RZ.js";
4
+ import"./chunk-EQWW2F5V.js";import"./chunk-JB27KNCX.js";import"./chunk-JKSXUBND.js";import"./chunk-II5RVJQN.js";import"./chunk-X4RS5VBH.js";import"./chunk-N2UVRM3Z.js";import{parseArgv}from"./chunk-LD3AKGH6.js";import{applyPermissionMode,checkPermission,describePermissionMode,getMode,isModeId,modeSource,nextMode}from"./chunk-NAUH75MM.js";import"./chunk-PEGUHUTD.js";import"./chunk-QQRJLH6B.js";import{RelayError,builtinCatalog,createRuntime,
5
+ loadCachedCatalog,modelLabel,pickModel,toModelInfos}from"./chunk-WOUKWOAR.js";import"./chunk-XNLIEUAW.js";import{proxyDiagnostics}from"./chunk-J7QYPKVK.js";import"./chunk-PMOUHEJQ.js";import{checkMinSupportedVersion,isBelowMinSupported,minSupportedBlockMessage}from"./chunk-DXXFUNYN.js";import"./chunk-NERYSBA4.js";import{configReadDirs,twpHomeDir}from"./chunk-RZVI6PMW.js";import{require_fuzzysort}from"./chunk-DIMZRTLE.js";import{isFullWidth,isWide,stringWidth,
6
+ stripAnsi}from"./chunk-WVS4W5FY.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-M3GWY6NT.js";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
7
  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
8
  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
9
  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){
@@ -1211,7 +1212,7 @@ cwd()){const listed=await gitListFiles(cwd2);const raw=listed??await walkFiles(c
1211
1212
  1;const after=/^[^\s]*/.exec(text.slice(cursor))?.[0]??"";return{query,start,end:cursor+after.length}}var TWP_SLASH_ROUTES={"/tasks":{domain:"task",operation:"list"},"/task":{domain:"task",operation:"get"},"/projects":{domain:"project",operation:"list"}};function isTwpSlashCommand(name){return Object.hasOwn(TWP_SLASH_ROUTES,name)}async function runTwpSlashCommand(name,args,deps){const route=TWP_SLASH_ROUTES[name];if(!Object.hasOwn(TWP_SLASH_ROUTES,name)||route===void 0){return{code:2,out:"",err:`\u4E0D\u660E\u306A\u30B3\u30DE\u30F3\u30C9: ${name}
1212
1213
  `}}const parsed=parseArgv([route.domain,route.operation,...args]);if(parsed.command!=="domain"||parsed.domain!==route.domain){return{code:2,out:"",err:`${name}: \u3053\u306E\u5F15\u6570\u306F\u4F7F\u3048\u307E\u305B\u3093\uFF08${args.join(" ")}\uFF09
1213
1214
  `}}if(parsed.unknown.length>0){return{code:2,out:"",err:`\u4E0D\u660E\u306A\u5F15\u6570: ${parsed.unknown.join(" ")}
1214
- `}}let out="";let err="";const io={out:text=>void(out+=text),err:text=>void(err+=text),isTty:true};const globals={profile:parsed.profile??deps.profile,...parsed.output!==void 0?{output:parsed.output}:{},...parsed.query!==void 0?{query:parsed.query}:{},dryRun:parsed.dryRun,debug:parsed.debug,yes:parsed.yes,refresh:parsed.refresh};const{runDomain}=await import("./run-IS46BQBB.js");try{const code=await runDomain({domain:route.domain,...parsed.operation!==void 0?{operation:parsed.operation}:
1215
+ `}}let out="";let err="";const io={out:text=>void(out+=text),err:text=>void(err+=text),isTty:true};const globals={profile:parsed.profile??deps.profile,...parsed.output!==void 0?{output:parsed.output}:{},...parsed.query!==void 0?{query:parsed.query}:{},dryRun:parsed.dryRun,debug:parsed.debug,yes:parsed.yes,refresh:parsed.refresh};const{runDomain}=await import("./run-XCAJDHFU.js");try{const code=await runDomain({domain:route.domain,...parsed.operation!==void 0?{operation:parsed.operation}:
1215
1216
  {},argv:parsed.domainArgv,help:parsed.domainHelp,globals,version:deps.version,io,...deps.fetchImpl!==void 0?{fetchImpl:deps.fetchImpl}:{}});return{code,out,err}}catch(e){return{code:1,out,err:`${err}${e.message}
1216
1217
  `}}}var GIT_LOG_OUTPUT=["9f3c1a2 feat(ui): \u4E00\u89A7\u306E\u30D5\u30A3\u30EB\u30BF\u3092 URL \u30AF\u30A8\u30EA\u3068\u540C\u671F\u3059\u308B","4b8e0d7 fix(ui): \u4EEE\u60F3\u30B9\u30AF\u30ED\u30FC\u30EB\u306E\u884C\u9AD8\u3055\u3092\u5B9F\u6E2C\u5024\u306B\u5408\u308F\u305B\u308B","c15a99e refactor(api): \u4E00\u89A7\u53D6\u5F97\u306E\u30DA\u30FC\u30B8\u30F3\u30B0\u51E6\u7406\u3092\u5171\u901A\u5316\u3059\u308B","2d70f4b test: \u4E00\u89A7\u30D5\u30A3\u30EB\u30BF\u306E\u56DE\u5E30\u30C6\u30B9\u30C8\u3092\u8FFD\u52A0\u3059\u308B",
1217
1218
  "a6e2b38 fix(api): \u7A7A\u306E\u691C\u7D22\u6761\u4EF6\u3067\u5168\u4EF6\u8FD4\u3089\u306A\u3044\u3088\u3046\u306B\u3059\u308B","7c40d51 chore(deps): \u958B\u767A\u4F9D\u5B58\u3092\u6700\u65B0\u3078\u66F4\u65B0\u3059\u308B","e83b1c6 docs: \u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u624B\u9806\u306B Node 22 \u306E\u524D\u63D0\u3092\u8FFD\u8A18\u3059\u308B","b91f7a4 fix(ui): \u30E2\u30FC\u30C0\u30EB\u306E\u91CD\u306A\u308A\u9806\u3092\u6307\u5B9A\u3059\u308B","5a2c8e0 perf(api): \u4E00\u89A7\u306E N+1 \u3092\u89E3\u6D88\u3059\u308B",
@@ -1289,25 +1290,25 @@ const bufferRef=(0,import_react38.useRef)({text:"",cursor:0});const[buffer,setBu
1289
1290
  null);const[overlay,setOverlay]=(0,import_react38.useState)(startInDoctor?"doctor":"none");const[pendingPermission,setPendingPermissionState]=(0,import_react38.useState)(null);const pendingPermissionRef=(0,import_react38.useRef)(null);const setPendingPermission=(0,import_react38.useCallback)(next=>{pendingPermissionRef.current=next;setPendingPermissionState(next)},[]);const[keyLog,setKeyLog]=(0,import_react38.useState)([]);const[ctrlCArmed,setCtrlCArmed]=(0,import_react38.useState)(false);const[
1290
1291
  pasting,setPasting]=(0,import_react38.useState)(false);const[fileIndex,setFileIndex]=(0,import_react38.useState)(null);const fileIndexRef=(0,import_react38.useRef)(null);fileIndexRef.current=fileIndex;const fileIndexLoading=(0,import_react38.useRef)(false);const setBuffer=(0,import_react38.useCallback)(fn=>{bufferRef.current=fn(bufferRef.current);setBufferState(bufferRef.current)},[]);const clearBuffer=(0,import_react38.useCallback)(()=>setBuffer(()=>({text:"",cursor:0})),[setBuffer]);const selectedRef=(0,import_react38.useRef)(
1291
1292
  0);const[selectedState,setSelectedState]=(0,import_react38.useState)(0);const setSelected=(0,import_react38.useCallback)(next=>{selectedRef.current=typeof next==="function"?next(selectedRef.current):next;setSelectedState(selectedRef.current)},[]);const modeRef=(0,import_react38.useRef)(mode);modeRef.current=mode;const modelRef=(0,import_react38.useRef)(model);modelRef.current=model;const busyRef=(0,import_react38.useRef)(false);const abortRef=(0,import_react38.useRef)(false);const streamAbortRef=(0,import_react38.useRef)(
1292
- null);const sleepRef=(0,import_react38.useRef)(null);const permissionResolver=(0,import_react38.useRef)(null);const permStateRef=(0,import_react38.useRef)(INITIAL_DIALOG_STATE);const[permState,setPermStateRaw]=(0,import_react38.useState)(INITIAL_DIALOG_STATE);const setPermState=(0,import_react38.useCallback)(next=>{permStateRef.current=next;setPermStateRaw(next)},[]);const sessionAllow=(0,import_react38.useRef)(new Set);const sessionRules=(0,import_react38.useRef)([]);const demoSessionAllow=(0,import_react38.useRef)(
1293
- new Set);const lastToolRef=(0,import_react38.useRef)(null);(0,import_react38.useEffect)(()=>()=>{abortRef.current=true;streamAbortRef.current?.abort();const s=sleepRef.current;if(s){clearTimeout(s.timer);sleepRef.current=null;s.resolve()}},[]);const modeDef=getMode(mode);const branch=(0,import_react38.useMemo)(()=>currentBranch(),[]);const cwd2=(0,import_react38.useMemo)(()=>displayCwd(),[]);const networkDiagnostics=(0,import_react38.useMemo)(()=>proxyDiagnostics(),[]);const fixedChrome=1+2+(busy?
1294
- 1:0)+(pasting?1:0)+1+1;const liveTotal=Math.max(MIN_LIVE_ROWS,size.rows-1);const inputContentWidth=Math.max(1,size.columns-6);const inputMaxRows=Math.max(1,Math.min(6,liveTotal-fixedChrome-1));const inputWindow=layoutInputWindow(buffer.text,buffer.cursor,inputContentWidth,inputMaxRows);const budget=liveAreaBudget(size.rows,fixedChrome+inputWindow.shownRows);const commit=(0,import_react38.useCallback)(item=>{setItems(prev=>[...prev,{...item,id:nextId()}])},[]);const catalogFetchRef=(0,import_react38.useRef)(
1295
- null);const blockOnMinSupported=(0,import_react38.useCallback)(floor=>{const text=minSupportedBlockMessage(version,floor??"");commit({kind:"notice",tone:"error",text});process.exitCode=1;exit();process.stderr.write(stripTerminalControls(text))},[commit,exit,version]);(0,import_react38.useEffect)(()=>{if(!runtime.loggedIn){commit({kind:"notice",tone:"warn",text:"\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u3044\u307E\u305B\u3093\u3002\u4F1A\u8A71\u3092\u59CB\u3081\u308B\u306B\u306F\u5225\u306E\u7AEF\u672B\u3067 `twp login` \u3092\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002"});
1296
- return}if(initialModelWarning!==null){commit({kind:"notice",tone:"warn",text:initialModelWarning})}let cancelled=false;const pending=runtime.loadCatalog();catalogFetchRef.current=pending;void pending.then(fetched=>{if(cancelled)return;if(isBelowMinSupported(version,fetched.minSupportedVersion)){blockOnMinSupported(fetched.minSupportedVersion);return}setCatalog(fetched);const picked=pickModel(fetched,modelRef.current);if(picked.model!==modelRef.current){setModel(picked.model);if(picked.warning!==
1297
- void 0)commit({kind:"notice",tone:"warn",text:picked.warning})}});return()=>{cancelled=true}},[blockOnMinSupported,commit,initialModelWarning,runtime,version]);const sleep=ms=>new Promise(resolve=>{const timer=setTimeout(()=>{sleepRef.current=null;resolve()},ms);sleepRef.current={timer,resolve}});const abortSleep=()=>{const s=sleepRef.current;if(!s)return;clearTimeout(s.timer);sleepRef.current=null;s.resolve()};const askPermission=spec=>new Promise(resolve=>{setPendingPermission(spec);setSelected(
1298
- 0);setPermState(INITIAL_DIALOG_STATE);setOverlay("permission");permissionResolver.current=choice=>{setOverlay("none");setPendingPermission(null);permissionResolver.current=null;resolve(choice)}});const persistAllow=isAbsolute(twpHomeDir())?rule=>{const result=persistProjectAllow(rule,{cwd:process.cwd()});if(result.ok){commit({kind:"notice",tone:"info",text:`\u300C${stripTerminalControls(rule)}\u300D\u3092 ${stripTerminalControls(result.file)} \u306B\u4FDD\u5B58\u3057\u307E\u3057\u305F\uFF08${stripTerminalControls(
1299
- result.root)} \u3067\u306F\u4ECA\u5F8C\u805E\u304D\u307E\u305B\u3093\uFF09`})}else{commit({kind:"notice",tone:"warn",text:`\u4ECA\u5F8C\u805E\u304B\u306A\u3044\u306E\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u4ECA\u56DE\u3060\u3051\u8A31\u53EF\u3057\u307E\u3057\u305F\uFF09: ${stripTerminalControls(result.reason)}`})}return result.ok}:void 0;const runTurn2=(0,import_react38.useCallback)(async(text,opts={})=>{if(busyRef.current){commit({kind:"notice",tone:"warn",text:"\u5B9F\u884C\u4E2D\u3067\u3059\u3002Ctrl+\
1300
- C \u3067\u4E2D\u65AD\u3057\u3066\u304B\u3089\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044"});return}busyRef.current=true;abortRef.current=false;setBusy(true);commit({kind:"user",text:opts.display??text});const startupCatalog=await catalogFetchRef.current;if(startupCatalog&&isBelowMinSupported(version,startupCatalog.minSupportedVersion)){blockOnMinSupported(startupCatalog.minSupportedVersion);return}const controller=new AbortController;streamAbortRef.current=controller;try{const expandMode=getMode(
1301
- modeRef.current);const expandDeps={aborted:()=>abortRef.current,isFile:p=>{const cwdNow=process.cwd();if(isAbsolute(p)||p.startsWith("~")||/^[\\/]{2}/.test(p))return false;const abs=resolvePath(cwdNow,p);const rel=relativePath(cwdNow,abs);if(rel===""||rel===".."||rel.startsWith(`..${sep}`)||isAbsolute(rel))return false;try{return statSync(abs).isFile()}catch{return false}},readFile:async p=>{try{const size2=statSync(resolvePath(process.cwd(),p)).size;if(size2>MAX_ATTACHED_BYTES)return{ok:false,reason:`${size2}\
1302
- \u30D0\u30A4\u30C8\u3042\u308A\u3001\u6DFB\u4ED8\u306E\u4E0A\u9650 ${MAX_ATTACHED_BYTES} \u30D0\u30A4\u30C8\u3092\u8D85\u3048\u307E\u3059`}}catch{}const result2=await executeTool(readFileTool,{path:p},{mode:expandMode,ctx:{cwd:process.cwd()},sessionAllow:sessionAllow.current,sessionRules:sessionRules.current,...persistAllow?{persistAllow}:{},permissionLayers,...permissionMode!==void 0?{permissionMode}:{},audit,askPermission:request=>askPermission({...promptFor(request),allowInstead:false})});if(result2.
1303
- isError===true||result2.denied===true){const reason=stripTerminalControls(result2.content.split("\n")[0]??"").slice(0,200);return{ok:false,reason:reason===""?"\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F":reason}}return{ok:true,content:result2.content,truncated:/\[truncated/.test(result2.content)}},fetchTask:async key=>{const got=await runTwpSlashCommand("/task",[key,"--output","json"],{profile:runtime.profileName,version});if(got.code!==0){const reason=stripTerminalControls(got.err.trim().split(
1304
- "\n")[0]??"").slice(0,200);return{ok:false,reason:reason===""?`\u7D42\u4E86\u30B3\u30FC\u30C9 ${got.code}`:reason}}try{const parsed=JSON.parse(got.out);if(parsed!==null&&typeof parsed==="object"&&!Array.isArray(parsed)){return{ok:true,task:parsed}}}catch{}return{ok:false,reason:"\u5FDC\u7B54\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F"}}};const expanded=await expandInput(text,expandDeps);for(const note of expanded.notices)commit({kind:"notice",tone:"info",text:note});if(abortRef.current){
1305
- commit({kind:"notice",tone:"warn",text:"\u4E2D\u65AD\u3057\u307E\u3057\u305F\uFF08Ctrl+C\uFF09\u2014 \u9001\u4FE1\u3057\u3066\u3044\u307E\u305B\u3093"});return}stream.begin();const turnMode=getMode(modeRef.current);const resident=buildResidentSet(turnMode,{...permissionMode!==void 0?{permissionMode}:{},permissionLayers});const turnTools=opts.allowedTools===void 0?resident.tools:resident.tools.filter(t=>opts.allowedTools?.includes(t.name)===true);const result=await runTurn(runtime.client,runtime.
1306
- context,{input:expanded.input,model:modelRef.current,system:buildSystemPrompt({cwd:cwd2,branch,modeLabel:turnMode.label,cliVersion:version,toolNames:turnTools.map(t=>t.name),...turnMode.prompt!==void 0?{modePrompt:turnMode.prompt}:{}}),signal:controller.signal,onTextDelta:delta=>stream.push(stripTerminalControls(delta)),tools:turnTools,execute:{mode:turnMode,ctx:{cwd:process.cwd()},sessionAllow:sessionAllow.current,sessionRules:sessionRules.current,...persistAllow?{persistAllow}:{},permissionLayers,
1307
- ...permissionMode!==void 0?{permissionMode}:{},audit,askPermission:request=>askPermission(promptFor(request)),onStart:(tool,preview)=>{const safe=stripTerminalControls(preview);setRunningTool({name:stripTerminalControls(tool.name),summary:safe,input:safe,output:"",status:"running"})}},onToolUse:()=>{const partial=stream.end();stream.clear();if(partial.trim()!=="")commit({kind:"assistant",text:partial})},onToolResult:(call,toolResult)=>{setRunningTool(null);const label=stripTerminalControls(toolResult.
1308
- summary??call.name);const run={name:stripTerminalControls(call.name),summary:label,input:label,output:stripTerminalControls(toolResult.content),status:toolResult.denied===true?"denied":toolResult.isError===true?"error":"done",...toolResult.diff?{diff:toolResult.diff}:{}};lastToolRef.current=run;commit({kind:"tool",run});stream.begin()}});const full=stream.end();stream.clear();if(full.trim()!=="")commit({kind:"assistant",text:full});if(result.maxStepsReached){commit({kind:"notice",tone:"warn",text:"\
1309
- \u30C4\u30FC\u30EB\u5B9F\u884C\u306E\u5F80\u5FA9\u304C\u4E0A\u9650\u306B\u9054\u3057\u305F\u305F\u3081\u6253\u3061\u5207\u308A\u307E\u3057\u305F\u3002\u7D9A\u304D\u306F\u540C\u3058\u4F1A\u8A71\u3067\u6307\u793A\u3057\u3066\u304F\u3060\u3055\u3044"})}if(result.droppedMessages>0){commit({kind:"notice",tone:"warn",text:`\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u4E0A\u9650\u306B\u8FD1\u3065\u3044\u305F\u305F\u3081\u3001\u53E4\u3044\u3084\u308A\u53D6\u308A ${result.droppedMessages} \u4EF6\u3092\u5C65\u6B74\u304B\u3089\u843D\u3068\u3057\u307E\u3057\u305F\uFF08/clear \u3067\u660E\
1310
- \u793A\u7684\u306B\u6D88\u305B\u307E\u3059\uFF09`})}if(result.upstreamError!==null){commit({kind:"notice",tone:"error",text:`\u30E2\u30C7\u30EB\u306E\u5FDC\u7B54\u304C\u9014\u4E2D\u3067\u7D42\u308F\u308A\u307E\u3057\u305F: ${result.upstreamError}`})}if(result.aborted){commit({kind:"notice",tone:"warn",text:"\u4E2D\u65AD\u3057\u307E\u3057\u305F\uFF08Ctrl+C\uFF09\u2014 \u3053\u3053\u307E\u3067\u306E\u6D88\u8CBB\u306F\u30C6\u30CA\u30F3\u30C8\u306E\u30AF\u30EC\u30B8\u30C3\u30C8\u306B\u8A08\u4E0A\u3055\u308C\u307E\u3059"})}else if(result.
1293
+ null);const sleepRef=(0,import_react38.useRef)(null);const permissionResolver=(0,import_react38.useRef)(null);const permStateRef=(0,import_react38.useRef)(INITIAL_DIALOG_STATE);const[permState,setPermStateRaw]=(0,import_react38.useState)(INITIAL_DIALOG_STATE);const setPermState=(0,import_react38.useCallback)(next=>{permStateRef.current=next;setPermStateRaw(next)},[]);const sessionAllow=(0,import_react38.useRef)(new Set);const toolkitRef=(0,import_react38.useRef)(null);toolkitRef.current??=createTwpToolkit(
1294
+ runtime,version);const toolkit=toolkitRef.current;const sessionRules=(0,import_react38.useRef)([]);const demoSessionAllow=(0,import_react38.useRef)(new Set);const lastToolRef=(0,import_react38.useRef)(null);(0,import_react38.useEffect)(()=>()=>{abortRef.current=true;streamAbortRef.current?.abort();const s=sleepRef.current;if(s){clearTimeout(s.timer);sleepRef.current=null;s.resolve()}},[]);const modeDef=getMode(mode);const branch=(0,import_react38.useMemo)(()=>currentBranch(),[]);const cwd2=(0,import_react38.useMemo)(
1295
+ ()=>displayCwd(),[]);const networkDiagnostics=(0,import_react38.useMemo)(()=>proxyDiagnostics(),[]);const fixedChrome=1+2+(busy?1:0)+(pasting?1:0)+1+1;const liveTotal=Math.max(MIN_LIVE_ROWS,size.rows-1);const inputContentWidth=Math.max(1,size.columns-6);const inputMaxRows=Math.max(1,Math.min(6,liveTotal-fixedChrome-1));const inputWindow=layoutInputWindow(buffer.text,buffer.cursor,inputContentWidth,inputMaxRows);const budget=liveAreaBudget(size.rows,fixedChrome+inputWindow.shownRows);const commit=(0,import_react38.useCallback)(
1296
+ item=>{setItems(prev=>[...prev,{...item,id:nextId()}])},[]);const catalogFetchRef=(0,import_react38.useRef)(null);const blockOnMinSupported=(0,import_react38.useCallback)(floor=>{const text=minSupportedBlockMessage(version,floor??"");commit({kind:"notice",tone:"error",text});process.exitCode=1;exit();process.stderr.write(stripTerminalControls(text))},[commit,exit,version]);(0,import_react38.useEffect)(()=>{if(!runtime.loggedIn){commit({kind:"notice",tone:"warn",text:"\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u3044\u307E\u305B\u3093\u3002\u4F1A\u8A71\u3092\u59CB\u3081\u308B\u306B\u306F\u5225\u306E\u7AEF\u672B\u3067 `tw\
1297
+ p login` \u3092\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002"});return}if(initialModelWarning!==null){commit({kind:"notice",tone:"warn",text:initialModelWarning})}let cancelled=false;const pending=runtime.loadCatalog();catalogFetchRef.current=pending;void pending.then(fetched=>{if(cancelled)return;if(isBelowMinSupported(version,fetched.minSupportedVersion)){blockOnMinSupported(fetched.minSupportedVersion);return}setCatalog(fetched);const picked=pickModel(fetched,modelRef.current);if(picked.
1298
+ model!==modelRef.current){setModel(picked.model);if(picked.warning!==void 0)commit({kind:"notice",tone:"warn",text:picked.warning})}});return()=>{cancelled=true}},[blockOnMinSupported,commit,initialModelWarning,runtime,version]);const sleep=ms=>new Promise(resolve=>{const timer=setTimeout(()=>{sleepRef.current=null;resolve()},ms);sleepRef.current={timer,resolve}});const abortSleep=()=>{const s=sleepRef.current;if(!s)return;clearTimeout(s.timer);sleepRef.current=null;s.resolve()};const askPermission=spec=>new Promise(
1299
+ resolve=>{setPendingPermission(spec);setSelected(0);setPermState(INITIAL_DIALOG_STATE);setOverlay("permission");permissionResolver.current=choice=>{setOverlay("none");setPendingPermission(null);permissionResolver.current=null;resolve(choice)}});const persistAllow=isAbsolute(twpHomeDir())?rule=>{const result=persistProjectAllow(rule,{cwd:process.cwd()});if(result.ok){commit({kind:"notice",tone:"info",text:`\u300C${stripTerminalControls(rule)}\u300D\u3092 ${stripTerminalControls(result.file)} \u306B\u4FDD\u5B58\u3057\
1300
+ \u307E\u3057\u305F\uFF08${stripTerminalControls(result.root)} \u3067\u306F\u4ECA\u5F8C\u805E\u304D\u307E\u305B\u3093\uFF09`})}else{commit({kind:"notice",tone:"warn",text:`\u4ECA\u5F8C\u805E\u304B\u306A\u3044\u306E\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u4ECA\u56DE\u3060\u3051\u8A31\u53EF\u3057\u307E\u3057\u305F\uFF09: ${stripTerminalControls(result.reason)}`})}return result.ok}:void 0;const runTurn2=(0,import_react38.useCallback)(async(text,opts={})=>{if(busyRef.current){commit(
1301
+ {kind:"notice",tone:"warn",text:"\u5B9F\u884C\u4E2D\u3067\u3059\u3002Ctrl+C \u3067\u4E2D\u65AD\u3057\u3066\u304B\u3089\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044"});return}busyRef.current=true;abortRef.current=false;setBusy(true);commit({kind:"user",text:opts.display??text});const startupCatalog=await catalogFetchRef.current;if(startupCatalog&&isBelowMinSupported(version,startupCatalog.minSupportedVersion)){blockOnMinSupported(startupCatalog.minSupportedVersion);return}const controller=new AbortController;
1302
+ streamAbortRef.current=controller;try{const expandMode=getMode(modeRef.current);const expandDeps={aborted:()=>abortRef.current,isFile:p=>{const cwdNow=process.cwd();if(isAbsolute(p)||p.startsWith("~")||/^[\\/]{2}/.test(p))return false;const abs=resolvePath(cwdNow,p);const rel=relativePath(cwdNow,abs);if(rel===""||rel===".."||rel.startsWith(`..${sep}`)||isAbsolute(rel))return false;try{return statSync(abs).isFile()}catch{return false}},readFile:async p=>{try{const size2=statSync(resolvePath(process.
1303
+ cwd(),p)).size;if(size2>MAX_ATTACHED_BYTES)return{ok:false,reason:`${size2} \u30D0\u30A4\u30C8\u3042\u308A\u3001\u6DFB\u4ED8\u306E\u4E0A\u9650 ${MAX_ATTACHED_BYTES} \u30D0\u30A4\u30C8\u3092\u8D85\u3048\u307E\u3059`}}catch{}const result2=await executeTool(readFileTool,{path:p},{mode:expandMode,ctx:{cwd:process.cwd()},sessionAllow:sessionAllow.current,sessionRules:sessionRules.current,...persistAllow?{persistAllow}:{},permissionLayers,...permissionMode!==void 0?{permissionMode}:{},audit,askPermission:request=>askPermission(
1304
+ {...promptFor(request),allowInstead:false})});if(result2.isError===true||result2.denied===true){const reason=stripTerminalControls(result2.content.split("\n")[0]??"").slice(0,200);return{ok:false,reason:reason===""?"\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F":reason}}return{ok:true,content:result2.content,truncated:/\[truncated/.test(result2.content)}},fetchTask:async key=>{const got=await runTwpSlashCommand("/task",[key,"--output","json"],{profile:runtime.profileName,version});if(got.code!==
1305
+ 0){const reason=stripTerminalControls(got.err.trim().split("\n")[0]??"").slice(0,200);return{ok:false,reason:reason===""?`\u7D42\u4E86\u30B3\u30FC\u30C9 ${got.code}`:reason}}try{const parsed=JSON.parse(got.out);if(parsed!==null&&typeof parsed==="object"&&!Array.isArray(parsed)){return{ok:true,task:parsed}}}catch{}return{ok:false,reason:"\u5FDC\u7B54\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F"}}};const expanded=await expandInput(text,expandDeps);for(const note of expanded.notices)commit(
1306
+ {kind:"notice",tone:"info",text:note});if(abortRef.current){commit({kind:"notice",tone:"warn",text:"\u4E2D\u65AD\u3057\u307E\u3057\u305F\uFF08Ctrl+C\uFF09\u2014 \u9001\u4FE1\u3057\u3066\u3044\u307E\u305B\u3093"});return}stream.begin();const turnMode=getMode(modeRef.current);const resident=buildResidentSet(turnMode,{...residentInputs(toolkit),...permissionMode!==void 0?{permissionMode}:{},permissionLayers});const turnTools=opts.allowedTools===void 0?resident.tools:resident.tools.filter(t=>opts.allowedTools?.
1307
+ includes(t.name)===true);const result=await runTurn(runtime.client,runtime.context,{input:expanded.input,model:modelRef.current,system:buildSystemPrompt({cwd:cwd2,branch,modeLabel:turnMode.label,cliVersion:version,toolNames:turnTools.map(t=>t.name),...turnMode.prompt!==void 0?{modePrompt:turnMode.prompt}:{}}),signal:controller.signal,onTextDelta:delta=>stream.push(stripTerminalControls(delta)),tools:turnTools,execute:{mode:turnMode,ctx:{cwd:process.cwd()},sessionAllow:sessionAllow.current,sessionRules:sessionRules.
1308
+ current,...persistAllow?{persistAllow}:{},permissionLayers,...permissionMode!==void 0?{permissionMode}:{},resolveTool:toolkit.resolveTool,prepareIndirect:toolkit.prepareIndirect,audit,askPermission:request=>askPermission(promptFor(request)),onStart:(tool,preview)=>{const safe=stripTerminalControls(preview);setRunningTool({name:stripTerminalControls(tool.name),summary:safe,input:safe,output:"",status:"running"})}},onToolUse:()=>{const partial=stream.end();stream.clear();if(partial.trim()!=="")commit(
1309
+ {kind:"assistant",text:partial})},onToolResult:(call,toolResult)=>{setRunningTool(null);const label=stripTerminalControls(toolResult.summary??call.name);const run={name:stripTerminalControls(call.name),summary:label,input:label,output:stripTerminalControls(toolResult.content),status:toolResult.denied===true?"denied":toolResult.isError===true?"error":"done",...toolResult.diff?{diff:toolResult.diff}:{}};lastToolRef.current=run;commit({kind:"tool",run});stream.begin()}});const full=stream.end();stream.
1310
+ clear();if(full.trim()!=="")commit({kind:"assistant",text:full});if(result.maxStepsReached){commit({kind:"notice",tone:"warn",text:"\u30C4\u30FC\u30EB\u5B9F\u884C\u306E\u5F80\u5FA9\u304C\u4E0A\u9650\u306B\u9054\u3057\u305F\u305F\u3081\u6253\u3061\u5207\u308A\u307E\u3057\u305F\u3002\u7D9A\u304D\u306F\u540C\u3058\u4F1A\u8A71\u3067\u6307\u793A\u3057\u3066\u304F\u3060\u3055\u3044"})}if(result.droppedMessages>0){commit({kind:"notice",tone:"warn",text:`\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u4E0A\u9650\u306B\u8FD1\u3065\u3044\u305F\u305F\u3081\u3001\u53E4\u3044\u3084\u308A\u53D6\u308A ${result.
1311
+ droppedMessages} \u4EF6\u3092\u5C65\u6B74\u304B\u3089\u843D\u3068\u3057\u307E\u3057\u305F\uFF08/clear \u3067\u660E\u793A\u7684\u306B\u6D88\u305B\u307E\u3059\uFF09`})}if(result.upstreamError!==null){commit({kind:"notice",tone:"error",text:`\u30E2\u30C7\u30EB\u306E\u5FDC\u7B54\u304C\u9014\u4E2D\u3067\u7D42\u308F\u308A\u307E\u3057\u305F: ${result.upstreamError}`})}if(result.aborted){commit({kind:"notice",tone:"warn",text:"\u4E2D\u65AD\u3057\u307E\u3057\u305F\uFF08Ctrl+C\uFF09\u2014 \u3053\u3053\u307E\u3067\u306E\u6D88\u8CBB\u306F\u30C6\u30CA\u30F3\u30C8\u306E\u30AF\u30EC\u30B8\u30C3\u30C8\u306B\u8A08\u4E0A\u3055\u308C\u307E\u3059"})}else if(result.
1311
1312
  emptyResponse){commit({kind:"notice",tone:"warn",text:"\u30E2\u30C7\u30EB\u304B\u3089\u30C6\u30AD\u30B9\u30C8\u5FDC\u7B54\u304C\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F"})}}catch(err){const partial=stream.end();stream.clear();if(partial.trim()!=="")commit({kind:"assistant",text:partial});commit({kind:"notice",tone:"error",text:err instanceof RelayError?err.message:`\u30E2\u30C7\u30EB\u53D6\u6B21\u3067\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F: ${err.message}`})}finally{streamAbortRef.
1312
1313
  current=null;setRunningTool(null);setContext(runtime.context.snapshot());busyRef.current=false;setBusy(false)}},[audit,blockOnMinSupported,branch,commit,cwd2,permissionLayers,permissionMode,runtime,stream,version]);const runDemo=(0,import_react38.useCallback)(async text=>{if(busyRef.current){commit({kind:"notice",tone:"warn",text:"\u5B9F\u884C\u4E2D\u3067\u3059\u3002Ctrl+C \u3067\u4E2D\u65AD\u3057\u3066\u304B\u3089\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044"});return}busyRef.current=true;abortRef.
1313
1314
  current=false;setBusy(true);commit({kind:"user",text});for(const step of buildScenario(text)){if(abortRef.current)break;if(step.type==="text"){await stream.start(step.text);stream.clear();if(!abortRef.current)commit({kind:"assistant",text:step.text});continue}const spec=step.spec;const policy=applyPermissionMode(checkPermission(spec.name,getMode(modeRef.current)),spec.risk??"exec",permissionMode).decision;const decision=policy!=="deny"&&demoSessionAllow.current.has(spec.name)?"allow":policy;if(decision===
@@ -1321,9 +1322,9 @@ void 0&&!isAvailableInMode(cmd,modeRef.current)){commit({kind:"notice",tone:"war
1321
1322
  \u30E2\u30FC\u30C9\u3092 ${getMode(to).label}\uFF08${to}\uFF09\u306B\u5207\u308A\u66FF\u3048\u307E\u3057\u305F \u2014 ${getMode(to).description}`});return}case"/help":commit({kind:"notice",tone:"info",text:["\u4F1A\u8A71\u306F\u30C6\u30CA\u30F3\u30C8\u306E\u30AF\u30EC\u30B8\u30C3\u30C8\u3067\u5B9F\u969B\u306B\u30E2\u30C7\u30EB\u3078\u9001\u3089\u308C\u307E\u3059",`\u4F7F\u3048\u308B\u30B3\u30DE\u30F3\u30C9: ${commandsForMode(modeRef.current).map(c=>c.name).join(" ")}\uFF08/exit \u306F /quit \u3082\u53EF\uFF09`,
1322
1323
  ...commandsForMode(modeRef.current).filter(c=>c.source!==void 0).map(c=>` ${c.name} \u2014 ${c.origin==="project"?"\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u5B9A\u7FA9":"\u30E6\u30FC\u30B6\u30FC\u5B9A\u7FA9"}: ${c.source??""}`),"\u30B3\u30DE\u30F3\u30C9\u306F .twp/commands/*.md\uFF08\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\uFF09\u3068 ~/.twp/commands/*.md\uFF08\u30E6\u30FC\u30B6\u30FC\uFF09\u306B\u7F6E\u3051\u307E\u3059 \xB7 @\u30D1\u30B9 \u3067\u30D5\u30A1\u30A4\u30EB\u6DFB\u4ED8 \xB7 #ABC-123 \u306E\u3088\u3046\u306A\u30BF\u30B9\u30AF\u30AD\u30FC\u3067\u30BF\u30B9\u30AF\u6DFB\u4ED8",
1323
1324
  ...(()=>{const pending=PENDING_COMMANDS.filter(c=>findCommand(c.name)===void 0);return pending.length>0?[`\u672A\u5B9F\u88C5\u306E\u305F\u3081\u767B\u9332\u3057\u3066\u3044\u306A\u3044\u30B3\u30DE\u30F3\u30C9: ${pending.map(c=>c.name).join(" ")}`]:[]})(),"\u30AD\u30FC: Shift+Tab \u307E\u305F\u306F Alt+M \u3067\u30E2\u30FC\u30C9\u5DE1\u56DE \xB7 Ctrl+R \u3067\u76F4\u524D\u306E\u30C4\u30FC\u30EB\u51FA\u529B\u3092\u5C55\u958B","\u6539\u884C: Shift+Enter\uFF08kitty \u5BFE\u5FDC\u7AEF\u672B\uFF09\xB7 Ctrl+J\uFF08\u5168\u7AEF\u672B\uFF09\xB7 \\ \u3092\u6253\u3063\u3066\u304B\u3089 Enter \u3067\u3082\u53EF"].
1324
- join("\n")});return;case"/context":{const snapshot=runtime.context.snapshot();const t=snapshot.totals;const resident=buildResidentSet(getMode(modeRef.current),{...permissionMode!==void 0?{permissionMode}:{},permissionLayers});commit({kind:"notice",tone:"info",text:[`\u30E2\u30C7\u30EB: ${modelLabel(model)}\uFF08\u30E2\u30FC\u30C9\u3068\u306F\u72EC\u7ACB\uFF09`,`\u30E2\u30FC\u30C9: ${getMode(modeRef.current).label} \u2014 \u6709\u52B9\u30C4\u30FC\u30EB glob: ${getMode(modeRef.current).tools.join(
1325
- " ")}`,`\u30E2\u30FC\u30C9\u5B9A\u7FA9: ${modeSource(modeRef.current)??"\u7D44\u307F\u8FBC\u307F\uFF08\u5B9A\u7FA9\u30D5\u30A1\u30A4\u30EB\u306A\u3057\uFF09"}`,`\u63A5\u7D9A\u5148: ${runtime.relayUrl}\uFF08\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB: ${runtime.profileName}\uFF09`,`\u30BF\u30FC\u30F3\u6570: ${snapshot.turns} \xB7 \u76F4\u8FD1\u306E\u30D7\u30ED\u30F3\u30D7\u30C8\u9577: ${snapshot.lastPromptTokens} tok`,`\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u6B8B\u91CF: ${snapshot.remainingPercent}%\uFF08\u7A93 200\
1326
- ,000 tok \u306E\u6982\u7B97\uFF09`,`\u5B9F\u6E2C\u30C8\u30FC\u30AF\u30F3\u5408\u8A08: input ${t.inputTokens} / cache_read ${t.cacheReadTokens} / cache_write ${t.cacheWriteTokens} / output ${t.outputTokens}`,...snapshot.droppedMessages>0?[`\u4E0A\u9650\u306E\u305F\u3081\u843D\u3068\u3057\u305F\u3084\u308A\u53D6\u308A: ${snapshot.droppedMessages} \u4EF6`]:[],`permission-mode: ${describePermissionMode(permissionMode)}`,`\u76E3\u67FB\u30ED\u30B0: ${describeAuditLog(audit)}`,`\u5E38\u99D0\u30C4\u30FC\u30EB: ${resident.
1325
+ join("\n")});return;case"/context":{const snapshot=runtime.context.snapshot();const t=snapshot.totals;const resident=buildResidentSet(getMode(modeRef.current),{...residentInputs(toolkit),...permissionMode!==void 0?{permissionMode}:{},permissionLayers});commit({kind:"notice",tone:"info",text:[`\u30E2\u30C7\u30EB: ${modelLabel(model)}\uFF08\u30E2\u30FC\u30C9\u3068\u306F\u72EC\u7ACB\uFF09`,`\u30E2\u30FC\u30C9: ${getMode(modeRef.current).label} \u2014 \u6709\u52B9\u30C4\u30FC\u30EB glob: ${getMode(modeRef.
1326
+ current).tools.join(" ")}`,`\u30E2\u30FC\u30C9\u5B9A\u7FA9: ${modeSource(modeRef.current)??"\u7D44\u307F\u8FBC\u307F\uFF08\u5B9A\u7FA9\u30D5\u30A1\u30A4\u30EB\u306A\u3057\uFF09"}`,`\u63A5\u7D9A\u5148: ${runtime.relayUrl}\uFF08\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB: ${runtime.profileName}\uFF09`,`\u30BF\u30FC\u30F3\u6570: ${snapshot.turns} \xB7 \u76F4\u8FD1\u306E\u30D7\u30ED\u30F3\u30D7\u30C8\u9577: ${snapshot.lastPromptTokens} tok`,`\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u6B8B\u91CF: ${snapshot.remainingPercent}\
1327
+ %\uFF08\u7A93 200,000 tok \u306E\u6982\u7B97\uFF09`,`\u5B9F\u6E2C\u30C8\u30FC\u30AF\u30F3\u5408\u8A08: input ${t.inputTokens} / cache_read ${t.cacheReadTokens} / cache_write ${t.cacheWriteTokens} / output ${t.outputTokens}`,...snapshot.droppedMessages>0?[`\u4E0A\u9650\u306E\u305F\u3081\u843D\u3068\u3057\u305F\u3084\u308A\u53D6\u308A: ${snapshot.droppedMessages} \u4EF6`]:[],`permission-mode: ${describePermissionMode(permissionMode)}`,`\u76E3\u67FB\u30ED\u30B0: ${describeAuditLog(audit)}`,`\u5E38\u99D0\u30C4\u30FC\u30EB: ${resident.
1327
1328
  tools.length} \u672C / \u30B9\u30AD\u30FC\u30DE\u6982\u7B97 ${resident.tokens} tok\uFF08\u4E0A\u9650 ${RESIDENT_TOKEN_CAP} tok\uFF09`,` ${resident.tools.map(t2=>t2.name).join(" ")||"\uFF08\u306A\u3057\uFF09"}`,...resident.dropped.length>0?[` \u4E0A\u9650\u8D85\u904E\u3067\u5916\u3057\u305F\u30C4\u30FC\u30EB: ${resident.dropped.join(" ")}`]:[],"TWP API \u306E\u30C4\u30FC\u30EB\uFF08\u30E1\u30BF\u30C4\u30FC\u30EB\u30FB\u30AB\u30BF\u30ED\u30B0\u914D\u4FE1\uFF09\u306F\u5225\u30BF\u30B9\u30AF\u3067\u8F09\u308A\u307E\u3059"].
1328
1329
  join("\n")});return}case"/demo":void runDemo("\uFF08\u30C7\u30E2\u518D\u751F\uFF09\u30C4\u30FC\u30EB\u30AB\u30FC\u30C9\u3068\u6A29\u9650\u30C0\u30A4\u30A2\u30ED\u30B0");return;default:commit({kind:"notice",tone:"warn",text:`\u4E0D\u660E\u306A\u30B3\u30DE\u30F3\u30C9: ${name}`})}},[audit,catalog,commit,exit,model,permissionMode,runDemo,runPromptCommand,runTwp,runtime]);const submit=(0,import_react38.useCallback)(()=>{if(busyRef.current){commit({kind:"notice",tone:"warn",text:"\u5B9F\u884C\u4E2D\u3067\u3059\u3002Ctrl+C \u3067\u4E2D\u65AD\u3057\u3066\u304B\u3089\
1329
1330
  \u9001\u4FE1\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u5165\u529B\u306F\u4FDD\u6301\u3057\u3066\u3044\u307E\u3059\uFF09"});return}const text=bufferRef.current.text.trim();clearBuffer();setOverlay("none");if(text==="")return;if(text.startsWith("/")){runCommand(text);return}void runTurn2(text)},[clearBuffer,commit,runCommand,runTurn2]);const paletteItems=(0,import_react38.useMemo)(()=>paletteFor(buffer.text,mode),[buffer.text,mode]);const dismissedMentionRef=(0,import_react38.useRef)(null);const fileCompletion=(0,import_react38.useMemo)(
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{fetchLatestVersion,isBehindLatest,resolveNpmCommand}from"./chunk-JDMNIUVX.js";import"./chunk-PI5DUWNZ.js";import"./chunk-XNLIEUAW.js";import"./chunk-J7QYPKVK.js";import"./chunk-PMOUHEJQ.js";import{PARENT_PID_ENV,WORKER_ENV,autoUpdateDisabledReason,classifyInstall,isCheckDue,listRegisteredPids,lockFilePath,readUpdateState,resolveCliPath,runDirPath,writeUpdateState}from"./chunk-DSDVIU6A.js";import{PACKAGE_NAME,parseVersionCore}from"./chunk-DXXFUNYN.js";
3
+ import{fetchLatestVersion,isBehindLatest,resolveNpmCommand}from"./chunk-SJRK4AVE.js";import"./chunk-WOUKWOAR.js";import"./chunk-XNLIEUAW.js";import"./chunk-J7QYPKVK.js";import"./chunk-PMOUHEJQ.js";import{PARENT_PID_ENV,WORKER_ENV,autoUpdateDisabledReason,classifyInstall,isCheckDue,listRegisteredPids,lockFilePath,readUpdateState,resolveCliPath,runDirPath,writeUpdateState}from"./chunk-DSDVIU6A.js";import{PACKAGE_NAME,parseVersionCore}from"./chunk-DXXFUNYN.js";
4
4
  import"./chunk-NERYSBA4.js";import"./chunk-5WGOHFAS.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
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
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}\
@@ -1,8 +1,8 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{redactSecretValues,redactSecrets,renderOutput,withDebug}from"./chunk-3XG457E3.js";import{parseOperationArgs}from"./chunk-O52CUEDO.js";import{Resolver,requireDefaultProject}from"./chunk-JB27KNCX.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-JKSXUBND.js";import{DEFAULT_MAX_ITEMS,DEFAULT_MAX_PAGES,nextPageNotes,positiveInteger,shellQuote}from"./chunk-2VISRLWS.js";import{ResolveError}from"./chunk-X4RS5VBH.js";import{GLOBAL_OPTIONS_HELP}from"./chunk-TAN5I2DP.js";
4
- import{HELP_TOKEN}from"./chunk-PEGUHUTD.js";import{AuthSession,NotLoggedInError,SessionExpiredError,loadCredentials}from"./chunk-XNLIEUAW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{effectiveApiUrl,loadUserConfig,resolveConfiguredOutput,resolveProfile}from"./chunk-NERYSBA4.js";import{OUTPUT_FORMATS,resolveOutputFormat}from"./chunk-K2ONOH3L.js";import{stringWidth}from"./chunk-WVS4W5FY.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{
5
- evaluateQuery}from"./chunk-E4H22AO5.js";import{ApiResponseError,EXIT_API_CLIENT,EXIT_API_SERVER,EXIT_AUTH,EXIT_FAILURE,EXIT_OK,EXIT_USAGE,NetworkError,UsageError}from"./chunk-M3GWY6NT.js";import fs from"fs";import path from"path";var NO_REDACT_FLAG={name:"--no-redact",summary:"\u5FDC\u7B54\u306E\u4F0F\u5B57\u5316\u3092\u89E3\u9664\u3057\u3066\u751F\u306E\u5024\u3092\u51FA\u3059\uFF08\u9375\u306E\u53D7\u3051\u53D6\u308A\u7B49\uFF09",takesValue:false};var NO_REDACT_NOTICE="\u6CE8\u8A18: --no-redact \u306E\u305F\u3081\u51FA\u529B\u3092\u4F0F\u5B57\u5316\u3057\u307E\u305B\u3093\uFF08\u7AEF\u672B\u3068\u30ED\u30B0\u306B\u5E73\u6587\u3067\u6B8B\u308A\u307E\u3059\uFF09\u3002";function withCommonFlags(flags){return flags.some(flag=>flag.
3
+ import{renderOutput}from"./chunk-APYYF7H6.js";import{redactSecretValues,redactSecrets,withDebug}from"./chunk-EQWW2F5V.js";import{parseOperationArgs}from"./chunk-O52CUEDO.js";import{Resolver,requireDefaultProject}from"./chunk-JB27KNCX.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-JKSXUBND.js";import{DEFAULT_MAX_ITEMS,DEFAULT_MAX_PAGES,nextPageNotes,positiveInteger,shellQuote}from"./chunk-2VISRLWS.js";import{ResolveError}from"./chunk-X4RS5VBH.js";
4
+ import{GLOBAL_OPTIONS_HELP}from"./chunk-TAN5I2DP.js";import{HELP_TOKEN}from"./chunk-PEGUHUTD.js";import{AuthSession,NotLoggedInError,SessionExpiredError,loadCredentials}from"./chunk-XNLIEUAW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{effectiveApiUrl,loadUserConfig,resolveConfiguredOutput,resolveProfile}from"./chunk-NERYSBA4.js";import{OUTPUT_FORMATS,resolveOutputFormat}from"./chunk-K2ONOH3L.js";import{stringWidth}from"./chunk-WVS4W5FY.js";import{
5
+ stripTerminalControls}from"./chunk-NHYMHCAT.js";import{evaluateQuery}from"./chunk-E4H22AO5.js";import{ApiResponseError,EXIT_API_CLIENT,EXIT_API_SERVER,EXIT_AUTH,EXIT_FAILURE,EXIT_OK,EXIT_USAGE,NetworkError,UsageError}from"./chunk-M3GWY6NT.js";import fs from"fs";import path from"path";var NO_REDACT_FLAG={name:"--no-redact",summary:"\u5FDC\u7B54\u306E\u4F0F\u5B57\u5316\u3092\u89E3\u9664\u3057\u3066\u751F\u306E\u5024\u3092\u51FA\u3059\uFF08\u9375\u306E\u53D7\u3051\u53D6\u308A\u7B49\uFF09",takesValue:false};var NO_REDACT_NOTICE="\u6CE8\u8A18: --no-redact \u306E\u305F\u3081\u51FA\u529B\u3092\u4F0F\u5B57\u5316\u3057\u307E\u305B\u3093\uFF08\u7AEF\u672B\u3068\u30ED\u30B0\u306B\u5E73\u6587\u3067\u6B8B\u308A\u307E\u3059\uFF09\u3002";function withCommonFlags(flags){return flags.some(flag=>flag.
6
6
  name===NO_REDACT_FLAG.name)?flags:[...flags,NO_REDACT_FLAG]}function alignedList(entries,indent=" "){const width=entries.reduce((max,[left])=>Math.max(max,stringWidth(left)),0);return entries.map(([left,right])=>`${indent}${left}${" ".repeat(Math.max(0,width-stringWidth(left)))} ${right}`).join("\n")}function subresourcesOf(resource){return resource.subresources??[]}function renderResourceHelp(resource,path2){const subresources=subresourcesOf(resource);const operationSection=resource.operations.length===0?"":`
7
7
  \u64CD\u4F5C:
8
8
  ${alignedList(resource.operations.map(op=>[op.name,op.summary]))}
@@ -1,6 +1,7 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
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-PI5DUWNZ.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import{configReadDirs,ensureTwpHome,twpHomeDir}from"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import fs2 from"fs";import path3 from"path";import os2 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!==
3
+ import{CommandModelMissingError,MAX_REPORTED_VIOLATIONS,loadCommandModelDomain,loadCommandModelIndex,validateBody,validateQuery}from"./chunk-NZ7WI4RZ.js";import{redactSecretValues,redactSecrets}from"./chunk-EQWW2F5V.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-JKSXUBND.js";import{isSafePathSegment}from"./chunk-X4RS5VBH.js";import{isForceOnly,killProcessTree,system32}from"./chunk-N2UVRM3Z.js";import{MODES,applyPermissionMode,checkPermission,isModeId,setActiveModes}from"./chunk-NAUH75MM.js";
4
+ import{DEFAULT_MAX_TOKENS,emptyUsage}from"./chunk-WOUKWOAR.js";import{AuthSession}from"./chunk-XNLIEUAW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import{configReadDirs,ensureTwpHome,twpHomeDir}from"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import fs2 from"fs";import path3 from"path";import os2 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
5
  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
6
  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
7
  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\
@@ -76,13 +77,13 @@ return third!==void 0&&SCRIPT_NAME.test(third)?`${pair} ${third}`:null}function
76
77
  for(const[key,sub]of Object.entries(props)){if(value[key]===void 0){if(sub.default!==void 0)value[key]=sub.default;continue}checkValue(`${key}`,sub,value[key],errors)}return{ok:errors.length===0,errors,value}}function checkValue(path8,schema,value,errors){switch(schema.type){case"string":if(typeof value!=="string")errors.push(`${path8} must be a string`);break;case"boolean":if(typeof value!=="boolean")errors.push(`${path8} must be a boolean`);break;case"integer":if(typeof value!=="number"||!Number.
77
78
  isInteger(value))errors.push(`${path8} must be an integer`);break;case"number":if(typeof value!=="number"||!Number.isFinite(value))errors.push(`${path8} must be a number`);break;case"array":if(!Array.isArray(value)){errors.push(`${path8} must be an array`);break}if(schema.items){value.forEach((item,i)=>checkValue(`${path8}[${i}]`,schema.items,item,errors))}break;case"object":if(typeof value!=="object"||value===null||Array.isArray(value)){errors.push(`${path8} must be an object`)}break;default:break}
78
79
  if(schema.enum&&!schema.enum.some(v=>v===value)){errors.push(`${path8} must be one of: ${schema.enum.join(", ")}`)}if(typeof value==="number"){if(schema.minimum!==void 0&&value<schema.minimum)errors.push(`${path8} must be >= ${schema.minimum}`);if(schema.maximum!==void 0&&value>schema.maximum)errors.push(`${path8} must be <= ${schema.maximum}`)}}async function executeTool(tool,rawInput,deps,callId){const validated=validateInput(tool.inputSchema,rawInput);if(!validated.ok){const content=`Invalid input for ${tool.name}:
79
- - ${validated.errors.join("\n- ")}`;deps.audit.record({event:"result",tool:tool.name,risk:tool.risk,outcome:"error",bytes:Buffer.byteLength(content),mode:deps.mode.id,reasonCode:"invalid_input",callId});return{content,isError:true,summary:`${tool.name} \xB7 \u5165\u529B\u304C\u4E0D\u6B63`}}const input=validated.value;let judged={tool};const verdictTarget=()=>judged;const recordDecision=(decision,reasonCode,reason)=>{deps.audit.record({event:"decision",tool:verdictTarget().tool.name,risk:verdictTarget().
80
- tool.risk,decision,reasonCode,reason,mode:deps.mode.id,rawInput:input,callId})};const verdict=checkToolPermission({tool,input},{mode:deps.mode,cwd:deps.ctx.cwd,sessionAllow:deps.sessionAllow,...deps.sessionRules?{sessionRules:deps.sessionRules}:{},...deps.permissionLayers?{layers:deps.permissionLayers}:{},...deps.permissionMode!==void 0?{permissionMode:deps.permissionMode}:{},...deps.resolveTool?{resolveTool:deps.resolveTool}:{}});const policy=verdict.decision;judged=verdict.target;const target=verdict.
81
- target;if(policy==="deny"){recordDecision("deny",reasonCodeOf(verdict),verdict.reason);return{content:denyMessage(tool.name,verdict,deps),isError:true,denied:true,summary:`${tool.name} \xB7 deny\uFF08${denySummary(verdict,deps)}\uFF09`}}const preview=safePreview(tool,input);const noAlwaysReason=neverAutoAllowReason(target.tool,target.input)??autoApproveExemptReason(target.tool,target.input,deps.ctx.cwd)??verdict.noAlwaysReason??null;const needsAsk=policy==="ask"||noAlwaysReason!==null;if(needsAsk){
82
- {if(!deps.askPermission){recordDecision("deny",noAlwaysReason===null?"non_interactive":"guard",noAlwaysReason??"\u975E\u5BFE\u8A71\u30BB\u30C3\u30B7\u30E7\u30F3\u3067\u627F\u8A8D\u304C\u5FC5\u8981\uFF08deny-and-continue\uFF09");return{content:`permission denied: ${tool.name} requires approval, and this session is non-interactive. `+(noAlwaysReason===null?"":`Reason: ${noAlwaysReason} `)+"Explain what you would run instead of running it.",isError:true,denied:true,summary:`${tool.name} \xB7 \u975E\u5BFE\u8A71\u306E\u305F\u3081\u62D2\u5426`}}
83
- let diff;try{diff=await tool.prepare?.(input,deps.ctx)??void 0}catch(err){diff=void 0;if(err instanceof PathDeniedError){recordDecision("deny","path_denied","\u4FDD\u8B77\u3055\u308C\u305F\u30D1\u30B9\uFF08paths.ts\uFF09");return{content:err.message,isError:true,denied:true,summary:`${tool.name} \xB7 deny\uFF08\u4FDD\u8B77\u3055\u308C\u305F\u30D1\u30B9\uFF09`}}}const persistOptions=deps.persistAllow?persistOptionsFor(target,noAlwaysReason,deps.ctx.cwd):[];const answer=await deps.askPermission({tool,
84
- input,preview,...diff?{diff}:{},noAlwaysReason,target,persistOptions});if(answer==="no"||typeof answer==="object"&&answer.kind==="instead"){const instead=typeof answer==="object"?answer.text.trim():"";recordDecision("deny","user_declined",instead===""?"\u5229\u7528\u8005\u304C\u62D2\u5426":"\u5229\u7528\u8005\u304C\u62D2\u5426\uFF08\u4EE3\u308F\u308A\u306E\u6307\u793A\u3042\u308A\uFF09");return{content:instead===""?`permission denied: the user declined to run ${tool.name}.`:`permission denied: t\
85
- he user declined to run ${tool.name} and asked you to do this instead:
80
+ - ${validated.errors.join("\n- ")}`;deps.audit.record({event:"result",tool:tool.name,risk:tool.risk,outcome:"error",bytes:Buffer.byteLength(content),mode:deps.mode.id,reasonCode:"invalid_input",callId});return{content,isError:true,summary:`${tool.name} \xB7 \u5165\u529B\u304C\u4E0D\u6B63`}}const input=validated.value;if(tool.name===INDIRECT_TOOL&&deps.prepareIndirect){await deps.prepareIndirect(input).catch(()=>void 0)}let judged={tool};const verdictTarget=()=>judged;const recordDecision=(decision,reasonCode,reason)=>{
81
+ deps.audit.record({event:"decision",tool:verdictTarget().tool.name,risk:verdictTarget().tool.risk,decision,reasonCode,reason,mode:deps.mode.id,rawInput:input,callId})};const verdict=checkToolPermission({tool,input},{mode:deps.mode,cwd:deps.ctx.cwd,sessionAllow:deps.sessionAllow,...deps.sessionRules?{sessionRules:deps.sessionRules}:{},...deps.permissionLayers?{layers:deps.permissionLayers}:{},...deps.permissionMode!==void 0?{permissionMode:deps.permissionMode}:{},...deps.resolveTool?{resolveTool:deps.
82
+ resolveTool}:{}});const policy=verdict.decision;judged=verdict.target;const target=verdict.target;if(policy==="deny"){recordDecision("deny",reasonCodeOf(verdict),verdict.reason);return{content:denyMessage(tool.name,verdict,deps),isError:true,denied:true,summary:`${tool.name} \xB7 deny\uFF08${denySummary(verdict,deps)}\uFF09`}}const preview=safePreview(tool,input);const noAlwaysReason=neverAutoAllowReason(target.tool,target.input)??autoApproveExemptReason(target.tool,target.input,deps.ctx.cwd)??verdict.
83
+ noAlwaysReason??null;const needsAsk=policy==="ask"||noAlwaysReason!==null;if(needsAsk){{if(!deps.askPermission){recordDecision("deny",noAlwaysReason===null?"non_interactive":"guard",noAlwaysReason??"\u975E\u5BFE\u8A71\u30BB\u30C3\u30B7\u30E7\u30F3\u3067\u627F\u8A8D\u304C\u5FC5\u8981\uFF08deny-and-continue\uFF09");return{content:`permission denied: ${tool.name} requires approval, and this session is non-interactive. `+(noAlwaysReason===null?"":`Reason: ${noAlwaysReason} `)+"Explain what you would\
84
+ run instead of running it.",isError:true,denied:true,summary:`${tool.name} \xB7 \u975E\u5BFE\u8A71\u306E\u305F\u3081\u62D2\u5426`}}let diff;try{diff=await tool.prepare?.(input,deps.ctx)??void 0}catch(err){diff=void 0;if(err instanceof PathDeniedError){recordDecision("deny","path_denied","\u4FDD\u8B77\u3055\u308C\u305F\u30D1\u30B9\uFF08paths.ts\uFF09");return{content:err.message,isError:true,denied:true,summary:`${tool.name} \xB7 deny\uFF08\u4FDD\u8B77\u3055\u308C\u305F\u30D1\u30B9\uFF09`}}}const persistOptions=deps.
85
+ persistAllow?persistOptionsFor(target,noAlwaysReason,deps.ctx.cwd):[];const answer=await deps.askPermission({tool,input,preview,...diff?{diff}:{},noAlwaysReason,target,persistOptions});if(answer==="no"||typeof answer==="object"&&answer.kind==="instead"){const instead=typeof answer==="object"?answer.text.trim():"";recordDecision("deny","user_declined",instead===""?"\u5229\u7528\u8005\u304C\u62D2\u5426":"\u5229\u7528\u8005\u304C\u62D2\u5426\uFF08\u4EE3\u308F\u308A\u306E\u6307\u793A\u3042\u308A\uFF09");
86
+ return{content:instead===""?`permission denied: the user declined to run ${tool.name}.`:`permission denied: the user declined to run ${tool.name} and asked you to do this instead:
86
87
  ${instead}`,isError:true,denied:true,summary:instead===""?`${tool.name} \xB7 \u5229\u7528\u8005\u304C\u62D2\u5426`:`${tool.name} \xB7 \u5229\u7528\u8005\u304C\u62D2\u5426\uFF08\u4EE3\u308F\u308A\u306E\u6307\u793A\u3042\u308A\uFF09`}}if(answer==="always"&&noAlwaysReason===null&&target.tool.name!==INDIRECT_TOOL){deps.sessionAllow.add(target.tool.name)}let persisted=false;if(typeof answer==="object"&&answer.kind==="persist"&&noAlwaysReason===null&&persistOptions.some(o=>o.rule===answer.rule)&&deps.
87
88
  persistAllow){persisted=await deps.persistAllow(answer.rule);if(persisted)deps.sessionRules?.push(answer.rule)}const how=answer==="always"?"\u5229\u7528\u8005\u304C\u627F\u8A8D\uFF08\u4ECA\u5F8C\u805E\u304B\u306A\u3044\uFF09":typeof answer==="object"&&answer.kind==="persist"?persisted?`\u5229\u7528\u8005\u304C\u627F\u8A8D\uFF08\u3053\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3067\u306F\u4ECA\u5F8C\u805E\u304B\u306A\u3044: ${answer.rule}\uFF09`:"\u5229\u7528\u8005\u304C\u627F\u8A8D\uFF08\u4ECA\u5F8C\u805E\u304B\u306A\u3044\u306E\u4FDD\u5B58\u306F\u884C\u308F\u306A\u304B\u3063\u305F\uFF09":
88
89
  "\u5229\u7528\u8005\u304C\u627F\u8A8D";recordDecision("allow","user_approved",`${how}\uFF08\u78BA\u8A8D\u306E\u7406\u7531: ${verdict.reason}\uFF09`)}}else{recordDecision("allow",reasonCodeOf(verdict),verdict.reason)}deps.onStart?.(tool,preview);try{const result=await tool.run(input,deps.ctx);deps.audit.record({event:"result",tool:tool.name,risk:tool.risk,outcome:result.isError===true?"error":"ok",bytes:Buffer.byteLength(result.content),mode:deps.mode.id,callId});return{summary:preview,...result}}catch(err){
@@ -141,13 +142,14 @@ while(offset<buf.length){const n=fs4.writeSync(handle,buf,offset,buf.length-offs
141
142
  `}if(Buffer.byteLength(line)>MAX_LINE_BYTES){line=`${JSON.stringify({ts:now(),v:1,session:sessionId,event:payload["event"],tool:clamp(String(payload["tool"]??""),40),_dropped:"line_too_long"})}
142
143
  `}if(written+Buffer.byteLength(line)>MAX_FILE_BYTES){stopped=true;writeAll(fd,`${JSON.stringify({ts:now(),v:1,session:sessionId,event:"truncated"})}
143
144
  `);return}writeAll(fd,line)}catch{stopped=true}};const common={v:1,session:sessionId,permission_mode:ctx.permissionMode??null};let wroteHeader=false;const header=()=>{if(wroteHeader)return;writeLine({ts:now(),...common,event:"session_start",mode:ctx.mode,model:ctx.model,cwd:ctx.cwd,cli_version:ctx.cliVersion,interactive:ctx.interactive,pid:process.pid});if(fd!==null&&!stopped)wroteHeader=true};const reportSaturation=()=>{if(!registry.saturated||reportedSaturation)return;reportedSaturation=true;writeLine(
144
- {ts:now(),...common,event:"registry_saturated"})};return{path:file,sessionId,get opened(){return everOpened},record(event){header();const safe=sanitizeEvent(event,registry);const tool=clamp(safe.tool,MAX_TOOL_NAME_BYTES);const callId=safe.callId===void 0?{}:{call_id:clamp(safe.callId,MAX_CALL_ID_BYTES)};if(safe.event==="decision"){writeLine({ts:now(),...common,event:"decision",tool,...callId,risk:safe.risk,decision:safe.decision,reason_code:safe.reasonCode,reason:safe.reason,mode:safe.mode,input:safe.
145
- input});reportSaturation();return}writeLine({ts:now(),...common,event:"result",tool,...callId,risk:safe.risk,outcome:safe.outcome,bytes:safe.bytes,mode:safe.mode,...safe.reasonCode!==void 0?{reason_code:safe.reasonCode}:{}})},close(){stopped=true;if(fd===null)return;try{fs4.closeSync(fd)}catch{}fd=null}}}function now(){return new Date().toISOString()}function lstatOrNull2(target){try{return fs4.lstatSync(target)}catch{return null}}function clamp(value,maxBytes){const total=Buffer.byteLength(value);
146
- if(total<=maxBytes)return value;let out=value;while(out.length>0&&Buffer.byteLength(out)>maxBytes)out=out.slice(0,-1);return`${out}\u2026(+${total-Buffer.byteLength(out)})`}function sanitizeInput(rawInput,registry){learnSecrets(rawInput,0,registry);return sanitizeObject(rawInput,0,registry)}function learnSecrets(value,depth,registry){if(depth>8||value===null||typeof value!=="object")return;if(Array.isArray(value)){for(const item of value)learnSecrets(item,depth+1,registry);return}for(const[key,child]of Object.
147
- entries(value)){if(REDACT_KEYS.has(key.toLowerCase()))registry.learn(child);else learnSecrets(child,depth+1,registry)}}function sanitizeObject(obj,depth,registry){const out={};let keys=0;for(const[key,value]of Object.entries(obj)){if(keys>=20){out["_twp_more_keys"]=true;break}keys++;if(REDACT_KEYS.has(key.toLowerCase())){out[key]=`<redacted ${byteLengthOf(value)} bytes>`;continue}out[key]=sanitizeValue(value,depth+1,registry)}return out}function sanitizeValue(value,depth,registry){if(value===null||
148
- typeof value==="number"||typeof value==="boolean")return value;if(typeof value==="string"){return clamp(registry.scrub(scrubSecrets(value)),MAX_STRING_BYTES)}if(depth>=3)return"<depth>";if(Array.isArray(value)){const head=value.slice(0,10).map(v=>sanitizeValue(v,depth+1,registry));return value.length>10?[...head,`\u2026(+${value.length-10})`]:head}if(typeof value==="object")return sanitizeObject(value,depth,registry);return`<${typeof value}>`}function byteLengthOf(value){if(typeof value==="strin\
149
- g")return Buffer.byteLength(value);try{return Buffer.byteLength(JSON.stringify(value)??"")}catch{return 0}}function prune(dir,nowMs=Date.now()){let entries;try{entries=fs4.readdirSync(dir).filter(n=>/^session-.*\.jsonl$/.test(n))}catch{return}const stats=[];for(const name of entries){try{stats.push({name,mtime:fs4.statSync(path5.join(dir,name)).mtimeMs})}catch{}}stats.sort((a,b)=>b.mtime-a.mtime);const cutoff=nowMs-MAX_AGE_DAYS*24*60*60*1e3;stats.forEach((entry,index)=>{const overCount=index>=MAX_FILES-
150
- 1;const tooOld=entry.mtime<cutoff;if(!tooOld&&!overCount)return;if(!tooOld&&nowMs-entry.mtime<PRUNE_GRACE_MS)return;try{fs4.unlinkSync(path5.join(dir,entry.name))}catch{}})}var CROCKFORD="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function newSessionId(nowMs=Date.now()){let time="";let remaining=nowMs;for(let i=0;i<10;i++){time=`${CROCKFORD[remaining%32]??"0"}${time}`;remaining=Math.floor(remaining/32)}const bytes=crypto.randomBytes(16);let rand="";for(const byte of bytes)rand+=CROCKFORD[byte%32]??"0";return`${time}${rand}`}import{readFileSync}from"fs";import{dirname as dirname2,join,resolve as resolve2,sep as sep3}from"path";function currentBranch(cwd=process.cwd()){let dir=cwd;for(;;){const gitPath=join(dir,".git");const head=readHead(gitPath);if(head!==null)return head;const parent=dirname2(dir);if(parent===dir)return null;dir=parent}}function readHead(gitPath){let headFile=join(gitPath,"HEAD");try{const stat2=readFileSync(gitPath,"utf8");const m=/^gitdir:\s*(.+)$/m.exec(stat2);if(m?.[1])headFile=join(resolve2(dirname2(
145
+ {ts:now(),...common,event:"registry_saturated"})};return{path:file,sessionId,get opened(){return everOpened},record(event){header();const safe2=sanitizeEvent(event,registry);const tool=clamp(safe2.tool,MAX_TOOL_NAME_BYTES);const callId=safe2.callId===void 0?{}:{call_id:clamp(safe2.callId,MAX_CALL_ID_BYTES)};if(safe2.event==="decision"){writeLine({ts:now(),...common,event:"decision",tool,...callId,risk:safe2.risk,decision:safe2.decision,reason_code:safe2.reasonCode,reason:safe2.reason,mode:safe2.
146
+ mode,input:safe2.input});reportSaturation();return}writeLine({ts:now(),...common,event:"result",tool,...callId,risk:safe2.risk,outcome:safe2.outcome,bytes:safe2.bytes,mode:safe2.mode,...safe2.reasonCode!==void 0?{reason_code:safe2.reasonCode}:{}})},close(){stopped=true;if(fd===null)return;try{fs4.closeSync(fd)}catch{}fd=null}}}function now(){return new Date().toISOString()}function lstatOrNull2(target){try{return fs4.lstatSync(target)}catch{return null}}function clamp(value,maxBytes){const total=Buffer.
147
+ byteLength(value);if(total<=maxBytes)return value;let out=value;while(out.length>0&&Buffer.byteLength(out)>maxBytes)out=out.slice(0,-1);return`${out}\u2026(+${total-Buffer.byteLength(out)})`}function sanitizeInput(rawInput,registry){learnSecrets(rawInput,0,registry);return sanitizeObject(rawInput,0,registry)}function learnSecrets(value,depth,registry){if(depth>8||value===null||typeof value!=="object")return;if(Array.isArray(value)){for(const item of value)learnSecrets(item,depth+1,registry);return}
148
+ for(const[key,child]of Object.entries(value)){if(REDACT_KEYS.has(key.toLowerCase()))registry.learn(child);else learnSecrets(child,depth+1,registry)}}function sanitizeObject(obj,depth,registry){const out={};let keys=0;for(const[key,value]of Object.entries(obj)){if(keys>=20){out["_twp_more_keys"]=true;break}keys++;if(REDACT_KEYS.has(key.toLowerCase())){out[key]=`<redacted ${byteLengthOf(value)} bytes>`;continue}out[key]=sanitizeValue(value,depth+1,registry)}return out}function sanitizeValue(value,depth,registry){
149
+ if(value===null||typeof value==="number"||typeof value==="boolean")return value;if(typeof value==="string"){return clamp(registry.scrub(scrubSecrets(value)),MAX_STRING_BYTES)}if(depth>=3)return"<depth>";if(Array.isArray(value)){const head=value.slice(0,10).map(v=>sanitizeValue(v,depth+1,registry));return value.length>10?[...head,`\u2026(+${value.length-10})`]:head}if(typeof value==="object")return sanitizeObject(value,depth,registry);return`<${typeof value}>`}function byteLengthOf(value){if(typeof value===
150
+ "string")return Buffer.byteLength(value);try{return Buffer.byteLength(JSON.stringify(value)??"")}catch{return 0}}function prune(dir,nowMs=Date.now()){let entries;try{entries=fs4.readdirSync(dir).filter(n=>/^session-.*\.jsonl$/.test(n))}catch{return}const stats=[];for(const name of entries){try{stats.push({name,mtime:fs4.statSync(path5.join(dir,name)).mtimeMs})}catch{}}stats.sort((a,b)=>b.mtime-a.mtime);const cutoff=nowMs-MAX_AGE_DAYS*24*60*60*1e3;stats.forEach((entry,index)=>{const overCount=index>=
151
+ MAX_FILES-1;const tooOld=entry.mtime<cutoff;if(!tooOld&&!overCount)return;if(!tooOld&&nowMs-entry.mtime<PRUNE_GRACE_MS)return;try{fs4.unlinkSync(path5.join(dir,entry.name))}catch{}})}var CROCKFORD="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function newSessionId(nowMs=Date.now()){let time="";let remaining=nowMs;for(let i=0;i<10;i++){time=`${CROCKFORD[remaining%32]??"0"}${time}`;remaining=Math.floor(remaining/32)}const bytes=crypto.randomBytes(16);let rand="";for(const byte of bytes)rand+=CROCKFORD[byte%32]??
152
+ "0";return`${time}${rand}`}import{readFileSync}from"fs";import{dirname as dirname2,join,resolve as resolve2,sep as sep3}from"path";function currentBranch(cwd=process.cwd()){let dir=cwd;for(;;){const gitPath=join(dir,".git");const head=readHead(gitPath);if(head!==null)return head;const parent=dirname2(dir);if(parent===dir)return null;dir=parent}}function readHead(gitPath){let headFile=join(gitPath,"HEAD");try{const stat2=readFileSync(gitPath,"utf8");const m=/^gitdir:\s*(.+)$/m.exec(stat2);if(m?.[1])headFile=join(resolve2(dirname2(
151
153
  gitPath),m[1].trim()),"HEAD")}catch{}try{const head=readFileSync(headFile,"utf8").trim();const ref=/^ref:\s*refs\/heads\/(.+)$/.exec(head);if(ref?.[1])return ref[1];return head.slice(0,7)}catch{return null}}function displayCwd(cwd=process.cwd(),home=process.env["HOME"]??process.env["USERPROFILE"]??""){if(!home)return cwd;const stripped=home.replace(new RegExp(`${escapeSep()}+$`),"");if(stripped==="")return cwd;const normalize=p=>process.platform==="win32"?p.toLowerCase():p;const h=normalize(stripped);
152
154
  const c=normalize(cwd);if(c===h)return"~";if(c.startsWith(h+sep3))return`~${cwd.slice(stripped.length)}`;return cwd}function escapeSep(){return sep3==="\\"?"\\\\":sep3}import{spawn}from"child_process";function keepTailBytes(buf,maxBytes){if(buf.length<=maxBytes)return{text:buf.toString("utf8"),droppedBytes:0};const start=buf.length-maxBytes;let cut=start;while(cut<buf.length&&(buf[cut]&192)===128)cut++;return{text:buf.subarray(cut).toString("utf8"),droppedBytes:cut}}function keepHeadBytes(text,maxBytes){const buf=Buffer.from(text,"utf8");if(buf.length<=maxBytes)return{text,truncated:false};let cut=maxBytes;while(cut>0&&(buf[cut]&192)===128)cut--;return{text:buf.subarray(0,cut).toString("utf8"),
153
155
  truncated:true}}import{existsSync}from"fs";import path6 from"path";var GIT_BASH_CANDIDATES=["C:\\Program Files\\Git\\bin\\bash.exe","C:\\Program Files (x86)\\Git\\bin\\bash.exe","C:\\Program Files\\Git\\usr\\bin\\bash.exe"];function system32Path(env,...rest){return system32(env,...rest)??path6.win32.join("C:\\Windows\\System32",...rest)}function defaultProbe(filePath){try{return existsSync(filePath)}catch{return false}}function selectShell(platform=process.platform,probe=defaultProbe,env=process.env){if(platform!=="win32"){return{toolName:"bash",command:"/bin/b\
@@ -200,6 +202,31 @@ limit"]:DEFAULT_LIMIT_LINES;const slice=lines.slice(offset-1,offset-1+limit);let
200
202
 
201
203
  [truncated: file has ${lines.length} lines; re-read with offset/limit for the rest]`:"";if(body===""){const reason=lines.length===0?"(empty file)":`(no lines at offset ${offset}; the file has ${lines.length} lines)`;return{content:reason,summary:`read_file \xB7 ${toolRelative(ctx.cwd,abs)} (0 \u884C)`}}return{content:body+note,summary:`read_file \xB7 ${toolRelative(ctx.cwd,abs)} (${slice.length} \u884C${eol==="\r\n"?" \xB7 CRLF":""})`}}};import{mkdir,readFile as readFile4,writeFile as writeFile2}from"fs/promises";import{dirname as dirname3}from"path";var writeFileTool={name:"write_file",domain:"local",risk:"write",description:"Write the full content of a file, creating it (and parent directories) if needed. Overwrites the whole file \u2014 prefer edit_file for partial changes. The existing line ending style (LF/CRLF) is preserved.",inputSchema:{type:"object",additionalProperties:false,properties:{path:{type:"string",description:"File path, relative to the working directory"},content:{type:"string",description:"Full new content. Use \\n for li\
202
204
  ne breaks."}},required:["path","content"]},preview(input){const content=typeof input["content"]==="string"?input["content"]:"";return`write_file \xB7 ${String(input["path"]??"")} (${content.split("\n").length} \u884C)`},async prepare(input,ctx){const abs=resolveToolPath(String(input["path"]),ctx.cwd);const before=await readFile4(abs,"utf8").catch(()=>"");return{path:toolRelative(ctx.cwd,abs),before,after:String(input["content"]??"")}},async run(input,ctx){const abs=resolveToolPath(String(input["\
203
- path"]),ctx.cwd);const existing=await readFile4(abs,"utf8").catch(()=>null);const eol=existing===null?"\n":detectEol(existing);const body=applyEol(String(input["content"]),eol);await mkdir(dirname3(abs),{recursive:true});await writeFile2(abs,body,"utf8");const rel=toolRelative(ctx.cwd,abs);return{content:`Wrote ${rel} (${body.split(eol).length} lines${eol==="\r\n"?", CRLF preserved":""}).`,summary:`write_file \xB7 ${rel}`,diff:{path:rel,before:existing??"",after:String(input["content"])}}}};var RESIDENT_TOKEN_CAP=8e3;function localTools(choice=selectShell()){return[readFileTool,writeFileTool,editFileTool,createBashTool(choice),globTool,grepTool,gitTool]}function buildResidentSet(mode,opts={}){const all=opts.tools??localTools();const cap=opts.cap??RESIDENT_TOKEN_CAP;const eligible=all.filter(tool=>matchesAnyGlob(tool.name,mode.tools)&&applyPermissionMode(checkPermission(tool.name,mode),tool.risk,opts.permissionMode).decision!=="deny"&&!isWholeToolDenied(tool.name,opts.permissionLayers??[]));const tools=[];const dropped=[];
204
- let tokens=0;for(const tool of eligible){const cost=estimateToolTokens(tool);if(tokens+cost>cap){dropped.push(tool.name);continue}tools.push(tool);tokens+=cost}return{tools,wire:tools.map(toWireTool),tokens,dropped}}function estimateToolTokens(tool){return Math.ceil(JSON.stringify(toWireTool(tool)).length/4)}function matchesAnyGlob(name,patterns){return patterns.some(pattern=>globToRegExp(pattern).test(name))}function globToRegExp(pattern){const escaped=pattern.replace(/[.+?^${}()|[\]\\]/g,"\\$&").
205
- replace(/\*/g,".*");return new RegExp(`^${escaped}$`)}export{secretReason,parseRule,projectPermissionsPath,projectRootFor,persistProjectAllow,activatePermissionSettings,executeTool,buildSystemPrompt,runTurn,parseFrontMatter,lstatOrNull,findProjectTwpSubdir,activateModeFiles,describeAuditLog,createAuditLogger,currentBranch,displayCwd,resolveGitExecutable,readFileTool,RESIDENT_TOKEN_CAP,localTools,buildResidentSet};
205
+ path"]),ctx.cwd);const existing=await readFile4(abs,"utf8").catch(()=>null);const eol=existing===null?"\n":detectEol(existing);const body=applyEol(String(input["content"]),eol);await mkdir(dirname3(abs),{recursive:true});await writeFile2(abs,body,"utf8");const rel=toolRelative(ctx.cwd,abs);return{content:`Wrote ${rel} (${body.split(eol).length} lines${eol==="\r\n"?", CRLF preserved":""}).`,summary:`write_file \xB7 ${rel}`,diff:{path:rel,before:existing??"",after:String(input["content"])}}}};var RESIDENT_TOKEN_CAP=8e3;function localTools(choice=selectShell()){return[readFileTool,writeFileTool,editFileTool,createBashTool(choice),globTool,grepTool,gitTool]}function buildResidentSet(mode,opts={}){const all=opts.tools??localTools();const cap=opts.cap??RESIDENT_TOKEN_CAP;const eligible=all.filter(tool=>matchesAnyGlob(tool.name,mode.tools)&&applyPermissionMode(checkPermission(tool.name,mode),tool.risk,opts.permissionMode).decision!=="deny"&&!isWholeToolDenied(tool.name,opts.permissionLayers??[]));const usage=opts.usage;
206
+ const pinned=opts.pinned;const ordered=usage===void 0&&pinned===void 0?eligible:eligible.map((tool,i)=>({tool,i,pin:pinned?.has(tool.name)===true,uses:usage?.get(tool.name)??0})).sort((a,b)=>Number(b.pin)-Number(a.pin)||b.uses-a.uses||a.i-b.i).map(entry=>entry.tool);const tools=[];const dropped=[];let tokens=0;for(const tool of ordered){const cost=estimateToolTokens(tool);if(tokens+cost>cap){dropped.push(tool.name);continue}tools.push(tool);tokens+=cost}return{tools,wire:tools.map(toWireTool),tokens,
207
+ dropped}}function estimateToolTokens(tool){return Math.ceil(JSON.stringify(toWireTool(tool)).length/4)}function matchesAnyGlob(name,patterns){return patterns.some(pattern=>globToRegExp(pattern).test(name))}function globToRegExp(pattern){const escaped=pattern.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp(`^${escaped}$`)}var CATALOG_TOOL_PREFIX="twp_";var WIRE_NAME_RE=/^[A-Za-z0-9_-]{1,64}$/;var MAX_RESULT_CHARS=4e4;function catalogToolName(op){if(op.name.includes("_")||op.domain.includes("_"))return null;const name=`${CATALOG_TOOL_PREFIX}${op.name.replace(/\./g,"-")}_${op.domain}`;return WIRE_NAME_RE.test(name)?name:null}function parseCatalogToolName(name){if(!name.startsWith(CATALOG_TOOL_PREFIX))return null;const rest=name.slice(CATALOG_TOOL_PREFIX.length);const sep4=rest.indexOf("_");if(sep4<=0||sep4===rest.length-
208
+ 1)return null;const domain=rest.slice(sep4+1);return/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(domain)?{domain}:null}function toolRiskOf(risk){switch(risk){case"read":return"read";case"write":return"write";default:return"exec"}}var SIMPLE_TYPES=new Set(["string","integer","number","boolean","array","object"]);function paramSchema(param){const declared=param.type;const schema={};if(typeof declared==="string"&&SIMPLE_TYPES.has(declared)&&declared!=="integer"&&declared!=="number"){schema.type=declared}if(param.
209
+ description!==void 0&&param.description!=="")schema.description=param.description;return schema}function inputSchemaOf(op){const properties={};const required=[];for(const param of op.pathParams){properties[param.name]={description:param.description||`path parameter ${param.name}`};required.push(param.name)}for(const param of op.queryParams){if(Object.hasOwn(properties,param.name))continue;properties[param.name]=paramSchema(param);if(param.required)required.push(param.name)}if(op.body!==null&&op.
210
+ method!=="GET"){properties["body"]={type:"object",description:"JSON request body (see twp_describe_tools for its schema)"}}return{type:"object",properties,...required.length>0?{required}:{},additionalProperties:false}}function catalogTool(op,deps){const name=catalogToolName(op);if(name===null)return null;const summary=op.summary!==""?op.summary:`${op.method} ${op.path}`;const risk=toolRiskOf(op.risk);return{name,domain:op.domain,risk,description:`${summary} (${op.method} ${op.path})`,inputSchema:inputSchemaOf(
211
+ op),preview:input=>previewOf(op,input),run:async input=>runOperation(op,name,input,deps)}}function previewOf(op,input){let path8=op.path;for(const param of op.pathParams){const value=input[param.name];path8=path8.split(`{${param.name}}`).join(typeof value==="string"||typeof value==="number"?String(value):`{${param.name}}`)}return`${op.method} ${path8}`}function buildRequest(op,input){const errors=[];let path8=op.path;const pathNames=new Set;for(const param of op.pathParams){pathNames.add(param.name);
212
+ const raw=input[param.name];const value=typeof raw==="number"?String(raw):raw;if(!isSafePathSegment(value)){errors.push(`${param.name}: \u30D1\u30B9\u8981\u7D20\u3068\u3057\u3066\u4F7F\u3048\u306A\u3044\u5024\u3067\u3059`);continue}path8=path8.split(`{${param.name}}`).join(value)}const query={};for(const[key,value]of Object.entries(input)){if(pathNames.has(key)||key==="body")continue;query[key]=value}const body=input["body"];errors.push(...validateQuery(op.queryParams,query));if(op.body!==null&&
213
+ op.method!=="GET")errors.push(...validateBody(op.body.schema,body??{}));if(errors.length>0)return{ok:false,errors};return{ok:true,path:path8.toLowerCase().startsWith("/api/")?path8:`/api${path8}`,query,body}}async function runOperation(op,name,input,deps){const built=buildRequest(op,input);if(!built.ok){const shown=built.errors.slice(0,MAX_REPORTED_VIOLATIONS);return{content:`Invalid input for ${name}:
214
+ - ${shown.join("\n- ")}`,isError:true,summary:`${name} \xB7 \u5165\u529B\u304C\u4E0D\u6B63`}}let response;try{response=await deps.client().request(op.method,appendQuery(built.path,built.query),built.body)}catch(err){if(err instanceof ApiError){return{content:`${name} failed: ${err.message}`,isError:true,summary:`${name} \xB7 HTTP ${err.status}`}}throw err}return{content:truncate(redactSecrets(JSON.stringify(redactSecretValues(response??null),null,1))),summary:previewOf(op,input)}}function truncate(text,limit=MAX_RESULT_CHARS){
215
+ if(text.length<=limit)return text;return`${text.slice(0,limit)}
216
+ \u2026(truncated: ${text.length-limit} more characters. Narrow the request with query parameters such as limit / keyword.)`}var SEARCH_LIMIT=20;var DESCRIBE_LIMIT=10;var MOUNT_LIMIT=12;var bundledSource={index:loadCommandModelIndex,domain:loadCommandModelDomain};var TwpToolkit=class{source;client;tools=new Map;operations=new Map;loadedDomains=new Set;mountedNames=[];usage=new Map;meta;constructor(opts){this.source=opts.source??bundledSource;this.client=opts.client;this.meta=[this.domainsTool(),this.searchTool(),this.describeTool(),this.callTool(),this.mountTool()]}metaTools(){return[...this.meta]}mountedTools(){return this.
217
+ mountedNames.flatMap(name=>{const tool=this.tools.get(name);return tool?[tool]:[]})}resolveTool=name=>this.tools.get(name);prepareIndirect=async input=>{const name=input["name"]??input["tool"];if(typeof name!=="string")return;await this.ensureLoaded(name).catch(()=>void 0)};recordUse(name){this.usage.set(name,(this.usage.get(name)??0)+1)}async ensureLoaded(name){const parsed=parseCatalogToolName(name);if(parsed===null)return void 0;await this.loadDomain(parsed.domain);return this.tools.get(name)}async loadDomain(domain){
218
+ const file=await this.source.domain(domain);if(!this.loadedDomains.has(domain)){for(const op of file.operations){const tool=catalogTool(op,{client:this.client});if(tool===null||this.tools.has(tool.name))continue;const run=tool.run;this.tools.set(tool.name,{...tool,run:async(input,ctx)=>{this.recordUse(tool.name);return run(input,ctx)}});this.operations.set(tool.name,op)}this.loadedDomains.add(domain)}return file.operations}async loadAll(){const index=await this.source.index();await Promise.all(index.
219
+ domains.map(d=>this.loadDomain(d.domain).catch(()=>[])))}domainsTool(){return{name:"twp_domains",domain:"meta",risk:"read",description:"List TWP API domains (tasks, projects, attendance, sales, ...) with operation counts. Use twp_search_tools to find a specific operation.",inputSchema:{type:"object",properties:{},additionalProperties:false},preview:()=>"twp_domains",run:async()=>guarded(async()=>{const index=await this.source.index();const lines=index.domains.map(d=>`${d.domain} (${d.operationCount}\
220
+ )${d.summary!==""?`: ${d.summary}`:""}`);return{content:`${index.totals.domains} domains / ${index.totals.operations} operations
221
+ ${lines.join("\n")}`}})}}searchTool(){return{name:"twp_search_tools",domain:"meta",risk:"read",description:"Search the TWP API tool catalog. Returns tool names with a one-line summary only (no schema). Query words match tool name, domain, path and summary (Japanese summaries are common, so Japanese keywords work). Then call twp_describe_tools for the schema and twp_call to run it.",inputSchema:{type:"object",properties:{query:{type:"string",description:"Space separated keywords"},domain:{type:"s\
222
+ tring",description:"Limit the search to one domain (see twp_domains)"}},required:["query"],additionalProperties:false},preview:input=>`twp_search_tools ${String(input["query"]??"")}`,run:async input=>guarded(async()=>{const domain=typeof input["domain"]==="string"&&input["domain"]!==""?input["domain"]:null;if(domain!==null)await this.loadDomain(domain);else await this.loadAll();const all=searchCatalog([...this.operations.entries()],String(input["query"]??""),domain,Number.POSITIVE_INFINITY);if(all.
223
+ length===0)return{content:"No matching tools. Try other keywords or twp_domains."};const hits=all.slice(0,SEARCH_LIMIT);const lines=hits.map(({name,op})=>`${name} [${op.risk}] ${op.summary||`${op.method} ${op.path}`}`);if(all.length>hits.length)lines.push(`(${all.length-hits.length} more matches; narrow the query or pass domain)`);return{content:lines.join("\n")}})}}describeTool(){return{name:"twp_describe_tools",domain:"meta",risk:"read",description:`Return the full JSON Schema of the named TWP\
224
+ tools (max ${DESCRIBE_LIMIT}). Names come from twp_search_tools.`,inputSchema:{type:"object",properties:{names:{type:"array",items:{type:"string"}}},required:["names"],additionalProperties:false},preview:input=>`twp_describe_tools ${Array.isArray(input["names"])?input["names"].join(", "):""}`,run:async input=>guarded(async()=>{const requested=input["names"].filter(n=>typeof n==="string");const names=requested.slice(0,DESCRIBE_LIMIT);const out=[];for(const name of names){const tool=await this.ensureLoaded(
225
+ name).catch(()=>void 0);const op=this.operations.get(name);if(!tool||!op){out.push({name,error:"unknown tool"});continue}out.push({name,risk:op.risk,method:op.method,path:op.path,description:tool.description,input_schema:tool.inputSchema,...op.body!==null&&op.method!=="GET"?{body_schema:op.body.schema}:{},...op.resultPath!==null?{result_path:op.resultPath}:{}})}const rest=requested.length-names.length;const note=rest>0?`
226
+ (${rest} more names were not described; call again with them)`:"";return{content:truncate(JSON.stringify(out,null,1))+note}})}}callTool(){return{name:INDIRECT_TOOL,domain:"meta",risk:"read",description:"Run a TWP catalog tool by name. input is validated against the tool schema at call time. Permission is checked against the real tool name, not twp_call.",inputSchema:{type:"object",properties:{name:{type:"string",description:"Tool name from twp_search_tools (e.g. twp_list_project-task)"},input:{type:"\
227
+ object",description:"Arguments for the tool (see twp_describe_tools)"}},required:["name"],additionalProperties:false},preview:input=>{const tool=typeof input["name"]==="string"?this.tools.get(input["name"]):void 0;const inner=input["input"]??{};return tool?`${INDIRECT_TOOL} \u2192 ${safe(()=>tool.preview(inner),tool.name)}`:`${INDIRECT_TOOL} ${String(input["name"]??"")}`},run:async(input,ctx)=>guarded(async()=>{const name=String(input["name"]);const tool=this.tools.get(name)??await this.ensureLoaded(
228
+ name);if(!tool)return{content:`Unknown tool: ${name}. Use twp_search_tools.`,isError:true};const validated=validateInput(tool.inputSchema,input["input"]??{});if(!validated.ok){return{content:`Invalid input for ${name}:
229
+ - ${validated.errors.join("\n- ")}`,isError:true,summary:`${name} \xB7 \u5165\u529B\u304C\u4E0D\u6B63`}}return tool.run(validated.value,ctx)})}}mountTool(){return{name:"twp_mount",domain:"meta",risk:"read",description:`Add up to ${MOUNT_LIMIT} main tools of a TWP domain to your tool list from the next turn on (sticky for this session). Use it when you will call the same domain repeatedly; otherwise twp_call is enough.`,inputSchema:{type:"object",properties:{domain:{type:"string"}},required:["dom\
230
+ ain"],additionalProperties:false},preview:input=>`twp_mount ${String(input["domain"]??"")}`,run:async input=>guarded(async()=>{const domain=String(input["domain"]);const ops=await this.loadDomain(domain);const picked=pickMainOperations(ops).map(op=>catalogToolName(op)).filter(name=>name!==null&&this.tools.has(name));for(const name of picked)if(!this.mountedNames.includes(name))this.mountedNames.push(name);return{content:`Mounted from the next turn: ${picked.join(", ")||"(none)"}`}})}}};function pickMainOperations(ops){
231
+ const order={read:0,write:1,destructive:2};return[...ops].sort((a,b)=>order[a.risk]-order[b.risk]).slice(0,MOUNT_LIMIT)}function searchCatalog(entries,query,domain,limit=SEARCH_LIMIT){const words=query.toLowerCase().split(/\s+/).filter(w=>w!=="");if(words.length===0)return[];const hits=[];for(const[name,op]of entries){if(domain!==null&&op.domain!==domain)continue;const haystack=`${name} ${op.domain} ${op.path} ${op.summary} ${op.aliases.join(" ")}`.toLowerCase();let score=0;for(const word of words)
232
+ if(haystack.includes(word))score+=op.summary.toLowerCase().includes(word)?2:1;if(score>0)hits.push({name,op,score})}return hits.sort((a,b)=>b.score-a.score||a.name.localeCompare(b.name)).slice(0,limit)}async function guarded(fn){try{return await fn()}catch(err){if(err instanceof CommandModelMissingError)return{content:err.message,isError:true};throw err}}function safe(fn,fallback){try{return fn()}catch{return fallback}}function createTwpToolkit(runtime,cliVersion){let client=null;return new TwpToolkit({client:()=>{client??=new TwpApiClient(runtime.apiUrl,runtime.session??new AuthSession(runtime.profileName,runtime.apiUrl),httpFetch,cliVersion);return client}})}function residentInputs(toolkit,local=localTools()){const meta=toolkit.metaTools();return{tools:[...local,...meta,...toolkit.mountedTools()],usage:toolkit.usage,pinned:new Set([...local,...meta].map(t=>t.name))}}export{secretReason,parseRule,projectPermissionsPath,projectRootFor,persistProjectAllow,activatePermissionSettings,executeTool,buildSystemPrompt,runTurn,parseFrontMatter,lstatOrNull,findProjectTwpSubdir,activateModeFiles,describeAuditLog,createAuditLogger,currentBranch,displayCwd,resolveGitExecutable,readFileTool,RESIDENT_TOKEN_CAP,localTools,buildResidentSet,createTwpToolkit,residentInputs};
@@ -0,0 +1,3 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ import{redactSecretValues,redactSecrets}from"./chunk-EQWW2F5V.js";import{formatOutput}from"./chunk-K2ONOH3L.js";function renderOutput(value,format,noRedact=false){if(noRedact)return formatOutput(value,format);return redactSecrets(formatOutput(redactSecretValues(value),format))}export{renderOutput};
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{formatOutput}from"./chunk-K2ONOH3L.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";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}"\\\
3
+ import{stripTerminalControls}from"./chunk-NHYMHCAT.js";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}"\\\
4
4
  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===
5
5
  "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}`})}
6
6
  var BODY_LIMIT=4e3;function formatBody(raw){const safe=redactSecrets(stripTerminalControls(raw));return safe.length>BODY_LIMIT?`${safe.slice(0,BODY_LIMIT)}
@@ -9,4 +9,4 @@ var BODY_LIMIT=4e3;function formatBody(raw){const safe=redactSecrets(stripTermin
9
9
  `);const started=now();let res;try{res=await inner(input,init)}catch(err){write(`[debug] \u2717 \u901A\u4FE1\u306B\u5931\u6557\u3057\u307E\u3057\u305F (${now()-started}ms): ${redactSecrets(err.message)}
10
10
  `);throw err}const out=[`[debug] \u2190 ${res.status} ${res.statusText} (${now()-started}ms)`,...formatHeaders(res.headers)];const contentType=res.headers.get("content-type");if(isTextualContentType(contentType)){const raw=await res.clone().text().catch(()=>"\uFF08\u672C\u6587\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F\uFF09");if(raw!=="")out.push(` ${formatBody(raw)}`)}else{const length=res.headers.get("content-length");out.push(` \uFF08\u672C\u6587\u306F ${contentType??"content-ty\
11
11
  pe \u4E0D\u660E"}\u30FB${length===null?"\u30B5\u30A4\u30BA\u4E0D\u660E":`${length} \u30D0\u30A4\u30C8`}\u3002\u30C6\u30AD\u30B9\u30C8\u3067\u306A\u3044\u305F\u3081\u51FA\u529B\u3057\u306A\u3044\uFF09`)}write(`${out.join("\n")}
12
- `);return res}}function renderOutput(value,format,noRedact=false){if(noRedact)return formatOutput(value,format);return redactSecrets(formatOutput(redactSecretValues(value),format))}export{redactSecrets,redactSecretValues,withDebug,renderOutput};
12
+ `);return res}}export{redactSecrets,redactSecretValues,withDebug};
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{isModeId,isPermissionModeId}from"./chunk-BOBSH3QN.js";import{API_TOKEN,HELP_TOKEN,isDomainName}from"./chunk-PEGUHUTD.js";import{splitFlagToken}from"./chunk-QQRJLH6B.js";var BUILTIN_COMMANDS=["login","logout","whoami","update","task-loop"];var TASK_LOOP_ACTIONS=["run","status","stop","schedule","setup","charter"];var VALUE_FLAGS=new Set(["-p","--print","--profile","--tenant","--mode","--permission-mode","--model","--allowed-tools","--disallowed-tools","--project","--engine","--interval","--max-cycles","--ai","--workspace","--ai-config-file","--now","--counts","--gate","--file","--out","--revision","--output","--query"]);var BOOLEAN_FLAGS=new Set(["-h","--help","\
3
+ import{isModeId,isPermissionModeId}from"./chunk-NAUH75MM.js";import{API_TOKEN,HELP_TOKEN,isDomainName}from"./chunk-PEGUHUTD.js";import{splitFlagToken}from"./chunk-QQRJLH6B.js";var BUILTIN_COMMANDS=["login","logout","whoami","update","task-loop"];var TASK_LOOP_ACTIONS=["run","status","stop","schedule","setup","charter"];var VALUE_FLAGS=new Set(["-p","--print","--profile","--tenant","--mode","--permission-mode","--model","--allowed-tools","--disallowed-tools","--project","--engine","--interval","--max-cycles","--ai","--workspace","--ai-config-file","--now","--counts","--gate","--file","--out","--revision","--output","--query"]);var BOOLEAN_FLAGS=new Set(["-h","--help","\
4
4
  -v","--version","--no-tui","--doctor","--password","--token","--no-browser","--safe","--daemon","--force-runner","--force","--drain","--yes","-y","--no-ai-config-file","--verbose","--dry-run","--debug","--refresh"]);function dispatch(argv,limit=2){const tokens=[];const indexes=[];let truncated=false;for(let i=0;i<argv.length;i++){const arg=argv[i];if(arg===void 0)continue;if(arg.startsWith("-")&&arg!=="-"){const{name,value:inline}=splitFlagToken(arg);if(BOOLEAN_FLAGS.has(name)){if(inline!==void 0){
5
5
  truncated=true;break}continue}if(VALUE_FLAGS.has(name)){if(inline!==void 0)continue;const next=argv[i+1];if(next!==void 0&&(!next.startsWith("-")||next==="-"))i++;continue}truncated=true;break}if(arg===""||arg==="-")continue;if(tokens.length>=limit)break;tokens.push(arg);indexes.push(i)}return{tokens,indexes,truncated}}function isBuiltin(token){return token!==void 0&&BUILTIN_COMMANDS.includes(token)}function isTaskLoopAction(token){return token!==void 0&&TASK_LOOP_ACTIONS.includes(token)}function resolveRoute(result){
6
6
  const{tokens,indexes}=result;const[first,second]=tokens;const firstIndex=indexes[0];if(first===void 0||firstIndex===void 0)return{kind:"none",consumed:[]};const consumed=[firstIndex];const secondIndex=indexes[1];if(isBuiltin(first)){if(first==="task-loop"&&isTaskLoopAction(second)){if(secondIndex!==void 0)consumed.push(secondIndex);return{kind:"builtin",command:first,action:second,consumed}}return{kind:"builtin",command:first,...first==="task-loop"?{action:"run"}:{},consumed}}if(second!==void 0&&
@@ -0,0 +1,10 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ var MODE_IDS=["dev","biz","plan"];function isModeId(value){return value!==void 0&&MODE_IDS.includes(value)}var MODES=[{id:"dev",label:"\u958B\u767A",color:"green",description:"\u30ED\u30FC\u30AB\u30EB\u30C4\u30FC\u30EB\u5168\u90E8 \uFF0B \u958B\u767A\u7CFB TWP \u30C9\u30E1\u30A4\u30F3\u5E38\u99D0",tools:["read_file","write_file","edit_file","bash","shell","glob","grep","git","twp_*"],permissions:{read_file:"allow",glob:"allow",grep:"allow",git:"ask","twp_get_project-task":"allow","twp_list_proje\
4
+ ct-task":"allow",twp_domains:"allow",twp_search_tools:"allow",twp_describe_tools:"allow",twp_mount:"allow","twp_update_project-task":"ask",bash:"ask",shell:"ask",write_file:"ask",edit_file:"ask","*":"ask"}},{id:"biz",label:"\u696D\u52D9",color:"cyan",description:"TWP \u30C9\u30E1\u30A4\u30F3\u4E2D\u5FC3\u3002bash \u3068 write_file \u306F deny",tools:["twp_*","read_file","glob","grep"],permissions:{read_file:"allow",glob:"allow",grep:"allow","twp_get_project-task":"allow","twp_list_project-task":"\
5
+ allow",twp_domains:"allow",twp_search_tools:"allow",twp_describe_tools:"allow",twp_mount:"allow","twp_update_project-task":"ask",bash:"deny",shell:"deny",git:"deny",write_file:"deny",edit_file:"deny","*":"ask"}},{id:"plan",label:"\u30D7\u30E9\u30F3",color:"magenta",description:"\u8AAD\u307F\u53D6\u308A\u306E\u307F\u3002\u5168\u66F8\u304D\u8FBC\u307F deny",tools:["read_file","glob","grep","twp_get_*","twp_list_*","twp_domains","twp_search_tools","twp_describe_tools","twp_mount"],permissions:{read_file:"\
6
+ allow",glob:"allow",grep:"allow","twp_get_project-task":"allow","twp_list_project-task":"allow",twp_domains:"allow",twp_search_tools:"allow",twp_describe_tools:"allow",twp_mount:"allow",bash:"deny",shell:"deny",git:"deny",write_file:"deny",edit_file:"deny","*":"deny"}}];var activeModeList=MODES;var activeModeSources=new Map;function setActiveModes(modes,sources=new Map){activeModeList=MODES.map(builtin=>modes.find(m=>m.id===builtin.id)??builtin);activeModeSources=sources}function modeSource(id){
7
+ return activeModeSources.get(id)??null}function getMode(id){const found=activeModeList.find(m=>m.id===id);if(!found)throw new Error(`unknown mode: ${id}`);return found}function nextMode(id){const i=activeModeList.findIndex(m=>m.id===id);const next=activeModeList[(i+1)%activeModeList.length];return next?next.id:"dev"}function checkPermission(toolName,mode){const own=key=>Object.hasOwn(mode.permissions,key)?mode.permissions[key]:void 0;const found=own(toolName)??own("*");return found==="allow"||found==="ask"||found==="deny"?found:"ask"}var PERMISSION_MODE_IDS=["plan","acceptEdits","denyAll"];function isPermissionModeId(value){return value!==void 0&&PERMISSION_MODE_IDS.includes(value)}function describePermissionMode(permissionMode){if(permissionMode===void 0)return"\u672A\u6307\u5B9A\uFF08\u30E2\u30FC\u30C9\u306E\u65B9\u91DD\u306E\u307E\u307E\uFF09";switch(permissionMode){case"plan":return"plan\uFF08read \u306E\u307F\u8A31\u53EF\u3002write / exec \u306F\u62D2\u5426\uFF09";case"acceptEdits":return"acceptEdits\uFF08write \u306E\u78BA\u8A8D\u3092\u81EA\u52D5\u627F\u8A8D\u3002read\
8
+ / exec \u306F\u30E2\u30FC\u30C9\u306E\u307E\u307E\uFF09";case"denyAll":return"denyAll\uFF08read \u3092\u542B\u3080\u5168\u30C4\u30FC\u30EB\u3092\u62D2\u5426\uFF09";default:{const exhaustive=permissionMode;return`${String(exhaustive)}\uFF08\u4E0D\u660E\u306A\u5024\u3002\u5B89\u5168\u5074\u3067\u5168\u62D2\u5426\uFF09`}}}function applyPermissionMode(decision,risk,permissionMode){if(permissionMode===void 0)return{decision,reason:null};if(decision==="deny")return{decision,reason:null};switch(permissionMode){case"\
9
+ denyAll":return{decision:"deny",reason:"permission-mode=denyAll\uFF08\u5168\u30C4\u30FC\u30EB\u3092\u62D2\u5426\uFF09"};case"plan":if(risk==="read")return{decision,reason:null};return{decision:"deny",reason:`permission-mode=plan\uFF08${risk} \u30C4\u30FC\u30EB\u3092\u62D2\u5426\uFF09`};case"acceptEdits":if(risk==="write"&&decision==="ask"){return{decision:"allow",reason:"permission-mode=acceptEdits\uFF08write \u3092\u81EA\u52D5\u627F\u8A8D\uFF09"}}return{decision,reason:null};default:return{decision:"\
10
+ deny",reason:"\u4E0D\u660E\u306A permission-mode\uFF08\u5B89\u5168\u5074\u3067\u62D2\u5426\uFF09"}}}export{isModeId,MODES,setActiveModes,modeSource,getMode,nextMode,checkPermission,isPermissionModeId,describePermissionMode,applyPermissionMode};
@@ -0,0 +1,18 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ 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(
4
+ 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}
5
+ \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 indexCache=null;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.
6
+ parse(await readFile(path,"utf8"))}catch(cause){throw new CommandModelMissingError(`${path} \u3092\u8AAD\u3081\u307E\u305B\u3093\uFF08${cause.message}\uFF09`)}}async function loadCommandModelIndex(){indexCache??=await readJson("index.json");return indexCache}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(
7
+ "_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;if(!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(domain)){throw new CommandModelMissingError(`\u30C9\u30E1\u30A4\u30F3\u540D\u3068\u3057\u3066\u4E0D\u6B63\u3067\u3059: ${domain}`)}const file=await readJson(`${domain}.json`);if(typeof file?.domain!==
8
+ "string"||!Array.isArray(file?.operations)){throw new CommandModelMissingError(`${domain}.json \u306E\u5F62\u304C\u9055\u3044\u307E\u3059\uFF08domain / operations \u304C\u8AAD\u3081\u307E\u305B\u3093\uFF09`)}domainCache.set(domain,file);return file}var MAX_REPORTED_VIOLATIONS=20;function isRecord(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function typesOf(schema){const type=schema["type"];if(typeof type==="string")return[type];if(Array.isArray(type)&&type.every(t=>typeof t==="string"))return type;return null}var INTEGER_STRING=/^[+-]?\d+$/;var BOOLEAN_STRINGS=new Set(["0","1","true","false","yes","no","on","off"]);var NUMBER_STRING=/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?$/;function matchesType(type,value){switch(type){case"\
9
+ null":return value===null;case"string":return typeof value==="string";case"integer":return typeof value==="number"&&Number.isInteger(value)||typeof value==="string"&&INTEGER_STRING.test(value);case"number":return typeof value==="number"&&Number.isFinite(value)||typeof value==="string"&&NUMBER_STRING.test(value);case"boolean":return typeof value==="boolean"||value===0||value===1||typeof value==="string"&&BOOLEAN_STRINGS.has(value.toLowerCase());case"array":case"object":return typeof value==="obje\
10
+ ct"&&value!==null;default:return true}}function describe(value){if(value===null)return"null";if(Array.isArray(value))return"\u914D\u5217";if(typeof value==="object")return"\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8";if(typeof value==="string")return`\u6587\u5B57\u5217\uFF08${[...value].length} \u6587\u5B57\uFF09`;return`${typeof value==="number"?"\u6570\u5024":typeof value==="boolean"?"\u771F\u507D\u5024":typeof value} ${String(value)}`}function numericValue(value){if(typeof value==="number")return value;
11
+ if(typeof value==="string"&&NUMBER_STRING.test(value))return Number(value);return null}var PHP_DELIMITED=/^([^A-Za-z0-9\\\s^])[\s\S]*\1[A-Za-z]*$/;function compilePattern(pattern){if(PHP_DELIMITED.test(pattern))return null;try{return new RegExp(pattern,"u")}catch{return null}}function walk(schema,value,at,out){if(!isRecord(schema))return;const types=typesOf(schema);if(types!==null&&!types.some(type=>matchesType(type,value))){out.push(`${at}: ${types.join(" / ")} \u3092\u671F\u5F85\u3057\u307E\u3057\u305F\u304C ${describe(
12
+ value)} \u3067\u3059`);return}if(value===null)return;const enumValues=schema["enum"];if(Array.isArray(enumValues)&&enumValues.length>0){const allowed=enumValues.filter(item=>item!==null).map(item=>String(item));if(!allowed.includes(String(value))){out.push(`${at}: ${allowed.join(" / ")} \u306E\u3044\u305A\u308C\u304B\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u53D7\u3051\u53D6\u3063\u305F\u5024: ${describe(value)}\uFF09`)}}if(typeof value==="string"){const length=[...value].length;
13
+ const max=schema["maxLength"];const min=schema["minLength"];if(typeof max==="number"&&length>max)out.push(`${at}: ${max} \u6587\u5B57\u4EE5\u5185\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08${length} \u6587\u5B57\uFF09`);if(typeof min==="number"&&length<min)out.push(`${at}: ${min} \u6587\u5B57\u4EE5\u4E0A\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08${length} \u6587\u5B57\uFF09`);const pattern=schema["pattern"];if(typeof pattern==="string"){const re=compilePattern(pattern);if(re!==null&&!re.
14
+ test(value))out.push(`${at}: \u5F62\u5F0F\u304C\u9055\u3044\u307E\u3059\uFF08${pattern}\uFF09`)}}const numeric=types?.some(type=>type==="integer"||type==="number")?numericValue(value):null;if(numeric!==null){const minimum=schema["minimum"];const maximum=schema["maximum"];if(typeof minimum==="number"&&numeric<minimum)out.push(`${at}: ${minimum} \u4EE5\u4E0A\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08${numeric}\uFF09`);if(typeof maximum==="number"&&numeric>maximum)out.push(`${at}: ${maximum} \u4EE5\
15
+ \u4E0B\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08${numeric}\uFF09`)}if(Array.isArray(value)){const maxItems=schema["maxItems"];const minItems=schema["minItems"];if(typeof maxItems==="number"&&value.length>maxItems)out.push(`${at}: \u8981\u7D20\u306F ${maxItems} \u4EF6\u4EE5\u5185\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08${value.length} \u4EF6\uFF09`);if(typeof minItems==="number"&&value.length<minItems)out.push(`${at}: \u8981\u7D20\u306F ${minItems} \u4EF6\u4EE5\u4E0A\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08${value.
16
+ length} \u4EF6\uFF09`);if(isRecord(schema["items"]))value.forEach((item,i)=>walk(schema["items"],item,`${at}[${i}]`,out));return}if(isRecord(value)){const required=schema["required"];if(Array.isArray(required)){for(const key of required){if(typeof key==="string"&&!Object.prototype.hasOwnProperty.call(value,key))out.push(`${at}.${key}: \u5FC5\u9808\u3067\u3059`)}}const properties=schema["properties"];if(isRecord(properties)){for(const[key,child]of Object.entries(properties)){if(Object.prototype.hasOwnProperty.
17
+ call(value,key))walk(child,value[key],`${at}.${key}`,out)}}}}function validateBody(schema,body){const out=[];walk(schema,body,"body",out);return out}function validateQuery(params,query){const out=[];for(const param of params){const has=Object.prototype.hasOwnProperty.call(query,param.name)&&query[param.name]!==void 0;if(!has){if(param.required)out.push(`query.${param.name}: \u5FC5\u9808\u3067\u3059`);continue}if(param.source!=="spec")continue;const declared=param.type;const types=typeof declared===
18
+ "string"?[declared]:Array.isArray(declared)?declared.filter(t=>typeof t==="string"):[];const checked=types.filter(type=>type==="integer"||type==="number"||type==="boolean");if(checked.length===0||types.includes("string"))continue;const raw=query[param.name];if(types.includes("null")&&raw==="")continue;if(!checked.some(type=>matchesType(type,raw))){out.push(`query.${param.name}: ${checked.join(" / ")} \u3092\u671F\u5F85\u3057\u307E\u3057\u305F\u304C ${describe(raw)} \u3067\u3059`)}}return out}export{CommandModelMissingError,loadCommandModelIndex,loadCommandModelRoutes,loadCommandModelDomain,MAX_REPORTED_VIOLATIONS,validateBody,validateQuery};
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{createRuntime}from"./chunk-PI5DUWNZ.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{findExecutable}from"./chunk-PMOUHEJQ.js";import{describeAutoUpdate}from"./chunk-DSDVIU6A.js";import{PACKAGE_NAME,UPDATE_COMMAND,compareVersionCores,isBelowMinSupported,parseVersionCore}from"./chunk-DXXFUNYN.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.
3
+ import{createRuntime}from"./chunk-WOUKWOAR.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{findExecutable}from"./chunk-PMOUHEJQ.js";import{describeAutoUpdate}from"./chunk-DSDVIU6A.js";import{PACKAGE_NAME,UPDATE_COMMAND,compareVersionCores,isBelowMinSupported,parseVersionCore}from"./chunk-DXXFUNYN.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
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
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
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(
@@ -38,4 +38,4 @@ break;const orphanResult=hasToolResult(head2)&&this.messages.length>1;if(head2.r
38
38
  const freed=before-lengthOf(head);this.lastPromptTokens=Math.max(0,this.lastPromptTokens-Math.ceil(freed/4));this.pendingChars=Math.max(0,this.pendingChars-freed);dropped+=1}this.droppedMessages+=dropped;return dropped}estimatedPromptTokens(){if(this.lastPromptTokens===0){return Math.ceil(this.totalChars()/4)}return this.lastPromptTokens+Math.ceil(this.pendingChars/4)}snapshot(){const used=this.estimatedPromptTokens();const remaining=Math.round((this.contextWindowTokens-used)/this.contextWindowTokens*
39
39
  100);return{totals:{...this.totals},turns:this.turns,lastPromptTokens:this.lastPromptTokens,remainingPercent:Math.max(0,Math.min(100,remaining)),droppedMessages:this.droppedMessages}}totalChars(){return this.messages.reduce((sum,m)=>sum+lengthOf(m),0)}};function lengthOf(message){return message.content.reduce((sum,block)=>sum+blockLength(block),0)}function copyBlock(block){return block.type==="tool_use"?{...block,input:{...block.input}}:{...block}}function hasToolResult(message){return message.content.
40
40
  some(block=>block.type==="tool_result")}function createRuntime(opts){const env=opts.env??process.env;const cwd=opts.cwd??process.cwd();const profile=resolveProfile(opts.profile,env,cwd);const creds=loadCredentials(profile.name,env);const apiUrl=effectiveApiUrl(profile,creds?.api_url,env);const relayUrl=effectiveRelayUrl(profile,creds?.relay_url,env);const session=new AuthSession(profile.name,apiUrl,env);const client=new RelayClient(relayUrl,session,httpFetch,opts.cliVersion);const configured=resolveConfiguredModel(opts.model,profile.name,
41
- env,cwd);return{profileName:profile.name,apiUrl,relayUrl,client,context:new ContextManager,loggedIn:creds!==null,configuredModel:configured?.model??null,loadCatalog:()=>loadCatalog(client,profile.name,relayUrl,env),loadCachedFloor:()=>loadCachedVersionFloor(profile.name,relayUrl,env)}}export{modelLabel,toModelInfos,emptyUsage,RelayError,DEFAULT_MAX_TOKENS,builtinCatalog,loadCachedCatalog,pickModel,createRuntime};
41
+ env,cwd);return{profileName:profile.name,apiUrl,relayUrl,client,session,context:new ContextManager,loggedIn:creds!==null,configuredModel:configured?.model??null,loadCatalog:()=>loadCatalog(client,profile.name,relayUrl,env),loadCachedFloor:()=>loadCachedVersionFloor(profile.name,relayUrl,env)}}export{modelLabel,toModelInfos,emptyUsage,RelayError,DEFAULT_MAX_TOKENS,builtinCatalog,loadCachedCatalog,pickModel,createRuntime};
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __twpCreateRequire } from 'node:module';
3
3
  const require = __twpCreateRequire(import.meta.url);
4
- import{parseArgv}from"./chunk-I2QFW7EK.js";import"./chunk-BOBSH3QN.js";import{GLOBAL_OPTIONS_HELP}from"./chunk-TAN5I2DP.js";import"./chunk-PEGUHUTD.js";import"./chunk-QQRJLH6B.js";import"./chunk-VSJBJXZO.js";var VERSION=true?"0.22.0":"0.0.0-dev";var HELP=`twp ${VERSION} \u2014 TWP CLI
4
+ import{parseArgv}from"./chunk-LD3AKGH6.js";import"./chunk-NAUH75MM.js";import{GLOBAL_OPTIONS_HELP}from"./chunk-TAN5I2DP.js";import"./chunk-PEGUHUTD.js";import"./chunk-QQRJLH6B.js";import"./chunk-VSJBJXZO.js";var VERSION=true?"0.23.0":"0.0.0-dev";var HELP=`twp ${VERSION} \u2014 TWP CLI
5
5
 
6
6
  \u4F7F\u3044\u65B9:
7
7
  twp \u5BFE\u8A71 TUI \u3092\u8D77\u52D5
@@ -57,7 +57,7 @@ import{parseArgv}from"./chunk-I2QFW7EK.js";import"./chunk-BOBSH3QN.js";import{GL
57
57
  twp --allowed-tools <\u898F\u5247>
58
58
  twp --disallowed-tools <\u898F\u5247>
59
59
  \u6A29\u9650\u30EB\u30FC\u30EB\u3092\u8FFD\u52A0\uFF08Claude Code \u4E92\u63DB\u3002\u4F8B: "Bash(git status:*)",
60
- "Write(src/**)", twp_update_task\u3002\u30AB\u30F3\u30DE\u533A\u5207\u308A\u30FB\u7E70\u308A\u8FD4\u3057\u53EF\uFF09\u3002
60
+ "Write(src/**)", twp_update_project-task\u3002\u30AB\u30F3\u30DE\u533A\u5207\u308A\u30FB\u7E70\u308A\u8FD4\u3057\u53EF\uFF09\u3002
61
61
  deny \u306F\u5E38\u306B\u52DD\u3064\uFF08--allowed-tools \u3067\u3082\u30E2\u30FC\u30C9\u306E deny \u306F\u8986\u3089\u306A\u3044\uFF09\u3002
62
62
  \u30D5\u30A1\u30A4\u30EB\u3067\u306F ~/.twp/settings.json \u306E permissions.allow/ask/deny\u3002
63
63
  .twp/settings*.json\uFF08\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u914D\u4E0B\uFF09\u306F\u7DE0\u3081\u308B\u5411\u304D\u306B\u3057\u304B\u52B9\u304B\u306A\u3044
@@ -151,17 +151,17 @@ TUI \u5185:
151
151
  \u81EA\u52D5\u524A\u9664\u3002POSIX \u3067\u306F 0600 / Windows \u306F OS \u65E2\u5B9A\u306E ACL\uFF09\u3002
152
152
  \u672C\u6587\u30FB\u5DEE\u5206\u306F\u66F8\u304B\u306A\u3044\u3002TWP_NO_AUDIT=1 \u3067\u7121\u52B9\u5316
153
153
 
154
- \u26A0 **\u30E2\u30C7\u30EB\u304C\u4F1A\u8A71\u4E2D\u306B\u547C\u3076**\u30C4\u30FC\u30EB\uFF08twp_*\uFF09\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093\u3002
155
- \u4E0A\u306E\u300C\u30C9\u30E1\u30A4\u30F3\u30B3\u30DE\u30F3\u30C9\u300D\u306F\u5229\u7528\u8005\u304C\u76F4\u63A5\u6253\u3064\u3082\u306E\u3067\u3001\u3053\u3061\u3089\u306F\u5B9F\u7269\u3068\u3057\u3066\u52D5\u304D\u307E\u3059\u3002
154
+ \u4F1A\u8A71\u4E2D\u306F\u30E2\u30C7\u30EB\u304C TWP \u306E\u30E1\u30BF\u30C4\u30FC\u30EB\uFF08twp_search_tools \u2192 twp_describe_tools \u2192 twp_call\uFF09\u3067
155
+ TWP API \u3092\u547C\u3079\u307E\u3059\u3002TWP API \u306E\u30C4\u30FC\u30EB\u306F\u65E2\u5B9A\u3067\u78BA\u8A8D\u304C\u51FA\u307E\u3059\uFF08-p \u3067\u306F\u62D2\u5426\u3002--allowed-tools \u3067\u540D\u524D\u3092\u8A31\u53EF\uFF09\u3002
156
156
  \u4F1A\u8A71\u30FB\u30ED\u30FC\u30AB\u30EB\u30C4\u30FC\u30EB\uFF08\u30D5\u30A1\u30A4\u30EB\u30FB\u30B3\u30DE\u30F3\u30C9\u30FBgit\uFF09\u306F\u30C6\u30CA\u30F3\u30C8\u306E\u30AF\u30EC\u30B8\u30C3\u30C8\u3067\u5B9F\u969B\u306B\u52D5\u304D\u307E\u3059\u3002
157
157
  `;function ignoreEpipe(stream){stream.on("error",err=>{if(err.code==="EPIPE")process.exit(0);throw err})}async function main(){const nodeMajor=Number(process.versions.node.split(".")[0]);if(nodeMajor<22){process.stderr.write(`twp-cli \u306B\u306F Node.js 22 \u4EE5\u4E0A\u304C\u5FC5\u8981\u3067\u3059\uFF08\u73FE\u5728: ${process.versions.node}\uFF09
158
- `);process.exit(1)}ignoreEpipe(process.stdout);ignoreEpipe(process.stderr);if(process.env["TWP_AUTO_UPDATE_WORKER"]==="1"){const{runAutoUpdateWorker}=await import("./auto-update-worker-Z3XKBFMQ.js");await runAutoUpdateWorker().catch(()=>void 0);return}const args=parseArgv(process.argv.slice(2));if(args.command==="version"){process.stdout.write(`${VERSION}
158
+ `);process.exit(1)}ignoreEpipe(process.stdout);ignoreEpipe(process.stderr);if(process.env["TWP_AUTO_UPDATE_WORKER"]==="1"){const{runAutoUpdateWorker}=await import("./auto-update-worker-SI7TVSCN.js");await runAutoUpdateWorker().catch(()=>void 0);return}const args=parseArgv(process.argv.slice(2));if(args.command==="version"){process.stdout.write(`${VERSION}
159
159
  `);return}if(args.command==="help"){process.stdout.write(HELP);return}if(args.unknown.length>0){process.stderr.write(`\u4E0D\u660E\u306A\u5F15\u6570: ${args.unknown.join(" ")}
160
160
 
161
- ${HELP}`);process.exitCode=2;return}const autoUpdate=await import("./auto-update-FBZGOQFI.js");autoUpdate.registerRunning();if(args.command==="task-loop"){process.env[autoUpdate.DISABLE_ENV]="1"}else if(args.command!=="update"){autoUpdate.onStartup(VERSION)}if(args.command==="domain"&&args.domain!==void 0){const{runDomain}=await import("./run-IS46BQBB.js");process.exitCode=await runDomain({domain:args.domain,...args.operation!==void 0?{operation:args.operation}:{},argv:args.domainArgv,help:args.
162
- domainHelp,globals:{...args.profile!==void 0?{profile:args.profile}:{},...args.output!==void 0?{output:args.output}:{},...args.query!==void 0?{query:args.query}:{},dryRun:args.dryRun,debug:args.debug,yes:args.yes,refresh:args.refresh},version:VERSION});return}if(args.command==="api"){const{runApiCommand}=await import("./api-command-Q2CSB4PV.js");process.exitCode=await runApiCommand({argv:args.domainArgv,help:args.domainHelp,globals:{...args.profile!==void 0?{profile:args.profile}:{},...args.output!==
163
- void 0?{output:args.output}:{},...args.query!==void 0?{query:args.query}:{},dryRun:args.dryRun,debug:args.debug,yes:args.yes},version:VERSION});return}if(args.command==="update"){const{runUpdate}=await import("./update-3QHRK5BP.js");process.exitCode=await runUpdate({...args.profile!==void 0?{profile:args.profile}:{},version:VERSION});return}if(args.command==="login"||args.command==="logout"||args.command==="whoami"){const{runLogin,runLogout,runWhoami}=await import("./commands-NXBQ5OWL.js");
164
- const options={profile:args.profile,method:args.loginMethod,tenant:args.tenant,noBrowser:args.loginNoBrowser,cliVersion:VERSION,force:args.logoutForce,...args.output!==void 0?{output:args.output}:{},...args.query!==void 0?{query:args.query}:{}};const runner=args.command==="login"?runLogin:args.command==="logout"?runLogout:runWhoami;process.exitCode=await runner(options);return}if(args.command==="task-loop"){const{runTaskLoop}=await import("./commands-ET4F34OD.js");process.exitCode=await runTaskLoop(
161
+ ${HELP}`);process.exitCode=2;return}const autoUpdate=await import("./auto-update-FBZGOQFI.js");autoUpdate.registerRunning();if(args.command==="task-loop"){process.env[autoUpdate.DISABLE_ENV]="1"}else if(args.command!=="update"){autoUpdate.onStartup(VERSION)}if(args.command==="domain"&&args.domain!==void 0){const{runDomain}=await import("./run-XCAJDHFU.js");process.exitCode=await runDomain({domain:args.domain,...args.operation!==void 0?{operation:args.operation}:{},argv:args.domainArgv,help:args.
162
+ domainHelp,globals:{...args.profile!==void 0?{profile:args.profile}:{},...args.output!==void 0?{output:args.output}:{},...args.query!==void 0?{query:args.query}:{},dryRun:args.dryRun,debug:args.debug,yes:args.yes,refresh:args.refresh},version:VERSION});return}if(args.command==="api"){const{runApiCommand}=await import("./api-command-CLARDKAL.js");process.exitCode=await runApiCommand({argv:args.domainArgv,help:args.domainHelp,globals:{...args.profile!==void 0?{profile:args.profile}:{},...args.output!==
163
+ void 0?{output:args.output}:{},...args.query!==void 0?{query:args.query}:{},dryRun:args.dryRun,debug:args.debug,yes:args.yes},version:VERSION});return}if(args.command==="update"){const{runUpdate}=await import("./update-TVVBJNN7.js");process.exitCode=await runUpdate({...args.profile!==void 0?{profile:args.profile}:{},version:VERSION});return}if(args.command==="login"||args.command==="logout"||args.command==="whoami"){const{runLogin,runLogout,runWhoami}=await import("./commands-BE67IDNQ.js");
164
+ const options={profile:args.profile,method:args.loginMethod,tenant:args.tenant,noBrowser:args.loginNoBrowser,cliVersion:VERSION,force:args.logoutForce,...args.output!==void 0?{output:args.output}:{},...args.query!==void 0?{query:args.query}:{}};const runner=args.command==="login"?runLogin:args.command==="logout"?runLogout:runWhoami;process.exitCode=await runner(options);return}if(args.command==="task-loop"){const{runTaskLoop}=await import("./commands-JNG5TZ77.js");process.exitCode=await runTaskLoop(
165
165
  {action:args.taskLoopAction??"run",project:args.project,profile:args.profile,safe:args.safe,daemon:args.daemon,interval:args.interval,maxCycles:args.maxCycles,forceRunner:args.forceRunner,force:args.stopForce,drain:args.stopDrain,engine:args.engine,version:VERSION,verbose:args.verbose,scheduleNow:args.scheduleNow,scheduleCounts:args.scheduleCounts,scheduleGate:args.scheduleGate,charterOp:args.charterOp,charterInput:args.charterFile,charterOutput:args.charterOut,charterRevision:args.charterRevision,
166
- yes:args.yes,ais:args.ais,workspace:args.workspace,aiConfigFile:args.aiConfigFile,noAiConfigFile:args.noAiConfigFile});return}if(args.command==="print"){const{runOneShot}=await import("./oneshot-QVFA2SUM.js");process.exitCode=await runOneShot({prompt:args.prompt??"",fromStdin:args.promptFromStdin,mode:args.mode??"dev",...args.permissionMode!==void 0?{permissionMode:args.permissionMode}:{},allowedTools:args.allowedTools,disallowedTools:args.disallowedTools,...args.model!==void 0?{model:args.model}:
167
- {},...args.profile!==void 0?{profile:args.profile}:{},version:VERSION});return}const{startTui}=await import("./app-THTQX3A5.js");await startTui({mode:args.mode,permissionMode:args.permissionMode,allowedTools:args.allowedTools,disallowedTools:args.disallowedTools,model:args.model,profile:args.profile,noTui:args.noTui||!process.stdout.isTTY,doctor:args.doctor,version:VERSION})}await main();
166
+ yes:args.yes,ais:args.ais,workspace:args.workspace,aiConfigFile:args.aiConfigFile,noAiConfigFile:args.noAiConfigFile});return}if(args.command==="print"){const{runOneShot}=await import("./oneshot-NA756EBO.js");process.exitCode=await runOneShot({prompt:args.prompt??"",fromStdin:args.promptFromStdin,mode:args.mode??"dev",...args.permissionMode!==void 0?{permissionMode:args.permissionMode}:{},allowedTools:args.allowedTools,disallowedTools:args.disallowedTools,...args.model!==void 0?{model:args.model}:
167
+ {},...args.profile!==void 0?{profile:args.profile}:{},version:VERSION});return}const{startTui}=await import("./app-X3IKIAKB.js");await startTui({mode:args.mode,permissionMode:args.permissionMode,allowedTools:args.allowedTools,disallowedTools:args.disallowedTools,model:args.model,profile:args.profile,noTui:args.noTui||!process.stdout.isTTY,doctor:args.doctor,version:VERSION})}await main();
@@ -55,7 +55,7 @@ ation/json",Authorization:`Bearer ${creds.token}`}}).then(res=>res.ok,()=>false)
55
55
  `);if(!revoked){writeOut("\u26A0 \u30B5\u30FC\u30D0\u5074\u306E\u30C8\u30FC\u30AF\u30F3\u5931\u52B9\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u30AA\u30D5\u30E9\u30A4\u30F3\u7B49\uFF09\u3002TWP \u306E\u300C\u8A2D\u5B9A > CLI\u7AEF\u672B\u300D\u304B\u3089\u3082\u5931\u52B9\u3067\u304D\u307E\u3059\u3002\n")}})}async function runWhoami(options){return run(async()=>{const profile=resolveProfile(options.profile);const structured=options.output!==void 0||options.query!==void 0;let format=null;if(structured){
56
56
  const{resolveOutputFormat,OUTPUT_FORMATS}=await import("./format-NMW6Y2E5.js");format=resolveOutputFormat({...options.output!==void 0?{flag:options.output}:{},isTty:process.stdout.isTTY===true});if(format===null){throw new UsageError(`--output \u306B\u300C${options.output??""}\u300D\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093`,`\u6307\u5B9A\u3067\u304D\u308B\u306E\u306F ${OUTPUT_FORMATS.join(" / ")} \u3067\u3059`)}}const stored=loadCredentials(profile.name);const apiUrl=effectiveApiUrl(
57
57
  profile,stored?.api_url);const session=new AuthSession(profile.name,apiUrl);const client=new TwpApiClient(apiUrl,session,httpFetch,options.cliVersion);const me=await client.get("/api/v2/user");const user=me.user;const creds=loadCredentials(profile.name);if(format!==null){const value={id:user?.id??null,name:user?.name??null,email:user?.email??null,tenant_code:user?.tenant_code??null,role:user?.role??null,is_admin:user?.is_admin??null,profile:profile.name,api_url:apiUrl,expires_at:creds?.token_expires_at??
58
- null};const{evaluateQuery}=await import("./query-NJMVSQR6.js");const{renderOutput}=await import("./render-XMVI3AKB.js");const selected=options.query===void 0?value:await evaluateQuery(options.query,value);const text=renderOutput(selected,format);process.stdout.write(text.endsWith("\n")?text:`${text}
58
+ null};const{evaluateQuery}=await import("./query-NJMVSQR6.js");const{renderOutput}=await import("./render-ICZOK3HV.js");const selected=options.query===void 0?value:await evaluateQuery(options.query,value);const text=renderOutput(selected,format);process.stdout.write(text.endsWith("\n")?text:`${text}
59
59
  `);return}writeOut(`\u30E6\u30FC\u30B6\u30FC: ${user?.name??"?"}\uFF08${user?.email??"?"}\uFF09
60
60
  `);writeOut(`ID: ${user?.id??"?"}
61
61
  `);writeOut(`\u30C6\u30CA\u30F3\u30C8: ${user?.tenant_code??"?"}
@@ -1,8 +1,8 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
3
  import{LoopSettingsApplier,renderStepBudget}from"./chunk-Y2QAP6SU.js";import{EngineNotConfiguredError,NoopEngine,UnknownEngineError,aiUnavailableLabel,assertKnownEngine,failureHint,isAiUnavailable,needsHumanToRestoreAi}from"./chunk-ZOOEH7ZE.js";import{claudeConfigDir,resolveDetectDeps}from"./chunk-24ZZFFA3.js";import{REQUIRE_ZERO_STATUS,ScheduleApi,collectDue,gateStatus,nowInZone,parseCounts,promptSection}from"./chunk-UG2I6VRD.js";import{AgentLoopApi,describeError,filterByStatus,
4
- isPermanent,pick,pickString}from"./chunk-ODLJ2LNQ.js";import{extractLeadingTaskKey}from"./chunk-II5RVJQN.js";import{resolveProjectRef,uuidProjectIdPolicy}from"./chunk-X4RS5VBH.js";import{InstanceLock,buildLockOwner,defaultIsLoopProcess,writeLockOwner}from"./chunk-3WHC4FSG.js";import{CapacityReporter,buildLoopConfig,describeOperations,evaluateOwnership,formatHookIds,formatHookWiring,localDate,loopStateDir,runPrefetch,runPreflight}from"./chunk-XLE4HW6B.js";import{exclusiveInflightEntries,
5
- formatExclusiveEntry,normalizeSkillName,skillOfItem,spawnSyncResolved}from"./chunk-TYNCXQSN.js";import{killProcessTree}from"./chunk-N2UVRM3Z.js";import{PRIVATE_PROJECT_REF,isPrivateProjectId,isPrivateProjectRef,privateProjectId,projectFileKey}from"./chunk-GY7KI5E5.js";import{AuthSession}from"./chunk-XNLIEUAW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{joinFor}from"./chunk-PMOUHEJQ.js";import{compareVersionCores,parseVersionCore}from"./chunk-DXXFUNYN.js";
4
+ isPermanent,pick,pickString}from"./chunk-ODLJ2LNQ.js";import{extractLeadingTaskKey,isTaskKey}from"./chunk-II5RVJQN.js";import{resolveProjectRef,uuidProjectIdPolicy}from"./chunk-X4RS5VBH.js";import{InstanceLock,buildLockOwner,defaultIsLoopProcess,writeLockOwner}from"./chunk-3WHC4FSG.js";import{CapacityReporter,buildLoopConfig,describeOperations,evaluateOwnership,formatHookIds,formatHookWiring,localDate,loopStateDir,runPrefetch,runPreflight}from"./chunk-XLE4HW6B.js";import{
5
+ exclusiveInflightEntries,formatExclusiveEntry,normalizeSkillName,skillOfItem,spawnSyncResolved}from"./chunk-TYNCXQSN.js";import{killProcessTree}from"./chunk-N2UVRM3Z.js";import{PRIVATE_PROJECT_REF,isPrivateProjectId,isPrivateProjectRef,privateProjectId,projectFileKey}from"./chunk-GY7KI5E5.js";import{AuthSession}from"./chunk-XNLIEUAW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{joinFor}from"./chunk-PMOUHEJQ.js";import{compareVersionCores,parseVersionCore}from"./chunk-DXXFUNYN.js";
6
6
  import{effectiveApiUrl,resolveProfile}from"./chunk-NERYSBA4.js";import"./chunk-5WGOHFAS.js";import{twpHomeDir}from"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import fs10 from"fs";import path8 from"path";import fs from"fs";import path from"path";var LoopLogger=class{constructor(runnerId,logFile,out=process.stdout,now=()=>new Date){this.runnerId=runnerId;this.out=out;this.now=now;if(logFile){fs.mkdirSync(path.dirname(logFile),{recursive:true});this.stream=fs.createWriteStream(logFile,{flags:"a"})}}runnerId;out;now;stream=null;log(message){const d=this.now();const ts=`${d.getFullYear()}-${pad(d.getMonth()+1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;const line=`[${ts}] [${this.runnerId}] ${stripTerminalControls(
7
7
  message)}
8
8
  `;this.out.write(line);this.stream?.write(line)}separator(){this.log("=".repeat(60))}close(){this.stream?.end();this.stream=null}};function pad(n){return String(n).padStart(2,"0")}function rotateLogs(dir,retentionDays,now=Date.now()){if(retentionDays<=0)return;const cutoff=now-retentionDays*864e5;let entries;try{entries=fs.readdirSync(dir)}catch{return}for(const name of entries){if(!/^(agent-loop|task-loop|step|plan|schedule-enqueued)-.*\.(log|txt)$/.test(name))continue;const file=path.join(dir,
@@ -84,10 +84,10 @@ ${it.task_key??""}`))}function localTimestamp(at=new Date){const p2=n=>String(n)
84
84
  const clean=reason.replace(/[\t\n]/g," ").slice(0,200);const line=`${localTimestamp()} ${result} ${phase||"unknown"} ${ai||"unknown"} ${clean}
85
85
  `;try{fs4.mkdirSync(path3.dirname(this.file),{recursive:true});fs4.appendFileSync(this.file,line)}catch{return}if(result!=="NOT_EXECUTED")return;const streak=this.notExecutedStreak();if(streak>=3){this.log.log(` \u26A0\uFE0F \u30EA\u30EA\u30FC\u30B9\u304C ${streak} \u56DE\u9023\u7D9A\u3067\u672A\u5B9F\u884C\u3067\u3059\uFF08${this.file}\uFF09\u3002\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u30D6\u30ED\u30C3\u30AB\u30FC\u89E3\u6D88\u3092\u6700\u512A\u5148\u3059\u308B\u3053\u3068`)}}notExecutedStreak(){
86
86
  let text;try{text=fs4.readFileSync(this.file,"utf8")}catch{return 0}let n=0;for(const line of text.split("\n")){if(line.trim()==="")continue;n=line.split(" ")[1]==="NOT_EXECUTED"?n+1:0}return n}};function parseReleaseResult(logText){const matches=[...logText.matchAll(/RELEASE_RESULT:[^|\n]*\|[^|\n]*\|[^\n]*/g)];const line=matches.at(-1)?.[0];if(!line)return null;const parts=line.split("|").map(s=>s.trim());return{executed:!/NOT_EXECUTED/.test(parts[0]??""),phase:parts[1]??"",reason:parts[2]??"",
87
- line}}function parseOutcomeCode(logText){const matches=[...logText.matchAll(/\b([A-Z][A-Z0-9_]*_RESULT):[ \t]*([^|\n]*)/g)];const last=matches.at(-1);if(last===void 0)return null;const value=(last[2]??"").trim();return value===""?null:`${last[1]??""}: ${value}`}var RECOVER_KEY_RE=/RECOVER:[ \t]*([^\s|、,,]+-\d+)/;function parseRecoverKey(line){const m=RECOVER_KEY_RE.exec(line);return m?.[1]??null}function parsePartialMergeCause(line){const m=/PARTIAL_MERGE:\s*([A-Za-z0-9_.:-]+)/.exec(line);return m?.[1]??
88
- null}function parsePhase5Pending(line){const m=/PHASE5_PENDING:\s*(\d+)/.exec(line);return m?.[1]??null}function parseMergedKeys(logText){const matches=[...logText.matchAll(/MERGED_KEYS:[ \t]*([A-Za-z0-9,_-]*)/g)];const raw=matches.at(-1)?.[1];if(raw===void 0)return null;const trimmed=raw.trim();if(trimmed===""||trimmed==="none")return[];return trimmed.split(",").filter(k=>k!=="")}var PHASE5_RECOVERY_MAX=2;var PARTIAL_MERGE_ESCALATION_MAX=1;var TANI_USER_ID="2f391dda-f0e3-42f8-a9fd-8ffc271be765";
89
- var STATUS_HUMAN_DECISION="35e2d271-8a6e-4f3f-8bb6-1588a2d5a894";async function enqueueBlockerRecovery(deps,releaseLine){const{api,config,log}=deps;const key=parseRecoverKey(releaseLine);if(!key)return;const queued=await api.queuedSnapshot();if(queued===null){log.log(" \u26A0\uFE0F \u30AD\u30E5\u30FC\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F \u2192 \u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u306E\u6295\u5165\u3092\u898B\u9001\u308A\u307E\u3059");log.log(
90
- " \uFF08\u65E2\u306B\u30AD\u30E5\u30FC\u306B\u5C45\u308B\u304B\u5224\u5B9A\u3067\u304D\u306A\u3044\u72B6\u614B\u3067\u6295\u5165\u3059\u308B\u3068\u3001\u4E0A\u9650\u67A0\u3092\u6D88\u8CBB\u3057\u3066\u91CD\u8907\u30A2\u30A4\u30C6\u30E0\u3092\u4F5C\u308A\u307E\u3059\uFF09");return}if(queueContainsKey(queued,key)){log.log(` \u23ED ${key} \u306E\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u30AD\u30E5\u30FC\u306B\u3042\u308A\u307E\u3059 \u2192 \u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u306E\u6295\u5165\u3092\u30B9\u30AD\u30C3\u30D7`);
87
+ line}}function parseOutcomeCode(logText){const matches=[...logText.matchAll(/\b([A-Z][A-Z0-9_]*_RESULT):[ \t]*([^|\n]*)/g)];const last=matches.at(-1);if(last===void 0)return null;const value=(last[2]??"").trim();return value===""?null:`${last[1]??""}: ${value}`}var RECOVER_KEY_RE=/RECOVER:[ \t]*([^\s|、,,]+-\d+)/;function parseRecoverKey(line){const raw=RECOVER_KEY_RE.exec(line)?.[1];if(raw===void 0)return null;if(!raw.includes("%"))return raw;try{const key=decodeURIComponent(raw);return isTaskKey(
88
+ key)&&key.trim()===key?key:null}catch{return null}}function parsePartialMergeCause(line){const m=/PARTIAL_MERGE:\s*([A-Za-z0-9_.:-]+)/.exec(line);return m?.[1]??null}function parsePhase5Pending(line){const m=/PHASE5_PENDING:\s*(\d+)/.exec(line);return m?.[1]??null}function parseMergedKeys(logText){const matches=[...logText.matchAll(/MERGED_KEYS:[ \t]*([A-Za-z0-9,_-]*)/g)];const raw=matches.at(-1)?.[1];if(raw===void 0)return null;const trimmed=raw.trim();if(trimmed===""||trimmed==="none")return[];
89
+ return trimmed.split(",").filter(k=>k!=="")}var PHASE5_RECOVERY_MAX=2;var PARTIAL_MERGE_ESCALATION_MAX=1;var TANI_USER_ID="2f391dda-f0e3-42f8-a9fd-8ffc271be765";var STATUS_HUMAN_DECISION="35e2d271-8a6e-4f3f-8bb6-1588a2d5a894";async function enqueueBlockerRecovery(deps,releaseLine){const{api,config,log}=deps;const key=parseRecoverKey(releaseLine);if(!key)return;const queued=await api.queuedSnapshot();if(queued===null){log.log(" \u26A0\uFE0F \u30AD\u30E5\u30FC\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F \u2192 \u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u306E\u6295\u5165\u3092\u898B\u9001\u308A\u307E\u3059");
90
+ log.log(" \uFF08\u65E2\u306B\u30AD\u30E5\u30FC\u306B\u5C45\u308B\u304B\u5224\u5B9A\u3067\u304D\u306A\u3044\u72B6\u614B\u3067\u6295\u5165\u3059\u308B\u3068\u3001\u4E0A\u9650\u67A0\u3092\u6D88\u8CBB\u3057\u3066\u91CD\u8907\u30A2\u30A4\u30C6\u30E0\u3092\u4F5C\u308A\u307E\u3059\uFF09");return}if(queueContainsKey(queued,key)){log.log(` \u23ED ${key} \u306E\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u30AD\u30E5\u30FC\u306B\u3042\u308A\u307E\u3059 \u2192 \u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u306E\u6295\u5165\u3092\u30B9\u30AD\u30C3\u30D7`);
91
91
  return}const today=localDate(config.counterTimezone);const res=await api.consumeCounter(`blocker_recovery.${key}`,today,config.blockerRecoveryMaxPerDay);if(!res.ok){if(res.status!==null&&res.status>=400&&res.status<500){log.log(` \u26D4 ${key} \u306E\u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u306E\u6295\u5165\u4E0A\u9650\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\uFF08${describeError(res)}\uFF09\u3002**\u518D\u8A66\u884C\u3067\u306F\u89E3\u6D88\u3057\u307E\u305B\u3093**`);log.log(` \u78BA\u8A8D:\
92
92
  \u30BF\u30A4\u30E0\u30BE\u30FC\u30F3\uFF08\u73FE\u5728 ${config.counterTimezone}\u30FB\u9001\u4FE1\u3057\u305F\u65E5\u4ED8 ${today}\uFF09\uFF0F\u4E0A\u9650\uFF08\u73FE\u5728 ${config.blockerRecoveryMaxPerDay}\uFF09`)}else{log.log(` \u26D4 ${key} \u306E\u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u306E\u6295\u5165\u4E0A\u9650\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(res)}\uFF09\u2192 \u4ECA\u56DE\u306F\u6295\u5165\u3057\u307E\u305B\u3093\uFF08\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u518D\u5224\u5B9A\uFF09`)}
93
93
  return}const granted=pickString(res.json,"granted");const count=pickString(res.json,"counter.count");if(granted===""){log.log(` \u26D4 ${key} \u306E\u6295\u5165\u4E0A\u9650\u306E\u5FDC\u7B54\u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08granted \u304C\u8AAD\u3081\u307E\u305B\u3093\uFF09\u2192 \u4ECA\u56DE\u306F\u6295\u5165\u3057\u307E\u305B\u3093\u3002\u5FDC\u7B54\u306E\u5148\u982D: ${res.raw.slice(0,120)}`);return}if(granted!=="true"){log.log(` \u23ED ${key} \u306E\u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u306F\u672C\u65E5 ${count||
@@ -139,11 +139,11 @@ continue}const{itemId,detail}=await createItem(api,{label:`[P1] ${key} \u306Edev
139
139
  explicit);return skillOfItem(item)}function advanceKey(taskKey,skill){return`${taskKey}#${normalizeSkillName(skill)}`}function buildRecentCandidateIndex(items,opts={}){const nowMicros=(opts.now??new Date).getTime()*1e3;const latest=new Map;for(const item of items){if(item.status!==void 0&&item.status!=="completed")continue;const taskKey=(item.task_key??"").trim();if(taskKey==="")continue;const skill=skillOfLedgerItem(item);if(skill==="")continue;const sortOrder=typeof item.sort_order==="number"?
140
140
  item.sort_order:0;const key=advanceKey(taskKey,skill);const prev=latest.get(key);if(prev&&prev.sortOrder>=sortOrder)continue;latest.set(key,{sortOrder,candidate:{taskKey,skill,itemId:item.item_id,outcomeCode:normalizeOutcomeCode(item.outcome_code),ageMinutes:sortOrder>0?Math.floor((nowMicros-sortOrder)/6e7):null}})}const index=new Map;for(const[key,value]of latest)index.set(key,value.candidate);return index}function findRecentCandidate(index,taskKey,skill){if(taskKey.trim()===""||skill.trim()===
141
141
  "")return null;return index.get(advanceKey(taskKey.trim(),skill))??null}async function resolveRecentAdvance(candidate,fetchResult){let outcome=candidate.outcomeCode;if(outcome===null){const result=await fetchResult(candidate.itemId);outcome=result?normalizeOutcomeCode(parseOutcomeCode(result)):null}if(outcome===null||!ADVANCING.has(outcome))return null;return{taskKey:candidate.taskKey,skill:candidate.skill,outcome,itemId:candidate.itemId,ageMinutes:candidate.ageMinutes}}function formatRecentAdvance(advance){
142
- const age=advance.ageMinutes===null?"\u4E0D\u660E":`${advance.ageMinutes}\u5206\u524D`;return`${advance.outcome}\uFF08${age} / item=${advance.itemId}\uFF09`}function windowStartMicros(now,hours=RECENT_ADVANCE_WINDOW_HOURS){return Math.trunc((now.getTime()-hours*36e5)*1e3)}var EXPECTED_STATUS_AFTER={"DEV_VERIFY_RESULT: VERIFIED":"relwait","DEVELOP_MERGE_RESULT: MERGED":"verify","REVIEW_RESULT: APPROVED":"mergewait","RELEASE_RESULT: EXECUTED":"processed"};var MARKER_PAIR_RE=/\b([A-Z][A-Z0-9]*-\d+)=([a-z]+)\b/g;
143
- var MARKER_PARSABLE_KEY_RE=/^[A-Z][A-Z0-9]*-\d+$/;function parseTaskStatusSnapshot(prefetchSection){const m=/<!--\s*OPS_TASK_STATUS\s([^>]*?)-->/.exec(prefetchSection);if(!m||m[1]===void 0)return null;const body=m[1];const windowMatch=/\bwindow_hours=(\d+)\b/.exec(body);const byKey=new Map;for(const pair of body.matchAll(MARKER_PAIR_RE)){byKey.set(pair[1],pair[2])}return{complete:/\bcomplete=1\b/.test(body),windowHours:windowMatch?Number(windowMatch[1]):0,byKey}}function shouldSuppressForStatus(advance,snapshot){
144
- if(snapshot===null){return{suppress:false,reason:"\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u30DE\u30FC\u30AB\u30FC\uFF08OPS_TASK_STATUS\uFF09\u304C prefetch \u306B\u7121\u3044"}}if(!snapshot.complete){return{suppress:false,reason:"\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u305F\u3082\u306E\u304C\u3042\u308B\uFF08complete=0\uFF09"}}if(snapshot.windowHours<RECENT_ADVANCE_WINDOW_HOURS){return{suppress:false,reason:`\u30DE\u30FC\u30AB\u30FC\u306E\u7A93\uFF08${snapshot.windowHours}\
145
- h\uFF09\u304C\u6291\u6B62\u306E\u7A93\uFF08${RECENT_ADVANCE_WINDOW_HOURS}h\uFF09\u3088\u308A\u72ED\u3044`}}const expected=EXPECTED_STATUS_AFTER[advance.outcome];if(expected===void 0){return{suppress:false,reason:`${advance.outcome} \u306E\u60F3\u5B9A\u30B9\u30C6\u30FC\u30BF\u30B9\u304C\u5BFE\u5FDC\u8868\u306B\u7121\u3044`}}const current=snapshot.byKey.get(advance.taskKey);if(current===void 0){if(!MARKER_PARSABLE_KEY_RE.test(advance.taskKey)){return{suppress:false,reason:"\u30DE\u30FC\u30AB\u30FC\u306E\u30D1\u30FC\u30B5\u304C\u62FE\u3048\u306A\u3044\u5F62\u306E\u30AD\u30FC\uFF08\u5927\u6587\u5B57\u306E\u307F\u5BFE\
146
- \u5FDC\uFF09\u306A\u306E\u3067\u3001\u4E0D\u5728\u3092\u300C\u52D5\u3044\u3066\u3044\u306A\u3044\u300D\u6839\u62E0\u306B\u3067\u304D\u306A\u3044"}}return{suppress:true,reason:""}}if(current===expected)return{suppress:true,reason:""};return{suppress:false,reason:`\u524D\u56DE\u306E\u5B9F\u884C\u306E\u5F8C\u306B\u30BF\u30B9\u30AF\u304C\u52D5\u3044\u305F\uFF08${expected} \u2192 ${current}\uFF09\uFF1D\u65B0\u3057\u3044\u4ED5\u4E8B`}}var USER_ID_RE=/^[A-Za-z0-9._-]{1,64}$/;var ProjectApi=class{constructor(apiUrl,session,fetchImpl=httpFetch){this.apiUrl=apiUrl;this.session=session;this.fetchImpl=fetchImpl}apiUrl;session;fetchImpl;async resolve(ref){if(isPrivateProjectRef(ref))return this.resolvePrivate();return resolveProjectRef(ref,path9=>this.get(path9),uuidProjectIdPolicy)}async resolvePrivate(){const res=await this.get("/api/v2/user");if(!res.ok){throw new Error(`\u30ED\u30B0\u30A4\u30F3\u4E2D\u306E\u30E6\u30FC\u30B6\u30FC\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08HTTP ${res.
142
+ const age=advance.ageMinutes===null?"\u4E0D\u660E":`${advance.ageMinutes}\u5206\u524D`;return`${advance.outcome}\uFF08${age} / item=${advance.itemId}\uFF09`}function windowStartMicros(now,hours=RECENT_ADVANCE_WINDOW_HOURS){return Math.trunc((now.getTime()-hours*36e5)*1e3)}var EXPECTED_STATUS_AFTER={"DEV_VERIFY_RESULT: VERIFIED":"relwait","DEVELOP_MERGE_RESULT: MERGED":"verify","REVIEW_RESULT: APPROVED":"mergewait","RELEASE_RESULT: EXECUTED":"processed"};var MARKER_PAIR_RE=/^([^=\s,]+)=([a-z]+)$/;
143
+ function decodeMarkerKey(raw){let key;try{key=decodeURIComponent(raw)}catch{return null}return isTaskKey(key)&&key.trim()===key?key:null}function parseTaskStatusSnapshot(prefetchSection){const m=/<!--\s*OPS_TASK_STATUS\s([^>]*?)-->/.exec(prefetchSection);if(!m||m[1]===void 0)return null;const body=m[1];const windowMatch=/\bwindow_hours=(\d+)\b/.exec(body);const byKey=new Map;for(const token of body.trim().split(/\s+/)){for(const part of token.split(",")){const pair=MARKER_PAIR_RE.exec(part);if(!pair)
144
+ continue;const key=decodeMarkerKey(pair[1]);if(key!==null)byKey.set(key,pair[2])}}return{complete:/\bcomplete=1\b/.test(body),windowHours:windowMatch?Number(windowMatch[1]):0,byKey}}function shouldSuppressForStatus(advance,snapshot){if(snapshot===null){return{suppress:false,reason:"\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u30DE\u30FC\u30AB\u30FC\uFF08OPS_TASK_STATUS\uFF09\u304C prefetch \u306B\u7121\u3044"}}if(!snapshot.complete){return{suppress:false,reason:"\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u305F\u3082\u306E\u304C\u3042\u308B\uFF08complete=0\uFF09"}}
145
+ if(snapshot.windowHours<RECENT_ADVANCE_WINDOW_HOURS){return{suppress:false,reason:`\u30DE\u30FC\u30AB\u30FC\u306E\u7A93\uFF08${snapshot.windowHours}h\uFF09\u304C\u6291\u6B62\u306E\u7A93\uFF08${RECENT_ADVANCE_WINDOW_HOURS}h\uFF09\u3088\u308A\u72ED\u3044`}}const expected=EXPECTED_STATUS_AFTER[advance.outcome];if(expected===void 0){return{suppress:false,reason:`${advance.outcome} \u306E\u60F3\u5B9A\u30B9\u30C6\u30FC\u30BF\u30B9\u304C\u5BFE\u5FDC\u8868\u306B\u7121\u3044`}}const current=snapshot.byKey.
146
+ get(advance.taskKey);if(current===void 0){return{suppress:true,reason:""}}if(current===expected)return{suppress:true,reason:""};return{suppress:false,reason:`\u524D\u56DE\u306E\u5B9F\u884C\u306E\u5F8C\u306B\u30BF\u30B9\u30AF\u304C\u52D5\u3044\u305F\uFF08${expected} \u2192 ${current}\uFF09\uFF1D\u65B0\u3057\u3044\u4ED5\u4E8B`}}var USER_ID_RE=/^[A-Za-z0-9._-]{1,64}$/;var ProjectApi=class{constructor(apiUrl,session,fetchImpl=httpFetch){this.apiUrl=apiUrl;this.session=session;this.fetchImpl=fetchImpl}apiUrl;session;fetchImpl;async resolve(ref){if(isPrivateProjectRef(ref))return this.resolvePrivate();return resolveProjectRef(ref,path9=>this.get(path9),uuidProjectIdPolicy)}async resolvePrivate(){const res=await this.get("/api/v2/user");if(!res.ok){throw new Error(`\u30ED\u30B0\u30A4\u30F3\u4E2D\u306E\u30E6\u30FC\u30B6\u30FC\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08HTTP ${res.
147
147
  status}\uFF09\u3002\u500B\u4EBA\u30AD\u30E5\u30FC\u3092\u56DE\u3059\u306B\u306F \`twp login\` \u304C\u5FC5\u8981\u3067\u3059\u3002\u63A5\u7D9A\u5148\u3068\u30ED\u30B0\u30A4\u30F3\u72B6\u614B\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}const userId=res.json?.user?.id;if(typeof userId!=="string"||!USER_ID_RE.test(userId)){throw new Error(`\u30B5\u30FC\u30D0\u304C\u8FD4\u3057\u305F\u30E6\u30FC\u30B6\u30FCID\u3092\u500B\u4EBA\u30AD\u30E5\u30FC\u306EID\u306B\u4F7F\u3048\u307E\u305B\u3093\uFF08${String(
148
148
  userId).slice(0,60)}\uFF09\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}return{id:privateProjectId(userId),code:PRIVATE_PROJECT_REF,name:"\u500B\u4EBA\u30BF\u30B9\u30AF"}}async countByStatus(projectId,statusId){const res=await this.get(`/api/v2/projects/${projectId}/tasks?status_id=${encodeURIComponent(statusId)}&limit=1`);if(!res.ok){return{total:null,error:res.status===null?res.error??"\u901A\u4FE1\u5931\u6557":`HTTP ${res.status}`}}const total=res.json?.
149
149
  pagination?.total;if(typeof total!=="number"){return{total:null,error:"\u5FDC\u7B54\u304B\u3089 pagination.total \u3092\u8AAD\u3081\u306A\u3044"}}return{total,error:null}}async get(path9){let token;try{token=await this.session.getAccessToken()}catch(err){return{ok:false,status:null,json:null,error:err.message}}try{const res=await this.fetchImpl(`${this.apiUrl}${path9}`,{headers:{Authorization:`Bearer ${token}`,"Content-Type":"application/json",Accept:"application/json"}});const raw=await res.text();
@@ -1,14 +1,14 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{activateModeFiles,activatePermissionSettings,buildResidentSet,buildSystemPrompt,createAuditLogger,currentBranch,displayCwd,runTurn}from"./chunk-5ISIXBKD.js";import"./chunk-N2UVRM3Z.js";import{getMode}from"./chunk-BOBSH3QN.js";import{RelayError,createRuntime,pickModel}from"./chunk-PI5DUWNZ.js";import"./chunk-XNLIEUAW.js";import"./chunk-J7QYPKVK.js";import"./chunk-PMOUHEJQ.js";import{checkMinSupportedVersion,enforceMinSupportedVersion,floorNeedsRefresh}from"./chunk-DXXFUNYN.js";
4
- import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";async function runOneShot(opts,deps={}){const out=deps.out??(text=>void process.stdout.write(stripTerminalControls(text)));const err=deps.err??(text=>void process.stderr.write(stripTerminalControls(text)));activateModeFiles(err);const permissionLayers=activatePermissionSettings(err,{...opts.allowedTools?{allowedTools:opts.allowedTools}:{},...opts.disallowedTools?{disallowedTools:opts.disallowedTools}:{}});const prompt=opts.fromStdin?await(deps.readStdin??readStdin)():opts.prompt;if(prompt.trim()===
3
+ import{activateModeFiles,activatePermissionSettings,buildResidentSet,buildSystemPrompt,createAuditLogger,createTwpToolkit,currentBranch,displayCwd,residentInputs,runTurn}from"./chunk-7PRQ7JW2.js";import"./chunk-NZ7WI4RZ.js";import"./chunk-EQWW2F5V.js";import"./chunk-JB27KNCX.js";import"./chunk-JKSXUBND.js";import"./chunk-II5RVJQN.js";import"./chunk-X4RS5VBH.js";import"./chunk-N2UVRM3Z.js";import{getMode}from"./chunk-NAUH75MM.js";import{RelayError,
4
+ createRuntime,pickModel}from"./chunk-WOUKWOAR.js";import"./chunk-XNLIEUAW.js";import"./chunk-J7QYPKVK.js";import"./chunk-PMOUHEJQ.js";import{checkMinSupportedVersion,enforceMinSupportedVersion,floorNeedsRefresh}from"./chunk-DXXFUNYN.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-M3GWY6NT.js";import"./chunk-VSJBJXZO.js";async function runOneShot(opts,deps={}){const out=deps.out??(text=>void process.stdout.write(stripTerminalControls(text)));const err=deps.err??(text=>void process.stderr.write(stripTerminalControls(text)));activateModeFiles(err);const permissionLayers=activatePermissionSettings(err,{...opts.allowedTools?{allowedTools:opts.allowedTools}:{},...opts.disallowedTools?{disallowedTools:opts.disallowedTools}:{}});const prompt=opts.fromStdin?await(deps.readStdin??readStdin)():opts.prompt;if(prompt.trim()===
5
5
  ""){err('\u30D7\u30ED\u30F3\u30D7\u30C8\u304C\u7A7A\u3067\u3059\u3002`twp -p "\u8CEA\u554F"`\uFF08`-p -` \u3067\u6A19\u6E96\u5165\u529B\uFF09\n');return 2}const runtime=deps.runtime??createRuntime({...opts.profile!==void 0?{profile:opts.profile}:{},...opts.model!==void 0?{model:opts.model}:{},cliVersion:opts.version});const cachedFloor=runtime.loadCachedFloor();if(await checkMinSupportedVersion({current:opts.version,cachedFloor:cachedFloor.minSupportedVersion,refresh:async()=>(await runtime.loadCatalog()).
6
6
  minSupportedVersion,write:err})){return 1}if(!runtime.loggedIn){err("\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u3044\u307E\u305B\u3093\u3002`twp login` \u3092\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n");return 1}let model=runtime.configuredModel??"";let catalog=null;if(model===""){catalog=await runtime.loadCatalog();const picked=pickModel(catalog,void 0);model=picked.model;if(catalog.source!=="server"){err(`\u26A0 \u30E2\u30C7\u30EB\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u306A\u304B\u3063\u305F\u305F\u3081 ${model}\
7
7
  \u3067\u5B9F\u884C\u3057\u307E\u3059\uFF08${catalog.source}\uFF09
8
- `)}}else if(floorNeedsRefresh(cachedFloor.fetchedAt)){catalog=await runtime.loadCatalog()}if(catalog!==null&&enforceMinSupportedVersion({current:opts.version,floor:catalog.minSupportedVersion,write:err})){return 1}const controller=new AbortController;let interrupted=false;const onSigint=()=>{interrupted=true;controller.abort()};process.on("SIGINT",onSigint);let wroteText=false;let ownedAudit=null;try{const mode=getMode(opts.mode);const resident=buildResidentSet(mode,{...opts.permissionMode!==void 0?
9
- {permissionMode:opts.permissionMode}:{},permissionLayers});const audit=deps.audit??(ownedAudit=createAuditLogger({mode:mode.id,permissionMode:opts.permissionMode,model,cwd:process.cwd(),cliVersion:opts.version,interactive:false,onOpen:file=>err(`audit: ${file}
8
+ `)}}else if(floorNeedsRefresh(cachedFloor.fetchedAt)){catalog=await runtime.loadCatalog()}if(catalog!==null&&enforceMinSupportedVersion({current:opts.version,floor:catalog.minSupportedVersion,write:err})){return 1}const controller=new AbortController;let interrupted=false;const onSigint=()=>{interrupted=true;controller.abort()};process.on("SIGINT",onSigint);let wroteText=false;let ownedAudit=null;try{const mode=getMode(opts.mode);const toolkit=createTwpToolkit(runtime,opts.version);const resident=buildResidentSet(
9
+ mode,{...residentInputs(toolkit),...opts.permissionMode!==void 0?{permissionMode:opts.permissionMode}:{},permissionLayers});const audit=deps.audit??(ownedAudit=createAuditLogger({mode:mode.id,permissionMode:opts.permissionMode,model,cwd:process.cwd(),cliVersion:opts.version,interactive:false,onOpen:file=>err(`audit: ${file}
10
10
  `)}));const result=await runTurn(runtime.client,runtime.context,{input:prompt,model,system:buildSystemPrompt({cwd:displayCwd(),branch:currentBranch(),modeLabel:mode.label,cliVersion:opts.version,toolNames:resident.tools.map(t=>t.name),...mode.prompt!==void 0?{modePrompt:mode.prompt}:{}}),signal:controller.signal,onTextDelta:delta=>{wroteText=true;out(stripTerminalControls(delta))},tools:resident.tools,execute:{mode,ctx:{cwd:process.cwd()},sessionAllow:new Set,permissionLayers,...opts.permissionMode!==
11
- void 0?{permissionMode:opts.permissionMode}:{},audit},onToolUse:()=>{if(wroteText){out("\n");wroteText=false}},onToolResult:(call,result2)=>err(`tool: ${call.name} \u2192 ${result2.denied===true?"denied":result2.isError===true?"error":"ok"}
11
+ void 0?{permissionMode:opts.permissionMode}:{},resolveTool:toolkit.resolveTool,prepareIndirect:toolkit.prepareIndirect,audit},onToolUse:()=>{if(wroteText){out("\n");wroteText=false}},onToolResult:(call,result2)=>err(`tool: ${call.name} \u2192 ${result2.denied===true?"denied":result2.isError===true?"error":"ok"}
12
12
  `)});if(result.text!==""&&!result.text.endsWith("\n"))out("\n");const u=result.usage;err(`usage: model=${model} input=${u.inputTokens} cache_read=${u.cacheReadTokens} cache_write=${u.cacheWriteTokens} output=${u.outputTokens}
13
13
  `);if(result.droppedMessages>0){err(`\u26A0 \u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u4E0A\u9650\u306E\u305F\u3081\u53E4\u3044\u3084\u308A\u53D6\u308A ${result.droppedMessages} \u4EF6\u3092\u843D\u3068\u3057\u307E\u3057\u305F
14
14
  `)}if(result.maxStepsReached){err("\u26A0 \u30C4\u30FC\u30EB\u5B9F\u884C\u306E\u5F80\u5FA9\u304C\u4E0A\u9650\u306B\u9054\u3057\u305F\u305F\u3081\u6253\u3061\u5207\u308A\u307E\u3057\u305F\uFF08\u7D9A\u304D\u306F\u540C\u3058\u4F1A\u8A71\u3067\u518D\u5EA6\u6307\u793A\u3057\u3066\u304F\u3060\u3055\u3044\uFF09\n");return 1}if(result.upstreamError!==null){err(`\u30E2\u30C7\u30EB\u306E\u5FDC\u7B54\u304C\u9014\u4E2D\u3067\u7D42\u308F\u308A\u307E\u3057\u305F: ${result.upstreamError}
@@ -0,0 +1,3 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ import{renderOutput}from"./chunk-APYYF7H6.js";import"./chunk-EQWW2F5V.js";import"./chunk-K2ONOH3L.js";import"./chunk-WVS4W5FY.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";export{renderOutput};
@@ -0,0 +1,4 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ import{CURATED_PAGING_VOCABULARY,buildPrepareContext,exitCodeFor,fetchAllPages,outputValue,reportError,requiresYes,resolvePaging,runDomain}from"./chunk-7LTTKKQA.js";import"./chunk-APYYF7H6.js";import"./chunk-EQWW2F5V.js";import"./chunk-O52CUEDO.js";import"./chunk-JB27KNCX.js";import"./chunk-JKSXUBND.js";import"./chunk-II5RVJQN.js";import"./chunk-2VISRLWS.js";import"./chunk-X4RS5VBH.js";import"./chunk-TAN5I2DP.js";import"./chunk-PEGUHUTD.js";
4
+ import"./chunk-QQRJLH6B.js";import"./chunk-XNLIEUAW.js";import"./chunk-J7QYPKVK.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import"./chunk-K2ONOH3L.js";import"./chunk-WVS4W5FY.js";import"./chunk-NHYMHCAT.js";import"./chunk-E4H22AO5.js";import"./chunk-M3GWY6NT.js";import"./chunk-VSJBJXZO.js";export{CURATED_PAGING_VOCABULARY,buildPrepareContext,exitCodeFor,fetchAllPages,outputValue,reportError,requiresYes,resolvePaging,runDomain};
@@ -1,3 +1,3 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{fetchLatestVersion,isBehindLatest,runUpdate}from"./chunk-JDMNIUVX.js";import"./chunk-PI5DUWNZ.js";import"./chunk-XNLIEUAW.js";import"./chunk-J7QYPKVK.js";import"./chunk-PMOUHEJQ.js";import"./chunk-DSDVIU6A.js";import"./chunk-DXXFUNYN.js";import"./chunk-NERYSBA4.js";import"./chunk-5WGOHFAS.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";export{fetchLatestVersion,isBehindLatest,runUpdate};
3
+ import{fetchLatestVersion,isBehindLatest,runUpdate}from"./chunk-SJRK4AVE.js";import"./chunk-WOUKWOAR.js";import"./chunk-XNLIEUAW.js";import"./chunk-J7QYPKVK.js";import"./chunk-PMOUHEJQ.js";import"./chunk-DSDVIU6A.js";import"./chunk-DXXFUNYN.js";import"./chunk-NERYSBA4.js";import"./chunk-5WGOHFAS.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";export{fetchLatestVersion,isBehindLatest,runUpdate};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tocca-systems/twp-cli",
3
- "version": "0.22.0",
3
+ "version": "0.23.0",
4
4
  "description": "TWP CLI — Tocca Working Platform の CLI 型統合インターフェース(AIエージェントハーネス)",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,9 +0,0 @@
1
- import { createRequire as __twpCreateRequire } from 'node:module';
2
- const require = __twpCreateRequire(import.meta.url);
3
- var MODE_IDS=["dev","biz","plan"];function isModeId(value){return value!==void 0&&MODE_IDS.includes(value)}var MODES=[{id:"dev",label:"\u958B\u767A",color:"green",description:"\u30ED\u30FC\u30AB\u30EB\u30C4\u30FC\u30EB\u5168\u90E8 \uFF0B \u958B\u767A\u7CFB TWP \u30C9\u30E1\u30A4\u30F3\u5E38\u99D0",tools:["read_file","write_file","edit_file","bash","shell","glob","grep","git","twp_*"],permissions:{read_file:"allow",glob:"allow",grep:"allow",git:"ask",twp_get_task:"allow",twp_list_tasks:"allow",twp_update_task:"\
4
- ask",bash:"ask",shell:"ask",write_file:"ask",edit_file:"ask","*":"ask"}},{id:"biz",label:"\u696D\u52D9",color:"cyan",description:"TWP \u30C9\u30E1\u30A4\u30F3\u4E2D\u5FC3\u3002bash \u3068 write_file \u306F deny",tools:["twp_*","read_file","glob","grep"],permissions:{read_file:"allow",glob:"allow",grep:"allow",twp_get_task:"allow",twp_list_tasks:"allow",twp_update_task:"ask",bash:"deny",shell:"deny",git:"deny",write_file:"deny",edit_file:"deny","*":"ask"}},{id:"plan",label:"\u30D7\u30E9\u30F3",color:"\
5
- magenta",description:"\u8AAD\u307F\u53D6\u308A\u306E\u307F\u3002\u5168\u66F8\u304D\u8FBC\u307F deny",tools:["read_file","glob","grep","twp_get_*","twp_list_*"],permissions:{read_file:"allow",glob:"allow",grep:"allow",twp_get_task:"allow",twp_list_tasks:"allow",bash:"deny",shell:"deny",git:"deny",write_file:"deny",edit_file:"deny","*":"deny"}}];var activeModeList=MODES;var activeModeSources=new Map;function setActiveModes(modes,sources=new Map){activeModeList=MODES.map(builtin=>modes.find(m=>m.id===
6
- builtin.id)??builtin);activeModeSources=sources}function modeSource(id){return activeModeSources.get(id)??null}function getMode(id){const found=activeModeList.find(m=>m.id===id);if(!found)throw new Error(`unknown mode: ${id}`);return found}function nextMode(id){const i=activeModeList.findIndex(m=>m.id===id);const next=activeModeList[(i+1)%activeModeList.length];return next?next.id:"dev"}function checkPermission(toolName,mode){const own=key=>Object.hasOwn(mode.permissions,key)?mode.permissions[key]:void 0;const found=own(toolName)??own("*");return found==="allow"||found==="ask"||found==="deny"?found:"ask"}var PERMISSION_MODE_IDS=["plan","acceptEdits","denyAll"];function isPermissionModeId(value){return value!==void 0&&PERMISSION_MODE_IDS.includes(value)}function describePermissionMode(permissionMode){if(permissionMode===void 0)return"\u672A\u6307\u5B9A\uFF08\u30E2\u30FC\u30C9\u306E\u65B9\u91DD\u306E\u307E\u307E\uFF09";switch(permissionMode){case"plan":return"plan\uFF08read \u306E\u307F\u8A31\u53EF\u3002write / exec \u306F\u62D2\u5426\uFF09";case"acceptEdits":return"acceptEdits\uFF08write \u306E\u78BA\u8A8D\u3092\u81EA\u52D5\u627F\u8A8D\u3002read\
7
- / exec \u306F\u30E2\u30FC\u30C9\u306E\u307E\u307E\uFF09";case"denyAll":return"denyAll\uFF08read \u3092\u542B\u3080\u5168\u30C4\u30FC\u30EB\u3092\u62D2\u5426\uFF09";default:{const exhaustive=permissionMode;return`${String(exhaustive)}\uFF08\u4E0D\u660E\u306A\u5024\u3002\u5B89\u5168\u5074\u3067\u5168\u62D2\u5426\uFF09`}}}function applyPermissionMode(decision,risk,permissionMode){if(permissionMode===void 0)return{decision,reason:null};if(decision==="deny")return{decision,reason:null};switch(permissionMode){case"\
8
- denyAll":return{decision:"deny",reason:"permission-mode=denyAll\uFF08\u5168\u30C4\u30FC\u30EB\u3092\u62D2\u5426\uFF09"};case"plan":if(risk==="read")return{decision,reason:null};return{decision:"deny",reason:`permission-mode=plan\uFF08${risk} \u30C4\u30FC\u30EB\u3092\u62D2\u5426\uFF09`};case"acceptEdits":if(risk==="write"&&decision==="ask"){return{decision:"allow",reason:"permission-mode=acceptEdits\uFF08write \u3092\u81EA\u52D5\u627F\u8A8D\uFF09"}}return{decision,reason:null};default:return{decision:"\
9
- deny",reason:"\u4E0D\u660E\u306A permission-mode\uFF08\u5B89\u5168\u5074\u3067\u62D2\u5426\uFF09"}}}export{isModeId,MODES,setActiveModes,modeSource,getMode,nextMode,checkPermission,isPermissionModeId,describePermissionMode,applyPermissionMode};
@@ -1,3 +0,0 @@
1
- import { createRequire as __twpCreateRequire } from 'node:module';
2
- const require = __twpCreateRequire(import.meta.url);
3
- import{renderOutput}from"./chunk-3XG457E3.js";import"./chunk-K2ONOH3L.js";import"./chunk-WVS4W5FY.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";export{renderOutput};
@@ -1,4 +0,0 @@
1
- import { createRequire as __twpCreateRequire } from 'node:module';
2
- const require = __twpCreateRequire(import.meta.url);
3
- import{CURATED_PAGING_VOCABULARY,buildPrepareContext,exitCodeFor,fetchAllPages,outputValue,reportError,requiresYes,resolvePaging,runDomain}from"./chunk-RKJ6B2KL.js";import"./chunk-3XG457E3.js";import"./chunk-O52CUEDO.js";import"./chunk-JB27KNCX.js";import"./chunk-JKSXUBND.js";import"./chunk-II5RVJQN.js";import"./chunk-2VISRLWS.js";import"./chunk-X4RS5VBH.js";import"./chunk-TAN5I2DP.js";import"./chunk-PEGUHUTD.js";import"./chunk-QQRJLH6B.js";
4
- import"./chunk-XNLIEUAW.js";import"./chunk-J7QYPKVK.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import"./chunk-K2ONOH3L.js";import"./chunk-WVS4W5FY.js";import"./chunk-NHYMHCAT.js";import"./chunk-E4H22AO5.js";import"./chunk-M3GWY6NT.js";import"./chunk-VSJBJXZO.js";export{CURATED_PAGING_VOCABULARY,buildPrepareContext,exitCodeFor,fetchAllPages,outputValue,reportError,requiresYes,resolvePaging,runDomain};