@tocca-systems/twp-cli 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.public.md +80 -0
- package/LICENSE +47 -0
- package/README.md +279 -0
- package/dist/THIRD-PARTY-NOTICES.md +1239 -0
- package/dist/ai-dispatch-T6PJ4DUG.js +82 -0
- package/dist/app-S33SNSH5.js +1370 -0
- package/dist/chunk-3WJHTPOZ.js +48 -0
- package/dist/chunk-4QI5NX4C.js +6 -0
- package/dist/chunk-5QCAIKFE.js +9 -0
- package/dist/chunk-63LDNYGW.js +23 -0
- package/dist/chunk-7ZVTACQS.js +8 -0
- package/dist/chunk-DIMZRTLE.js +37 -0
- package/dist/chunk-DXXFUNYN.js +7 -0
- package/dist/chunk-FQDYLZV3.js +6 -0
- package/dist/chunk-GY7KI5E5.js +4 -0
- package/dist/chunk-II5RVJQN.js +3 -0
- package/dist/chunk-IM4H52FC.js +109 -0
- package/dist/chunk-J7QYPKVK.js +18 -0
- package/dist/chunk-KCXVV45F.js +16 -0
- package/dist/chunk-L37NS5L2.js +8 -0
- package/dist/chunk-N2UVRM3Z.js +5 -0
- package/dist/chunk-N3B737KO.js +57 -0
- package/dist/chunk-NERYSBA4.js +9 -0
- package/dist/chunk-NHYMHCAT.js +4 -0
- package/dist/chunk-NNOYO67O.js +7 -0
- package/dist/chunk-PMOUHEJQ.js +5 -0
- package/dist/chunk-Q7YSSWTR.js +33 -0
- package/dist/chunk-RQFG3OUL.js +41 -0
- package/dist/chunk-RZVI6PMW.js +5 -0
- package/dist/chunk-VSJBJXZO.js +3 -0
- package/dist/chunk-VSQXY2VX.js +42 -0
- package/dist/chunk-WVS4W5FY.js +16 -0
- package/dist/chunk-ZZ5EYKCK.js +58 -0
- package/dist/cli.js +132 -0
- package/dist/commands-QKNOQRWT.js +60 -0
- package/dist/commands-T47RY6EH.js +365 -0
- package/dist/devtools-VZW7JDIG.js +131 -0
- package/dist/dist-HZIZTJ4O.js +93 -0
- package/dist/fuzzysort-DFVKV4B4.js +3 -0
- package/dist/oneshot-JD5LINMX.js +18 -0
- package/dist/project-BEY4CNSF.js +13 -0
- package/dist/run-EDV5273K.js +58 -0
- package/dist/schedule-command-LWUBXHBQ.js +13 -0
- package/dist/setup-GY674TII.js +74 -0
- package/dist/task-MQYRE4QC.js +135 -0
- package/dist/update-WDWUECN7.js +21 -0
- package/package.json +73 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
var EXIT_OK=0;var EXIT_FAILURE=1;var EXIT_USAGE=2;var EXIT_API_CLIENT=3;var EXIT_API_SERVER=4;var EXIT_AUTH=5;var UsageError=class extends Error{constructor(message,hint){super(message);this.hint=hint;this.name="UsageError"}hint};var ApiResponseError=class extends Error{constructor(message){super(message);this.name="ApiResponseError"}};var NetworkError=class extends Error{constructor(message,options){super(message,options);this.name="NetworkError"}};var DEFAULT_MAX_PAGES=100;var DEFAULT_MAX_ITEMS=1e4;var LIST_FLAGS=[{name:"--limit",summary:"\u53D6\u5F97\u4EF6\u6570\uFF08\u30B5\u30FC\u30D0\u5074\u306E\u4E0A\u9650\u3067\u5207\u308A\u6368\u3066\u3089\u308C\u307E\u3059\uFF0F--all \u3068\u4F75\u7528\u3057\u305F\u3068\u304D\u306F1\u30DA\u30FC\u30B8\u306E\u4EF6\u6570\uFF09",takesValue:true,placeholder:"<\u4EF6\u6570>"},{name:"--cursor",summary:"\u7D9A\u304D\u3092\u53D6\u5F97\u3059\u308B\u30AB\u30FC\u30BD\u30EB\uFF08\u524D\u56DE\u306E\u5FDC\u7B54\u306E next_cursor\uFF09",
|
|
4
|
+
takesValue:true,placeholder:"<\u30AB\u30FC\u30BD\u30EB>"},{name:"--all",summary:"\u5168\u30DA\u30FC\u30B8\u3092\u81EA\u52D5\u3067\u8FBF\u308B\uFF08--cursor \u3068\u4F75\u7528\u3059\u308B\u3068\u305D\u306E\u30AB\u30FC\u30BD\u30EB\u4EE5\u964D\u3092\u5168\u4EF6\uFF09",takesValue:false},{name:"--max-pages",summary:`--all \u304C\u7D9A\u304D\u3092\u53D6\u308A\u306B\u884C\u304F\u4E0A\u9650\u30DA\u30FC\u30B8\u6570\uFF08\u65E2\u5B9A ${DEFAULT_MAX_PAGES}\uFF09`,takesValue:true,placeholder:"<\u30DA\u30FC\u30B8\u6570>"},
|
|
5
|
+
{name:"--max-items",summary:`--all \u304C\u7D9A\u304D\u3092\u53D6\u308A\u306B\u884C\u304F\u4E0A\u9650\u4EF6\u6570\uFF08\u65E2\u5B9A ${DEFAULT_MAX_ITEMS}\uFF09`,takesValue:true,placeholder:"<\u4EF6\u6570>"}];var LIST_PAGING_HELP="\u30DA\u30FC\u30B8\u30F3\u30B0:\n --all \u3092\u4ED8\u3051\u308B\u3068\u6700\u5F8C\u306E\u30DA\u30FC\u30B8\u307E\u3067\u81EA\u52D5\u3067\u8FBF\u308A\u307E\u3059\uFF08--limit \u306F1\u30DA\u30FC\u30B8\u306E\u4EF6\u6570\u306B\u306A\u308A\u307E\u3059\uFF09\u3002\n --all \u3068 --cursor \u3092\u4F75\u7528\u3059\u308B\u3068\u3001\u305D\u306E\u30AB\u30FC\u30BD\u30EB\u4EE5\u964D\u3092\u5168\u4EF6\u53D6\u5F97\u3057\u307E\u3059\uFF08\u4E2D\u65AD\u3057\u305F\u53D6\u5F97\u306E\u518D\u958B\uFF09\u3002\n\n \u66B4\u8D70\u3092\u9632\u3050\u305F\u3081 --max-pages / --max-items \u306E\u4E0A\u9650\u304C\u3042\u308A\u307E\u3059\u3002\u3053\u308C\u306F\u300C\u7D9A\u304D\u3092\u53D6\u308A\u306B\u884C\u304F\u304B\u300D\n \u306E\u5224\u5B9A\u306B\u3060\u3051\u4F7F\u308F\u308C\u3001\u7D50\u679C\u3092\u9014\u4E2D\u3067\u5207\u308A\u8A70\u3081\u308B\u3053\u3068\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u8FBF\u308A\u304D\u308B\u524D\u306B\u4E0A\u9650\u3078\u9054\u3057\u305F\n \u5834\u5408\u306F\u300C\u5168\u4EF6\u3067\u306F\u306A\u3044\u300D\u3053\u3068\u3092\u660E\u793A\u3057\u3066\u505C\u6B62\u3057\u3001\u90E8\u5206\u7684\u306A\u7D50\u679C\u306F\u51FA\u529B\u3057\u307E\u305B\u3093\uFF08\u53D6\u5F97\u6E08\u307F\u4EF6\u6570\u3068\n \u518D\u958B\
|
|
6
|
+
\u7528\u306E\u30AB\u30FC\u30BD\u30EB\u306F stderr \u306B\u51FA\u307E\u3059\uFF09\u30021\u5F80\u5FA9\u3067\u5168\u4EF6\u304C\u8FD4\u3063\u305F\u3068\u304D\u306F\u4E0A\u9650\u3092\u8D85\u3048\u3066\u3044\u3066\u3082\u6210\u529F\u3067\u3059\u3002\n \u5F80\u5FA9\u304C\u591A\u3059\u304E\u3066\u4E0A\u9650\u306B\u5F53\u305F\u308B\u5834\u5408\u306F\u3001--max-pages \u3092\u4E0A\u3052\u308B\u3088\u308A --limit \u3092\u5927\u304D\u304F\u3059\u308B\u307B\u3046\u304C\u901F\u3044\n \u3053\u3068\u304C\u3042\u308A\u307E\u3059\uFF081\u5F80\u5FA9\u3042\u305F\u308A\u306E\u4EF6\u6570\u304C\u5897\u3048\u308B\u305F\u3081\uFF09\u3002\n\n \u26A0 --keyword \u3092\u4F75\u7528\u3057\u305F\u4E00\u89A7\u306F\u3001\u30B5\u30FC\u30D0\u5074\u304C\u30DA\u30FC\u30B8\u756A\u53F7\u306B\u3088\u308B\u4F4D\u7F6E\u6307\u5B9A\u3067\u5FDC\u7B54\u3057\u307E\u3059\u3002\n \u8FBF\u3063\u3066\u3044\u308B\u6700\u4E2D\u306B\u30C7\u30FC\u30BF\u304C\u5897\u6E1B\u3059\u308B\u3068\u3001\u53D6\u308A\u3053\u307C\u3057\u30FB\u91CD\u8907\u304C\u8D77\u3053\u308A\u5F97\u307E\u3059\u3002";
|
|
7
|
+
function isRecord(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function positiveInteger(flags,name){const raw=flags.get(name);if(raw===void 0)return void 0;const n=Number.parseInt(raw,10);if(!Number.isInteger(n)||n<=0||String(n)!==raw.trim()){throw new UsageError(`${name} \u306B\u306F\u6B63\u306E\u6574\u6570\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u53D7\u3051\u53D6\u3063\u305F\u5024: ${raw}\uFF09`)}return n}function nonEmpty(flags,name){const raw=flags.
|
|
8
|
+
get(name);if(raw===void 0)return void 0;if(raw.trim()==="")throw new UsageError(`${name} \u306B\u7A7A\u306E\u5024\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093`);return raw}function readEnvelopeCursor(body){const record=isRecord(body)?body:{};const nested=isRecord(record["pagination"])?record["pagination"]:void 0;return{hasMore:nested!==void 0&&"has_more"in nested?nested["has_more"]:record["has_more"],cursor:nested!==void 0&&"next_cursor"in nested?nested["next_cursor"]:record["next_cursor"]}}function envelopePaging(options){
|
|
9
|
+
const itemsKey=options.itemsKey??"items";const cursorParam=options.cursorParam??"cursor";const items=body=>{const value=isRecord(body)?body[itemsKey]:void 0;if(!Array.isArray(value)){throw new ApiResponseError(`${options.label}\u306E\u5FDC\u7B54\u306B ${itemsKey} \u914D\u5217\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}return value};return{cursorParam,items,nextCursor(body){const{hasMore,cursor}=readEnvelopeCursor(body);
|
|
10
|
+
if(hasMore!==true){if(hasMore===false||hasMore===void 0&&cursor===void 0||hasMore===null){return null}throw new ApiResponseError(`${options.label}\u306E\u5FDC\u7B54\u306E has_more \u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08\u53D7\u3051\u53D6\u3063\u305F\u5024: ${JSON.stringify(hasMore)??"undefined"}\uFF09\u3002\u7D9A\u304D\u306E\u6709\u7121\u3092\u5224\u5B9A\u3067\u304D\u306A\u3044\u305F\u3081\u4E2D\u65AD\u3057\u307E\u3057\u305F\u3002`)}if(typeof cursor!=="string"||cursor===""){throw new ApiResponseError(
|
|
11
|
+
`${options.label}\u306E\u5FDC\u7B54\u306B\u7D9A\u304D\u304C\u3042\u308B\uFF08has_more: true\uFF09\u3068\u793A\u3055\u308C\u3066\u3044\u307E\u3059\u304C\u3001next_cursor \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u5168\u4EF6\u3092\u53D6\u5F97\u3067\u304D\u306A\u3044\u305F\u3081\u4E2D\u65AD\u3057\u307E\u3057\u305F\u3002`)}return cursor},withItems(body,merged){items(body);return{...body,[itemsKey]:[...merged]}}}}var SHELL_SAFE=/^[A-Za-z0-9_@%+:,./-][A-Za-z0-9_@%+=:,./-]*$/;function shellQuote(value){
|
|
12
|
+
if(SHELL_SAFE.test(value))return value;return`'${value.replace(/'/g,"'\\''")}'`}function flagSegment(name,value){return value.startsWith("-")?`${name}=${shellQuote(value)}`:`${name} ${shellQuote(value)}`}var PAGING_CONTROL_FLAGS=new Set(LIST_FLAGS.map(spec=>spec.name).filter(name=>name!=="--limit"));var CONTROL_CHARS=/[\u0000-\u001f\u007f-\u009f]/;function nextPageCommand(input,cursor,context){const flags=[];if(context.profile!==void 0)flags.push(flagSegment("--profile",context.profile));for(const spec of context.
|
|
13
|
+
flags){if(PAGING_CONTROL_FLAGS.has(spec.name))continue;const value=input.flags.get(spec.name);if(value===void 0)continue;flags.push(spec.takesValue?flagSegment(spec.name,value):spec.name)}flags.push(flagSegment("--cursor",cursor));const args=input.args.map(arg=>shellQuote(arg));const separated=input.args.some(arg=>arg.startsWith("-"));return separated?[context.command,...flags,"--",...args].join(" "):[context.command,...args,...flags].join(" ")}function nextPageNotes(body,input,context){const{hasMore,
|
|
14
|
+
cursor}=readEnvelopeCursor(body);if(hasMore!==true){if(hasMore===false||hasMore===null||hasMore===void 0&&cursor===void 0)return[];return[`\u5FDC\u7B54\u306E has_more \u3092\u89E3\u91C8\u3067\u304D\u306A\u3044\u305F\u3081\u3001\u7D9A\u304D\u306E\u6709\u7121\u3092\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093\uFF08\u53D7\u3051\u53D6\u3063\u305F\u5024: ${JSON.stringify(hasMore)??"undefined"}\uFF09\u3002\u5168\u4EF6\u304C\u8981\u308B\u306A\u3089 --all \u3092\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002`]}
|
|
15
|
+
if(typeof cursor!=="string"||cursor==="")return["\u7D9A\u304D\u304C\u3042\u308A\u307E\u3059\u304C\u3001\u5FDC\u7B54\u306B next_cursor \u304C\u3042\u308A\u307E\u305B\u3093\u3002"];if(CONTROL_CHARS.test(cursor)){return["\u7D9A\u304D\u304C\u3042\u308A\u307E\u3059\u304C\u3001\u5FDC\u7B54\u306E next_cursor \u306B\u5236\u5FA1\u6587\u5B57\u304C\u542B\u307E\u308C\u308B\u305F\u3081\u6848\u5185\u3092\u51FA\u305B\u307E\u305B\u3093\u3002--all \u3092\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\u3002"]}const hint=context.
|
|
16
|
+
flags.some(spec=>spec.name==="--all")?"\uFF08\u5168\u4EF6\u306F --all\uFF09":"";return[`\u7D9A\u304D\u304C\u3042\u308A\u307E\u3059\u3002\u6B21\u306E\u30DA\u30FC\u30B8: ${nextPageCommand(input,cursor,context)}${hint}`]}export{EXIT_OK,EXIT_FAILURE,EXIT_USAGE,EXIT_API_CLIENT,EXIT_API_SERVER,EXIT_AUTH,UsageError,ApiResponseError,NetworkError,DEFAULT_MAX_PAGES,DEFAULT_MAX_ITEMS,LIST_FLAGS,LIST_PAGING_HELP,positiveInteger,nonEmpty,envelopePaging,shellQuote,nextPageNotes};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import readline from"readline/promises";var PromptAbortedError=class extends Error{constructor(){super("\u5165\u529B\u304C\u4E2D\u65AD\u3055\u308C\u307E\u3057\u305F")}};var pipeBuffer="";var pipeEnded=false;function readPipedLine(){const{stdin}=process;const takeLine=()=>{const nl=pipeBuffer.indexOf("\n");if(nl>=0){const line=pipeBuffer.slice(0,nl).replace(/\r$/,"");pipeBuffer=pipeBuffer.slice(nl+1);return line}if(pipeEnded&&pipeBuffer!==""){const line=pipeBuffer;pipeBuffer="";return line}return null};
|
|
4
|
+
const immediate=takeLine();if(immediate!==null)return Promise.resolve(immediate);if(pipeEnded)return Promise.reject(new PromptAbortedError);return new Promise((resolve,reject)=>{stdin.setEncoding("utf8");const cleanup=()=>{stdin.off("data",onData);stdin.off("end",onEnd);stdin.pause()};const onData=chunk=>{pipeBuffer+=chunk;const line=takeLine();if(line!==null){cleanup();resolve(line)}};const onEnd=()=>{pipeEnded=true;cleanup();const line=takeLine();if(line!==null){resolve(line)}else{reject(new PromptAbortedError)}};
|
|
5
|
+
stdin.on("data",onData);stdin.on("end",onEnd);stdin.resume()})}async function promptText(question){if(!process.stdin.isTTY){process.stdout.write(question);const line=await readPipedLine();process.stdout.write("\n");return line.trim()}const rl=readline.createInterface({input:process.stdin,output:process.stdout});try{return(await rl.question(question)).trim()}finally{rl.close()}}function stepEscape(state,ch){const code=ch.codePointAt(0)??0;if(state!=="none"&&(ch===""||ch==="")){return{state:"non\
|
|
6
|
+
e",consumed:false}}if(state==="esc"&&(ch==="\r"||ch==="\n"||ch==="\x7F"||ch==="\b")){return{state:"none",consumed:false}}switch(state){case"none":return ch==="\x1B"?{state:"esc",consumed:true}:{state:"none",consumed:false};case"esc":if(ch==="[")return{state:"csi",consumed:true};if(ch==="O")return{state:"ss3",consumed:true};if(ch==="\x1B")return{state:"esc",consumed:true};return{state:"none",consumed:true};case"csi":return code>=64&&code<=126?{state:"none",consumed:true}:{state:"csi",consumed:true};case"\
|
|
7
|
+
ss3":return{state:"none",consumed:true}}}async function promptHidden(question){const{stdin,stdout}=process;if(!stdin.isTTY){return readPipedLine()}stdout.write(question);return new Promise((resolve,reject)=>{let value="";let escape="none";stdin.setRawMode(true);stdin.setEncoding("utf8");stdin.resume();const cleanup=()=>{stdin.off("data",onData);stdin.setRawMode(false);stdin.pause();stdout.write("\n")};const onData=chunk=>{for(const ch of chunk){const step=stepEscape(escape,ch);escape=step.state;
|
|
8
|
+
if(step.consumed)continue;if(ch===""||ch===""){cleanup();reject(new PromptAbortedError);return}if(ch==="\r"||ch==="\n"){cleanup();resolve(value);return}if(ch==="\x7F"||ch==="\b"){value=value.slice(0,-1);continue}if(ch<" ")continue;value+=ch}};stdin.on("data",onData)})}export{PromptAbortedError,promptText,promptHidden};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import{spawnSync}from"child_process";import path from"path";function isForceOnly(platform=process.platform){return platform==="win32"}function system32(env,...rest){const root=env["SystemRoot"]??env["windir"]??"";if(root==="")return null;if(!isWindowsDriveAbsolute(root))return null;return path.win32.join(root,"System32",...rest)}function taskkillPath(env){return system32(env,"taskkill.exe")}function killProcessTree(child,signal,deps={}){const platform=deps.platform??process.platform;const env=deps.env??process.env;const run=deps.run??spawnSync;const pid=child.
|
|
4
|
+
pid;const direct=sig=>{try{child.kill(sig)}catch{}return"direct"};if(pid===void 0||pid<=0)return"skipped";if(platform==="win32"){if(child.exitCode!==null||child.signalCode!==null)return"skipped";const taskkill=taskkillPath(env);if(taskkill===null)return direct("SIGKILL");const r=run(taskkill,["/PID",String(pid),"/T","/F"],{stdio:"ignore",windowsHide:true,timeout:1e4});if(r.error===void 0&&r.status===0)return"taskkill";return direct("SIGKILL")}try{if(deps.killGroup!==void 0)deps.killGroup(pid,signal);else
|
|
5
|
+
process.kill(-pid,signal);return"group"}catch(e){if(e.code==="ESRCH"&&child.exitCode===null&&child.signalCode===null){return direct(signal)}return"skipped"}}export{isForceOnly,system32,killProcessTree};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{DEFAULT_CLAUDE_LAUNCHER,isBoolishTrue,loadAiConfig}from"./chunk-3WJHTPOZ.js";import{projectFileKey}from"./chunk-GY7KI5E5.js";import{killProcessTree}from"./chunk-N2UVRM3Z.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import{twpHomeDir}from"./chunk-RZVI6PMW.js";function stringField(value,key,fallback,warnings){if(value===void 0||value===null)return fallback;if(typeof value!=="string"||value.trim()===""){warnings.push(`claude_launcher.${key} \u306F\u7A7A\u3067\u306A\u3044\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u65E2\u5B9A '${fallback}' \u3092\u4F7F\u3044\u307E\u3059\uFF09`);return fallback}return value.trim()}function argvField(value,key,fallback,warnings,allowEmpty){if(value===void 0||value===null)return fallback;
|
|
4
|
+
if(!Array.isArray(value)){warnings.push(`claude_launcher.${key} \u306F\u6587\u5B57\u5217\u306E\u914D\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u65E2\u5B9A [${fallback.join(", ")}] \u3092\u4F7F\u3044\u307E\u3059\uFF09`);return fallback}for(const v of value){if(typeof v!=="string"||v.trim()===""){warnings.push(`claude_launcher.${key} \u306E\u8981\u7D20\u306F\u7A7A\u3067\u306A\u3044\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u65E2\u5B9A [${fallback.
|
|
5
|
+
join(", ")}] \u3092\u4F7F\u3044\u307E\u3059\uFF09`);return fallback}}if(value.length===0&&!allowEmpty){warnings.push(`claude_launcher.${key} \u306F1\u3064\u4EE5\u4E0A\u306E\u5F15\u6570\u304C\u8981\u308A\u307E\u3059\uFF08\u65E2\u5B9A [${fallback.join(", ")}] \u3092\u4F7F\u3044\u307E\u3059\uFF09`);return fallback}return value.map(v=>v.trim())}function probeMatchField(value,warnings){const raw=stringField(value,"probe_match",DEFAULT_CLAUDE_LAUNCHER.probeMatch,warnings);try{new RegExp(raw,"m")}catch(err){
|
|
6
|
+
warnings.push(`claude_launcher.probe_match \u306F\u6B63\u898F\u8868\u73FE\u3068\u3057\u3066\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08${err.message}\uFF09\u3002\u65E2\u5B9A '${DEFAULT_CLAUDE_LAUNCHER.probeMatch}' \u3092\u4F7F\u3044\u307E\u3059`);return DEFAULT_CLAUDE_LAUNCHER.probeMatch}return raw}var NOT_YET_APPLIED=[{key:"probe",get:c=>c.probe},{key:"probe_match",get:c=>c.probeMatch},{key:"exec_args",get:c=>c.execArgs},{key:"active_args",get:c=>c.activeArgs}];function sameAsDefault(key,parsed){
|
|
7
|
+
const entry=NOT_YET_APPLIED.find(e=>e.key===key);if(entry===void 0)return true;const a=entry.get(parsed);const b=entry.get(DEFAULT_CLAUDE_LAUNCHER);return typeof a==="string"||typeof b==="string"?a===b:a.length===b.length&&a.every((v,i)=>v===b[i])}function parseClaudeLauncher(value){const warnings=[];if(value===void 0||value===null){return{launcher:DEFAULT_CLAUDE_LAUNCHER,warnings}}if(typeof value!=="object"||Array.isArray(value)){warnings.push("claude_launcher \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u65E2\u5B9A\u306E\u8D77\u52D5\u65B9\u6CD5\u3092\u4F7F\u3044\u307E\u3059\uFF09");
|
|
8
|
+
return{launcher:DEFAULT_CLAUDE_LAUNCHER,warnings}}const v=value;const launcher={bin:stringField(v["bin"],"bin",DEFAULT_CLAUDE_LAUNCHER.bin,warnings),probe:argvField(v["probe"],"probe",DEFAULT_CLAUDE_LAUNCHER.probe,warnings,true),probeMatch:probeMatchField(v["probe_match"],warnings),execArgs:argvField(v["exec_args"],"exec_args",DEFAULT_CLAUDE_LAUNCHER.execArgs,warnings,false),activeArgs:argvField(v["active_args"],"active_args",DEFAULT_CLAUDE_LAUNCHER.activeArgs,warnings,false)};for(const{key}of NOT_YET_APPLIED){
|
|
9
|
+
if(!sameAsDefault(key,launcher)){warnings.push(`claude_launcher.${key} \u306F\u307E\u3060\u9069\u7528\u3055\u308C\u307E\u305B\u3093\uFF08\u3053\u306E\u7248\u3067\u52B9\u304F\u306E\u306F bin \u3060\u3051\u3067\u3059\uFF09`)}}return{launcher,warnings}}import{randomBytes}from"crypto";import fs from"fs";import os from"os";import path from"path";function evaluateOwnership(item,runnerId,runId){if(!item){return{verdict:"unknown",reason:"\u30A2\u30A4\u30C6\u30E0\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F"}}if(runnerId===""||runId===""){return{verdict:"unknown",reason:"\u81EA\u5206\u306E runner_id / run_id \u304C\u7A7A\u3067\u3059"}}const status=(item.status??"").trim();if(status===""){return{verdict:"unknown",reason:"\u5FDC\u7B54\u306B status \u304C\u3042\u308A\u307E\u305B\u3093"}}if(status!=="processing"){return{verdict:"\
|
|
10
|
+
lost",reason:`status=${status}\uFF08processing \u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF09`}}const itemRunner=(item.runner_id??"").trim();const itemRun=(item.run_id??"").trim();if(itemRunner===""||itemRun===""){return{verdict:"unknown",reason:"\u5FDC\u7B54\u306B runner_id / run_id \u304C\u3042\u308A\u307E\u305B\u3093"}}if(itemRunner!==runnerId){return{verdict:"lost",reason:`\u5225\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u4FDD\u6301\u3057\u3066\u3044\u307E\u3059\uFF08runner=${itemRunner}\uFF09`}}
|
|
11
|
+
if(itemRun!==runId){return{verdict:"lost",reason:`\u540C\u3058\u6A5F\u4F53\u306E\u5225\u306E\u8D77\u52D5\u304C\u4FDD\u6301\u3057\u3066\u3044\u307E\u3059\uFF08run_id \u304C\u4E00\u81F4\u3057\u307E\u305B\u3093\uFF09`}}return{verdict:"held",reason:"processing \u304B\u3064 runner_id / run_id \u304C\u4E00\u81F4"}}var OWNERSHIP_CHECK_INTERVAL_SEC=60;import{spawn}from"child_process";function resolveHookCommand(file,env){if(process.platform!=="win32")return file;if(isWindowsDriveAbsolute(file))return file;return findExecutable(file,{env,platform:"win32"})}var DEFAULT_TIMEOUT_SEC=120;var MAX_OUTPUT_BYTES=512*1024;var HOOK_ID_RE=/^[A-Za-z0-9._:-]{1,64}$/;function validateHooks(raw,configKey="prefetch"){const warnings=[];if(raw===void 0||raw===null)return{hooks:[],warnings};if(!Array.isArray(raw)){return{hooks:[],warnings:[`${configKey} \u306F\u914D\u5217\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u30D5\u30C3\u30AF\u306F1\u3064\u3082\u5B9F\u884C\u3057\u307E\u305B\u3093`]}}
|
|
12
|
+
const hooks=[];const seen=new Set;for(const[i,entry]of raw.entries()){if(entry===null||typeof entry!=="object"||Array.isArray(entry)){warnings.push(`${configKey}[${i}] \u304C\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u3053\u306E\u30D5\u30C3\u30AF\u306F\u5B9F\u884C\u3057\u307E\u305B\u3093`);continue}const e=entry;const id=typeof e["id"]==="string"?e["id"].trim():"";const command=e["command"];if(id===""){warnings.push(`${configKey}[${i}] \u306B id \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u3053\u306E\u30D5\u30C3\u30AF\u306F\
|
|
13
|
+
\u5B9F\u884C\u3057\u307E\u305B\u3093`);continue}if(!HOOK_ID_RE.test(id)){warnings.push(`${configKey}[${i}] \u306E id '${id}' \u306F64\u6587\u5B57\u4EE5\u4E0B\u306E\u82F1\u6570\u5B57\u3068 . _ : - \u3060\u3051\u3092\u4F7F\u3048\u307E\u3059\u3002\u3053\u306E\u30D5\u30C3\u30AF\u306F\u5B9F\u884C\u3057\u307E\u305B\u3093`);continue}if(seen.has(id)){warnings.push(`${configKey}[${i}] \u306E id '${id}' \u304C\u91CD\u8907\u3057\u3066\u3044\u307E\u3059\u3002\u3053\u306E\u30D5\u30C3\u30AF\u306F\u5B9F\u884C\u3057\u307E\u305B\u3093`);
|
|
14
|
+
continue}if(!Array.isArray(command)||command.length===0||!command.every(c=>typeof c==="string")){warnings.push(`${configKey}[${i}]\uFF08${id}\uFF09\u306E command \u304C\u6587\u5B57\u5217\u306E\u914D\u5217\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u3053\u306E\u30D5\u30C3\u30AF\u306F\u5B9F\u884C\u3057\u307E\u305B\u3093`);continue}const timeout=typeof e["timeout"]==="number"&&Number.isFinite(e["timeout"])&&e["timeout"]>0?Math.trunc(e["timeout"]):DEFAULT_TIMEOUT_SEC;seen.add(id);hooks.push({id,
|
|
15
|
+
command,timeout})}return{hooks,warnings}}async function runHook(hook,cwd,env=process.env,allowEmpty=false){const started=Date.now();const[file,...args]=hook.command;if(file===void 0){return{id:hook.id,ok:false,stdout:"",reason:"command \u304C\u7A7A\u3067\u3059",durationMs:0}}return new Promise(resolve=>{const resolved=resolveHookCommand(file,env);if(resolved===null){resolve({id:hook.id,ok:false,stdout:"",reason:`\u5B9F\u884C\u30D5\u30A1\u30A4\u30EB ${file} \u3092 PATH \u4E0A\u3067\u89E3\u6C7A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08Windows \u3067\u306F bare nam\
|
|
16
|
+
e \u3067\u8D77\u52D5\u3057\u307E\u305B\u3093\uFF09`,durationMs:0});return}let child;try{child=spawn(resolved,args,{cwd,env,detached:process.platform!=="win32",stdio:["ignore","pipe","pipe"]})}catch(e){const code=e.code??"spawn \u5931\u6557";resolve({id:hook.id,ok:false,stdout:"",reason:`\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093: ${file} (${code})`,durationMs:Date.now()-started});return}let stdout="";let stderr="";let truncated=false;let timedOut=false;const timer=setTimeout(()=>{timedOut=true;killProcessTree(
|
|
17
|
+
child,"SIGKILL")},(hook.timeout??DEFAULT_TIMEOUT_SEC)*1e3);child.stdout.on("data",c=>{if(stdout.length>=MAX_OUTPUT_BYTES){truncated=true;return}stdout+=c.toString("utf8");if(stdout.length>MAX_OUTPUT_BYTES){stdout=stdout.slice(0,MAX_OUTPUT_BYTES);truncated=true}});child.stderr.on("data",c=>{if(stderr.length<8192)stderr+=c.toString("utf8")});const done=(ok,reason)=>{clearTimeout(timer);resolve({id:hook.id,ok,stdout:truncated?`${stdout}
|
|
18
|
+
\u2026\uFF08\u51FA\u529B\u304C\u4E0A\u9650\u3092\u8D85\u3048\u305F\u305F\u3081\u5207\u308A\u8A70\u3081\u307E\u3057\u305F\uFF09`:stdout,reason,durationMs:Date.now()-started})};child.on("error",e=>done(false,`\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093: ${e.message}`));child.on("close",code=>{if(timedOut)return done(false,`\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\uFF08${hook.timeout??DEFAULT_TIMEOUT_SEC}\u79D2\uFF09`);if(code!==0)return done(false,`\u7D42\u4E86\u30B3\u30FC\u30C9 ${code}${stderr.trim()===
|
|
19
|
+
""?"":`: ${firstLine(stderr)}`}`);if(!allowEmpty&&stdout.trim()==="")return done(false,"\u51FA\u529B\u304C\u7A7A\u3067\u3057\u305F");done(true,null)})})}async function runPrefetch(hooks,cwd,log,env=process.env){if(hooks.length===0)return"";const sections=[];for(const hook of hooks){const r=await runHook(hook,cwd,env);if(r.ok){log(` prefetch: ${r.id} \u53D6\u5F97\u5B8C\u4E86\uFF08${Math.round(r.durationMs/1e3)}s\uFF09`);sections.push(`--- prefetch: ${r.id} ---
|
|
20
|
+
${r.stdout.trim()}`)}else{log(` \u26A0\uFE0F prefetch: ${r.id} \u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${r.reason}\uFF09`);sections.push(`--- prefetch: ${r.id} ---
|
|
21
|
+
\uFF08\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${r.reason}\u3002\u3053\u306E\u60C5\u5831\u306F\u6B20\u3051\u3066\u3044\u307E\u3059\uFF09`)}}return["\u3010\u4E8B\u524D\u53D6\u5F97\u6E08\u307F\u30C7\u30FC\u30BF\u3011","\u4EE5\u4E0B\u306F\u30EB\u30FC\u30D7\u304C\u4E8B\u524D\u306B\u53D6\u5F97\u3057\u305F\u8A08\u753B\u7528\u30C7\u30FC\u30BF\u3067\u3059\u3002\u540C\u3058\u60C5\u5831\u3092\u96C6\u3081\u76F4\u3059\u5FC5\u8981\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u300C\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u300D\u3068\u66F8\u304B\u308C\u305F\u7BC0\u3060\u3051\
|
|
22
|
+
\u306F\u6B20\u3051\u3066\u3044\u308B\u306E\u3067\u3001\u5FC5\u8981\u306A\u3089\u305D\u306E\u5206\u3092\u81EA\u5206\u3067\u53D6\u5F97\u3057\u3066\u304F\u3060\u3055\u3044\u3002","",sections.join("\n\n")].join("\n")}async function runPreflight(hooks,cwd,log,env=process.env){if(hooks.length===0)return"";const sections=[];for(const hook of hooks){const r=await runHook(hook,cwd,env,true);if(r.ok){log(` preflight: ${r.id} \u78BA\u8A8D\u5B8C\u4E86\uFF08${Math.round(r.durationMs/1e3)}s\uFF09`);if(r.stdout.
|
|
23
|
+
trim()!=="")sections.push(`--- preflight: ${r.id} ---
|
|
24
|
+
${r.stdout.trim()}`)}else{log(` \u26A0\uFE0F preflight: ${r.id} \u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${r.reason}\uFF09`);sections.push(`--- preflight: ${r.id} ---
|
|
25
|
+
\uFF08\u78BA\u8A8D\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${r.reason}\u3002\u3053\u306E\u524D\u63D0\u6761\u4EF6\u306F\u4E0D\u660E\u3067\u3059\uFF09`)}}if(sections.length===0)return"";return["\u3010\u74B0\u5883\u306E\u524D\u63D0\u6761\u4EF6\uFF08preflight\uFF09\u3011","\u4EE5\u4E0B\u306F\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u306E\u5192\u982D\u3067\u78BA\u8A8D\u3057\u305F\u74B0\u5883\u60C5\u5831\u3067\u3059\u3002\u8A08\u753B\u3068\u5404\u30A2\u30A4\u30C6\u30E0\u306E\u5B9F\u884C\u3067\u8003\u616E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
26
|
+
"\u5931\u6557\u3057\u305F\u30D5\u30C3\u30AF\u304C\u3042\u3063\u3066\u3082\u30B5\u30A4\u30AF\u30EB\u306F\u7D99\u7D9A\u3057\u307E\u3059\u3002\u5FC5\u8981\u306A\u62C5\u4FDD\u304C\u53D6\u308C\u306A\u3044\u5834\u5408\u306F\u3001\u305D\u306E\u4E8B\u5B9F\u3092\u660E\u8A18\u3057\u3066\u304F\u3060\u3055\u3044\u3002","",sections.join("\n\n")].join("\n")}function firstLine(s){return(s.trim().split("\n")[0]??"").slice(0,200)}function formatHookWiring(prefetch,preflight){return`LOOP_HOOKS ${formatHookIds(prefetch,
|
|
27
|
+
preflight)}`}function formatHookIds(prefetch,preflight){const ids=hooks=>hooks.map(h=>h.id).join(",");return`prefetch=[${ids(prefetch)}] preflight=[${ids(preflight)}]`}var NO_OPERATIONS={exclusiveSkills:new Set,statusEndpoint:null,highRiskSkills:new Set,preflightHosts:[],releaseRecoverySkill:null,postSuccessEnqueue:new Map,contractSkills:new Set,zeroTargetGates:{}};var DEFAULT_STATUS_PATH="/api/release/list";var DEFAULT_STATUS_HEADER="X-API-Key";function stringArray(value,label,warnings){if(value===void 0||value===null)return[];if(!Array.isArray(value)){warnings.push(`operations.${label} \u306F\u914D\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09`);
|
|
28
|
+
return[]}const out=[];for(const v of value){if(typeof v!=="string"||v.trim()===""){warnings.push(`operations.${label} \u306E\u8981\u7D20\u306F\u7A7A\u3067\u306A\u3044\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u3053\u306E\u8981\u7D20\u306F\u7121\u8996\u3057\u307E\u3059\uFF09`);continue}out.push(v.trim())}return out}function stringMap(value,label,warnings){const out=new Map;if(value===void 0||value===null)return out;if(typeof value!=="object"||Array.isArray(value)){
|
|
29
|
+
warnings.push(`operations.${label} \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09`);return out}for(const[k,v]of Object.entries(value)){if(typeof v!=="string"||v.trim()===""){warnings.push(`operations.${label}.${k} \u306F\u7A7A\u3067\u306A\u3044\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u3053\u306E\u9805\u76EE\u306F\u7121\u8996\u3057\u307E\u3059\uFF09`);continue}out.set(
|
|
30
|
+
k,v.trim())}return out}function parseZeroTargetGates(value,warnings){const out={};if(value===void 0||value===null)return out;if(typeof value!=="object"||Array.isArray(value)){warnings.push("operations.zero_target_gates \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09");return out}for(const[skill,v]of Object.entries(value)){if(typeof v!=="object"||v===null||Array.isArray(v)){warnings.push(`operations.zero_ta\
|
|
31
|
+
rget_gates.${skill} \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09`);continue}const g=v;const field=typeof g["field"]==="string"?g["field"].trim():"";const label=typeof g["label"]==="string"?g["label"].trim():"";if(field===""||label===""){warnings.push(`operations.zero_target_gates.${skill} \u306B\u306F field \u3068 label \u304C\u8981\u308A\u307E\u3059\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09`);continue}
|
|
32
|
+
out[skill]={field,label}}return out}function parseEndpoint(value,warnings){if(value===void 0||value===null)return null;if(typeof value!=="object"||Array.isArray(value)){warnings.push("operations.status_endpoint \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u6392\u4ED6\u3092\u7121\u52B9\u306B\u3057\u307E\u3059\uFF09");return null}const o=value;const url=typeof o["url"]==="string"?o["url"].trim():"";if(url===""){warnings.push("operations.sta\
|
|
33
|
+
tus_endpoint.url \u304C\u7121\u3044\u305F\u3081\u6392\u4ED6\u3092\u7121\u52B9\u306B\u3057\u307E\u3059");return null}if(!/^https?:\/\//i.test(url)){warnings.push(`operations.status_endpoint.url \u306F http(s) \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: ${url}\uFF08\u6392\u4ED6\u3092\u7121\u52B9\u306B\u3057\u307E\u3059\uFF09`);return null}const path2=typeof o["path"]==="string"&&o["path"].trim()!==""?o["path"].trim():DEFAULT_STATUS_PATH;const apiKeyEnvRaw=o["api_key_env"];const apiKeyEnv=typeof apiKeyEnvRaw===
|
|
34
|
+
"string"&&apiKeyEnvRaw.trim()!==""?apiKeyEnvRaw.trim():null;const headerRaw=o["header"];const header=typeof headerRaw==="string"&&headerRaw.trim()!==""?headerRaw.trim():DEFAULT_STATUS_HEADER;return{url:url.replace(/\/+$/,""),path:path2.startsWith("/")?path2:`/${path2}`,apiKeyEnv,header}}function parseOperations(value){const warnings=[];if(value===void 0||value===null)return{operations:NO_OPERATIONS,warnings};if(typeof value!=="object"||Array.isArray(value)){warnings.push("operations \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u6307\u5B9A\u3057\u3066\
|
|
35
|
+
\u304F\u3060\u3055\u3044\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09");return{operations:NO_OPERATIONS,warnings}}const o=value;const exclusiveSkills=new Set(stringArray(o["exclusive_skills"],"exclusive_skills",warnings));const statusEndpoint=parseEndpoint(o["status_endpoint"],warnings);if(exclusiveSkills.size>0&&statusEndpoint===null){warnings.push("operations.exclusive_skills \u306F\u3042\u308A\u307E\u3059\u304C status_endpoint \u304C\u7121\u3044\u305F\u3081\u3001\u5B9A\u671F\u67A0\u306E\u6392\u4ED6\u306F\u884C\u3044\u307E\u305B\u3093")}
|
|
36
|
+
if(exclusiveSkills.size===0&&statusEndpoint!==null){warnings.push("operations.status_endpoint \u306F\u3042\u308A\u307E\u3059\u304C exclusive_skills \u304C\u7A7A\u306E\u305F\u3081\u3001\u554F\u3044\u5408\u308F\u305B\u306F\u884C\u3044\u307E\u305B\u3093")}const releaseRecoveryRaw=o["release_recovery_skill"];const releaseRecoverySkill=typeof releaseRecoveryRaw==="string"&&releaseRecoveryRaw.trim()!==""?releaseRecoveryRaw.trim():null;return{operations:{exclusiveSkills,statusEndpoint,highRiskSkills:new Set(
|
|
37
|
+
stringArray(o["high_risk_skills"],"high_risk_skills",warnings)),preflightHosts:stringArray(o["preflight_hosts"],"preflight_hosts",warnings),releaseRecoverySkill,postSuccessEnqueue:stringMap(o["post_success_enqueue"],"post_success_enqueue",warnings),contractSkills:new Set(stringArray(o["contract_skills"],"contract_skills",warnings)),zeroTargetGates:parseZeroTargetGates(o["zero_target_gates"],warnings)},warnings}}function describeOperations(ops){if(ops===NO_OPERATIONS||ops.exclusiveSkills.size===0&&
|
|
38
|
+
ops.highRiskSkills.size===0){return"\u904B\u7528\u8A2D\u5B9A: \u306A\u3057\uFF08\u30B9\u30AD\u30EB\u540D\u306B\u3088\u308B\u7279\u5225\u6271\u3044\u306F\u884C\u3044\u307E\u305B\u3093\uFF09"}const parts=[];if(ops.exclusiveSkills.size>0&&ops.statusEndpoint){parts.push(`\u6392\u4ED6 ${[...ops.exclusiveSkills].join(",")} \u2190 ${ops.statusEndpoint.url}`)}else if(ops.exclusiveSkills.size>0){parts.push(`\u6392\u4ED6 ${[...ops.exclusiveSkills].join(",")}\uFF08\u554F\u3044\u5408\u308F\u305B\u5148\u304C\u7121\u3044\u305F\u3081\u7121\u52B9\uFF09`)}
|
|
39
|
+
if(ops.highRiskSkills.size>0)parts.push(`\u9AD8\u30EA\u30B9\u30AF ${ops.highRiskSkills.size}\u4EF6`);if(ops.releaseRecoverySkill)parts.push(`\u56DE\u53CE ${ops.releaseRecoverySkill}`);return`\u904B\u7528\u8A2D\u5B9A: ${parts.join(" / ")}`}function sanitizeInt(value,fallback,min=1){const n=typeof value==="number"?value:Number.parseInt(String(value??""),10);if(Number.isInteger(n)&&n>=min)return{value:n,warning:null};if(value===void 0||value===null||value==="")return{value:fallback,warning:null};return{value:fallback,warning:`'${String(value)}' \u306F${min}\u4EE5\u4E0A\u306E\u6574\u6570\u3067\u306F\u3042\u308A\u307E\u305B\u3093 \u2192 \u65E2\u5B9A ${fallback} \u3092\u4F7F\u3044\u307E\u3059`}}function nonEmpty(value){const t=value?.trim();
|
|
40
|
+
return t===void 0||t===""?void 0:value}function resolveCharterEnabled(raw,local,warn){const v=(raw??"").trim();if(v!=="")return isBoolishTrue(v);if(local===void 0)return true;if(typeof local==="boolean")return local;if(typeof local==="string")return isBoolishTrue(local.trim()===""?"true":local);warn(`charter_enabled \u306F\u771F\u507D\u5024\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08'${String(local)}' \u306F\u89E3\u91C8\u3067\u304D\u306A\u3044\u305F\u3081\u3001\u61B2\u7AE0\u3092\u524D\u7F6E\u3057\u307E\u3059\uFF09`);
|
|
41
|
+
return true}function charterWrapper(raw,local,key,warn){if(raw!==void 0)return raw;if(local===void 0)return null;if(typeof local==="string")return local;warn(`${key} \u306F\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08'${String(local)}' \u306F\u7121\u8996\u3057\u3001\u65E2\u5B9A\u306E\u56F2\u307F\u6587\u3092\u4F7F\u3044\u307E\u3059\uFF09`);return null}function loopStateDir(env=process.env){const explicit=env.TWP_OPS_STATE_DIR?.trim();if(explicit)return explicit;return path.
|
|
42
|
+
join(os.homedir(),".twp-ops")}function releaseOutcomeLogPath(env=process.env){const explicit=env.RELEASE_OUTCOME_LOG?.trim();if(explicit)return explicit;return path.join(loopStateDir(env),"release-outcomes.tsv")}function localConfigPath(projectId,env=process.env){return path.join(twpHomeDir(env),"loops",`${projectFileKey(projectId)}.json`)}function loadLocalConfig(projectId,env=process.env){const file=localConfigPath(projectId,env);try{const parsed=JSON.parse(fs.readFileSync(file,"utf8"));return parsed!==
|
|
43
|
+
null&&typeof parsed==="object"?parsed:{}}catch(err){if(err.code==="ENOENT")return{};throw new Error(`\u30EB\u30FC\u30D7\u8A2D\u5B9A\u306E\u8AAD\u307F\u53D6\u308A\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${file}
|
|
44
|
+
${err.message}`,{cause:err})}}function resolveRunnerId(stateDir,env=process.env){const file=env.RUNNER_ID_FILE&&env.RUNNER_ID_FILE.trim()!==""?env.RUNNER_ID_FILE:path.join(stateDir,"runner-id");let candidate=env.RUNNER_ID?.trim()??"";if(!candidate){try{candidate=fs.readFileSync(file,"utf8").split("\n")[0]?.trim()??""}catch{candidate=""}}let warning=null;if(candidate&&!/^[A-Za-z0-9._-]+$/.test(candidate)){warning=`runner_id '${candidate}' \u306B\u4F7F\u3048\u306A\u3044\u6587\u5B57\u304C\u542B\u307E\u308C\u308B\u305F\u3081\u63A1\u756A\u3057\u76F4\u3057\u307E\u3057\u305F\uFF08[A-Za-z0-9._-] \u306E\u307F\uFF09`;
|
|
45
|
+
candidate=""}if(!candidate){const host=(os.hostname()||"host").split(".")[0]??"host";const hostPart=host.replace(/[^A-Za-z0-9._-]/g,"-").slice(0,32)||"host";candidate=`${hostPart}-${randomBytes(4).toString("hex")}`;try{fs.mkdirSync(path.dirname(file),{recursive:true,mode:448});fs.writeFileSync(file,`${candidate}
|
|
46
|
+
`,{mode:384})}catch{warning=`runner_id \u3092 ${file} \u3078\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u8D77\u52D5\u306E\u305F\u3073\u306B\u5225\u30E9\u30F3\u30CA\u30FC\u3068\u3057\u3066\u767B\u9332\u3055\u308C\u3001\u53F0\u6570\u4E0A\u9650\u306B\u9054\u3057\u307E\u3059`}}return{runnerId:candidate,warning}}function buildRunId(runnerId,now=new Date){const stamp=now.toISOString().replace(/[-:]/g,"").replace(/\.\d+Z$/,"Z");return`${runnerId}#${stamp}#${process.pid}`}function buildLoopConfig(input){
|
|
47
|
+
const env=input.env??process.env;const warnings=[];const num=(raw,fallback,min=1,label="")=>{const r=sanitizeInt(raw,fallback,min);if(r.warning)warnings.push(`${label}${r.warning}`);return r.value};if(input.daemon&&input.maxCycles!==void 0){warnings.push("--daemon \u3068 --max-cycles \u306F\u540C\u6642\u306B\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093\uFF08--daemon \u3092\u512A\u5148\u3057\u3001--max-cycles \u306F\u7121\u8996\u3057\u307E\u3059\uFF09")}const local=loadLocalConfig(input.projectId,env);
|
|
48
|
+
if(local.schedule_command&&local.schedule_command.length>0){warnings.push("\u30ED\u30FC\u30AB\u30EB\u8A2D\u5B9A\u306E schedule_command \u306F\u4F7F\u308F\u308C\u307E\u305B\u3093\uFF08\u5B9A\u671F\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u306E\u5224\u5B9A\u306F twp-cli \u5185\u3067\u884C\u3044\u307E\u3059\uFF09\u3002\u8A2D\u5B9A\u304B\u3089\u524A\u9664\u3057\u3066\u304F\u3060\u3055\u3044")}if(nonEmpty(env.TWP_TASK_LOOP_SCHEDULE_CMD)){warnings.push("TWP_TASK_LOOP_SCHEDULE_CMD \u306F\u4F7F\u308F\u308C\u307E\u305B\u3093\uFF08\u5B9A\u671F\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u306E\u5224\u5B9A\u306F twp-c\
|
|
49
|
+
li \u5185\u3067\u884C\u3044\u307E\u3059\uFF09")}const stateDir=loopStateDir(env);const{runnerId,warning:runnerWarning}=resolveRunnerId(stateDir,env);if(runnerWarning)warnings.push(runnerWarning);const aiTimeoutSec=num(env.AI_TIMEOUT??local.ai_timeout,4500,60,"AI_TIMEOUT=");const aiSoftDeadlineRatio=Math.min(num(env.AI_SOFT_DEADLINE_RATIO??local.ai_soft_deadline_ratio,80,1,"AI_SOFT_DEADLINE_RATIO="),100);const planLockTtlSec=num(env.PLAN_LOCK_TTL,1800,60,"PLAN_LOCK_TTL=");const workspace=nonEmpty(
|
|
50
|
+
local.workspace)??process.cwd();const ai=loadAiConfig(local.ai,local.ai_config_file,workspace);warnings.push(...ai.warnings);const operations=parseOperations(local.operations);warnings.push(...operations.warnings);const claudeLauncher=parseClaudeLauncher(local.claude_launcher);warnings.push(...claudeLauncher.warnings);const prefetch=validateHooks(local.prefetch);warnings.push(...prefetch.warnings);const preflight=validateHooks(local.preflight,"preflight");warnings.push(...preflight.warnings);return{
|
|
51
|
+
projectId:input.projectId,projectRef:input.projectRef,apiUrl:input.apiUrl,runnerId,runId:buildRunId(runnerId,input.now??new Date),stateDir,logDir:nonEmpty(env.LOG_DIR)??local.log_dir??path.join(os.homedir(),".twp-agent-loop","logs"),logRetentionDays:num(env.LOG_RETENTION_DAYS??local.log_retention_days,7,0,"LOG_RETENTION_DAYS="),workspace,gitIdentity:local.git_identity,safeMode:input.safeMode,daemon:input.daemon,maxCycles:input.daemon?Number.MAX_SAFE_INTEGER:input.maxCycles??1,intervalSec:input.intervalSec??
|
|
52
|
+
300,forceRunner:input.forceRunner,engine:nonEmpty(input.engine)??nonEmpty(local.engine)??"",aiTimeoutSec,aiSoftDeadlineRatio,planTimeoutSec:num(env.PLAN_TIMEOUT??local.plan_timeout,900,60,"PLAN_TIMEOUT="),heartbeatIntervalSec:num(env.AGENT_LOOP_HEARTBEAT_INTERVAL,120,1,"AGENT_LOOP_HEARTBEAT_INTERVAL="),ownershipCheckIntervalSec:num(env.AGENT_LOOP_OWNERSHIP_CHECK_INTERVAL,OWNERSHIP_CHECK_INTERVAL_SEC,0,"AGENT_LOOP_OWNERSHIP_CHECK_INTERVAL="),contendedMax:num(env.AGENT_LOOP_CONTENDED_MAX,10,1,"AGE\
|
|
53
|
+
NT_LOOP_CONTENDED_MAX="),queueUndeterminedMax:num(env.QUEUE_UNDETERMINED_MAX,5,1,"QUEUE_UNDETERMINED_MAX="),staleReclaimHours:num(env.STALE_RECLAIM_HOURS,3,0,"STALE_RECLAIM_HOURS="),planLockTtlSec,planLockWaitMaxSec:num(env.PLAN_LOCK_WAIT_MAX,planLockTtlSec,0,"PLAN_LOCK_WAIT_MAX="),planLockPollIntervalSec:num(env.PLAN_LOCK_POLL_INTERVAL,60,1,"PLAN_LOCK_POLL_INTERVAL="),planLockRenewIntervalSec:num(env.PLAN_LOCK_RENEW_INTERVAL,Math.trunc(planLockTtlSec/3),1,"PLAN_LOCK_RENEW_INTERVAL="),planLockStealAttempts:num(
|
|
54
|
+
env.PLAN_LOCK_STEAL_ATTEMPTS,3,0,"PLAN_LOCK_STEAL_ATTEMPTS="),planLockPermanentMax:num(env.PLAN_LOCK_PERMANENT_MAX,3,1,"PLAN_LOCK_PERMANENT_MAX="),scheduleMidcycleMax:num(env.SCHEDULE_MIDCYCLE_MAX,6,1,"SCHEDULE_MIDCYCLE_MAX="),blockerRecoveryMaxPerDay:num(env.BLOCKER_RECOVERY_MAX_PER_DAY,2,1,"BLOCKER_RECOVERY_MAX_PER_DAY="),releaseRerunAutoEnqueue:env.RELEASE_RERUN_AUTOENQUEUE_ENABLED!=="false",releaseRerunMaxPerCause:num(env.RELEASE_RERUN_MAX_PER_CAUSE,2,1,"RELEASE_RERUN_MAX_PER_CAUSE="),writebackMaxAgeDays:num(
|
|
55
|
+
env.AGENT_LOOP_WRITEBACK_MAX_AGE_DAYS,7,1,"AGENT_LOOP_WRITEBACK_MAX_AGE_DAYS="),scheduleTimezone:nonEmpty(env.AGENT_LOOP_SCHEDULE_TZ)??"Asia/Tokyo",counterTimezone:nonEmpty(env.AGENT_LOOP_COUNTER_TZ)??"Asia/Tokyo",compileCommand:local.compile_command!==void 0&&local.compile_command.length>0?local.compile_command:null,charterFile:nonEmpty(env.CHARTER_FILE)??nonEmpty(local.charter_file)??"CONSTITUTION.md",charterEnabled:resolveCharterEnabled(env.CHARTER_ENABLED,local.charter_enabled,m=>warnings.push(
|
|
56
|
+
m)),charterPrefix:charterWrapper(env.CHARTER_PREFIX,local.charter_prefix,"charter_prefix",m=>warnings.push(m)),charterSuffix:charterWrapper(env.CHARTER_SUFFIX,local.charter_suffix,"charter_suffix",m=>warnings.push(m)),ai:ai.config,operations:operations.operations,claudeLauncher:claudeLauncher.launcher,prefetch:prefetch.hooks,preflight:preflight.hooks,configHash:ai.config.hash(),version:input.version,warnings,releaseOutcomeLogPath:releaseOutcomeLogPath(env)}}function localDate(timezone,now=new Date){
|
|
57
|
+
const fmt=new Intl.DateTimeFormat("en-CA",{timeZone:timezone,year:"numeric",month:"2-digit",day:"2-digit"});return fmt.format(now)}export{parseClaudeLauncher,evaluateOwnership,runPrefetch,runPreflight,formatHookWiring,formatHookIds,describeOperations,loopStateDir,localConfigPath,buildLoopConfig,localDate};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{configReadDirs,findProjectConfigPath}from"./chunk-RZVI6PMW.js";import fs from"fs";import path from"path";var DEFAULT_API_URL="https://backend.tocca.systems";var DEFAULT_FRONTEND_URL="https://app.tocca.systems";var DEFAULT_RELAY_URL="https://ai-api.tocca.systems";function readJsonIfExists(file){try{return JSON.parse(fs.readFileSync(file,"utf8"))}catch(err){if(err.code==="ENOENT")return null;throw new Error(`\u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB\u306E\u8AAD\u307F\u53D6\u308A\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${file}
|
|
4
|
+
${err.message}`,{cause:err})}}function loadUserConfig(env=process.env){for(const dir of configReadDirs(env)){const parsed=readJsonIfExists(path.join(dir,"config.json"));if(parsed&&typeof parsed==="object")return parsed}return{}}function loadProjectConfig(cwd=process.cwd()){const projectPath=findProjectConfigPath(cwd);if(!projectPath)return{};const parsed=readJsonIfExists(projectPath);return parsed&&typeof parsed==="object"?parsed:{}}function resolveProfileName(explicit,env=process.env,cwd=process.
|
|
5
|
+
cwd()){if(explicit&&explicit.trim()!=="")return explicit.trim();if(env.TWP_PROFILE&&env.TWP_PROFILE.trim()!=="")return env.TWP_PROFILE.trim();const project=loadProjectConfig(cwd);if(typeof project.profile==="string"&&project.profile.trim()!==""){return project.profile.trim()}const user=loadUserConfig(env);if(typeof user.default_profile==="string"&&user.default_profile.trim()!==""){return user.default_profile.trim()}return"default"}function normalizeBaseUrl(url){return url.replace(/\/+$/,"")}function effectiveApiUrl(profile,credsApiUrl,env=process.
|
|
6
|
+
env){if(env.TWP_API_URL&&env.TWP_API_URL.trim()!=="")return profile.apiUrl;return credsApiUrl??profile.apiUrl}function effectiveRelayUrl(profile,credsRelayUrl,env=process.env){if(env.TWP_RELAY_URL&&env.TWP_RELAY_URL.trim()!=="")return profile.relayUrl;return credsRelayUrl??profile.relayUrl}function resolveProfile(explicit,env=process.env,cwd=process.cwd()){const name=resolveProfileName(explicit,env,cwd);const config=loadUserConfig(env).profiles?.[name]??{};const apiUrl=env.TWP_API_URL?.trim()||config.
|
|
7
|
+
api_url||DEFAULT_API_URL;const frontendUrl=env.TWP_FRONTEND_URL?.trim()||config.frontend_url||DEFAULT_FRONTEND_URL;const relayUrl=env.TWP_RELAY_URL?.trim()||config.relay_url||DEFAULT_RELAY_URL;return{name,apiUrl:normalizeBaseUrl(apiUrl),frontendUrl:normalizeBaseUrl(frontendUrl),relayUrl:normalizeBaseUrl(relayUrl),tenantCode:config.tenant_code??null}}function resolveConfiguredModel(explicit,profileName,env=process.env,cwd=process.cwd()){if(explicit&&explicit.trim()!=="")return{model:explicit.trim(),
|
|
8
|
+
source:"flag"};const project=loadProjectConfig(cwd);if(typeof project.model==="string"&&project.model.trim()!==""){return{model:project.model.trim(),source:"project"}}const user=loadUserConfig(env);const fromProfile=user.profiles?.[profileName]?.model;if(typeof fromProfile==="string"&&fromProfile.trim()!==""){return{model:fromProfile.trim(),source:"user"}}if(typeof user.model==="string"&&user.model.trim()!==""){return{model:user.model.trim(),source:"user"}}return null}function resolveConfiguredOutput(profileName,env=process.
|
|
9
|
+
env){const user=loadUserConfig(env);const fromProfile=user.profiles?.[profileName]?.output;if(typeof fromProfile==="string"&&fromProfile.trim()!=="")return fromProfile.trim();if(typeof user.output==="string"&&user.output.trim()!=="")return user.output.trim();return void 0}export{loadUserConfig,loadProjectConfig,effectiveApiUrl,effectiveRelayUrl,resolveProfile,resolveConfiguredModel,resolveConfiguredOutput};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
function stripTerminalControls(text){const src=text.replace(/\r\n?/g,"\n");const kept=[];let keepStart=0;const n=src.length;let i=0;const flushTo=(end,nextStart)=>{if(end>keepStart)kept.push(src.slice(keepStart,end));keepStart=nextStart};while(i<n){const code=src.charCodeAt(i);if(code===27){const escStart=i;i++;const next=i<n?src[i]:void 0;if(next==="]"){i++;while(i<n){const c=src.charCodeAt(i);if(c===7){i++;break}if(c===27&&src[i+1]==="\\"){i+=2;break}i++}}else if(next==="["){i++;let seenIntermediate=false;
|
|
4
|
+
for(;;){if(i>=n){i=escStart+2;break}const c=src.charCodeAt(i);if(c>=64&&c<=126){i++;break}if(c>=32&&c<=47){seenIntermediate=true;i++;continue}if(!seenIntermediate&&c>=48&&c<=63){i++;continue}i=escStart+2;break}}else{if(next!==void 0)i++}flushTo(escStart,i);continue}if(code!==10&&code!==9&&(code<=31||code>=127&&code<=159)){flushTo(i,i+1);i++;continue}i++}flushTo(n,n);return kept.join("")}export{stripTerminalControls};
|
|
@@ -0,0 +1,7 @@
|
|
|
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:"allow",twp_get_task:"allow",twp_list_tasks:"allow",
|
|
4
|
+
twp_update_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_task:"allow",twp_list_tasks:"allow",twp_update_task:"ask",bash:"deny",shell:"deny",write_file:"deny",edit_file:"deny","*":"ask"}},{id:"plan",label:"\u30D7\u30E9\u30F3",
|
|
5
|
+
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_*"],permissions:{read_file:"allow",glob:"allow",grep:"allow",twp_get_task:"allow",twp_list_tasks:"allow",bash:"deny",shell:"deny",write_file:"deny",edit_file:"deny","*":"deny"}}];function getMode(id){const found=MODES.find(m=>m.id===id);if(!found)throw new Error(`unknown mode: ${id}`);return found}function nextMode(id){const i=MODES.findIndex(
|
|
6
|
+
m=>m.id===id);const next=MODES[(i+1)%MODES.length];return next?next.id:"dev"}function checkPermission(toolName,mode){return mode.permissions[toolName]??mode.permissions["*"]??"ask"}var PERMISSION_MODE_IDS=["plan","acceptEdits","denyAll"];function isPermissionModeId(value){return value!==void 0&&PERMISSION_MODE_IDS.includes(value)}function applyPermissionMode(decision,risk,permissionMode){if(permissionMode===void 0)return{decision,reason:null};if(decision==="deny")return{decision,reason:null};switch(permissionMode){case"denyAll":return{decision:"deny",reason:"permission-mode=denyAll\uFF08\u5168\u30C4\u30FC\u30EB\u3092\u62D2\u5426\uFF09"};case"plan":if(risk==="read")return{decision,
|
|
7
|
+
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:"deny",reason:"\u4E0D\u660E\u306A permission-mode\uFF08\u5B89\u5168\u5074\u3067\u62D2\u5426\uFF09"}}}export{isModeId,getMode,nextMode,checkPermission,isPermissionModeId,applyPermissionMode};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import fs from"fs";import path from"path";function isWindowsDriveAbsolute(p){return/^[A-Za-z]:[\\/]/.test(p)}function defaultIsExecutableFile(p,platform){try{if(!fs.statSync(p).isFile())return false}catch{return false}if(platform==="win32")return true;try{fs.accessSync(p,fs.constants.X_OK);return true}catch{return false}}function joinFor(platform){return platform==="win32"?path.win32.join:path.posix.join}function findOnPath(name,d){const rawPath=d.env.PATH??d.env.Path??"";if(rawPath==="")return null;
|
|
4
|
+
const isWin=d.platform==="win32";const exts=isWin?((d.env.PATHEXT??"")!==""?d.env.PATHEXT:".COM;.EXE;.BAT;.CMD").split(";").filter(e=>e!==""):[""];const isUsableDir=isWin?isWindowsDriveAbsolute:path.posix.isAbsolute;for(const rawDir of rawPath.split(isWin?";":":")){const dir=isWin?rawDir.trim().replace(/^"(.*)"$/,"$1"):rawDir;if(dir===""||!isUsableDir(dir))continue;for(const ext of exts){const candidate=joinFor(d.platform)(dir,`${name}${ext}`);try{if(d.isExecutableFile(candidate))return candidate}catch{}}}
|
|
5
|
+
return null}function findExecutable(name,deps={}){const platform=deps.platform??process.platform;return findOnPath(name,{env:deps.env??process.env,platform,isExecutableFile:deps.isExecutableFile??(p=>defaultIsExecutableFile(p,platform))})}export{isWindowsDriveAbsolute,defaultIsExecutableFile,joinFor,findOnPath,findExecutable};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{isTaskKey}from"./chunk-II5RVJQN.js";import{UsageError}from"./chunk-KCXVV45F.js";import{ResolveError,resolveProjectRef,safeProjectIdPolicy}from"./chunk-5QCAIKFE.js";import{ApiError}from"./chunk-7ZVTACQS.js";import{loadProjectConfig,loadUserConfig}from"./chunk-NERYSBA4.js";import{twpHomeDir}from"./chunk-RZVI6PMW.js";function usable(value){return typeof value==="string"&&value.trim()!==""?value.trim():null}function resolveDefaultProject(explicit,profileName,env=process.env,cwd=process.cwd()){const fromFlag=usable(explicit);if(fromFlag!==null)return{ref:fromFlag,source:"flag"};const fromEnv=usable(env.TWP_PROJECT);if(fromEnv!==null)return{ref:fromEnv,source:"env"};const fromProjectConfig=usable(loadProjectConfig(cwd).project);if(fromProjectConfig!==null)return{ref:fromProjectConfig,source:"project-config"};const user=loadUserConfig(
|
|
4
|
+
env);const fromProfile=usable(user.profiles?.[profileName]?.project);if(fromProfile!==null)return{ref:fromProfile,source:"user-config"};const fromUser=usable(user.project);if(fromUser!==null)return{ref:fromUser,source:"user-config"};return null}function requireDefaultProject(explicit,profileName,env=process.env,cwd=process.cwd()){const resolved=resolveDefaultProject(explicit,profileName,env,cwd);if(resolved!==null)return resolved;throw new UsageError("\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
|
|
5
|
+
'--project <\u30B3\u30FC\u30C9|ID> \u3092\u4ED8\u3051\u308B\u304B\u3001TWP_PROJECT / .twp/config.json / ~/.twp/config.json \u306E "project" \u306B\u65E2\u5B9A\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002')}import crypto from"crypto";import fs from"fs";import path from"path";var DEFAULT_TTL_MS=10*60*1e3;var CACHE_VERSION=2;function cacheDir(env=process.env){return path.join(twpHomeDir(env),"cache")}function cacheFilePath(key,env=process.env){const digest=crypto.createHash("sha256").update(JSON.stringify([key.profile,key.scope,key.project??""])).digest("hex").slice(0,12);const label=key.scope.replace(/[^A-Za-z0-9._-]/g,"_").slice(0,40);return path.join(cacheDir(env),`${label}-${digest}.json`)}function sameKey(a,b){return a.profile===b.profile&&a.scope===b.scope&&(a.project??
|
|
6
|
+
"")===(b.project??"")}function isOursAndPrivate(target,check){if(process.platform==="win32")return true;try{const st=fs.lstatSync(target);if(st.isSymbolicLink())return false;const uid=process.getuid?.();if(uid!==void 0&&st.uid!==uid)return false;const forbidden=check==="file"?54:18;return(st.mode&forbidden)===0}catch{return false}}function isCacheLocationTrusted(env){const home=twpHomeDir(env);const dir=cacheDir(env);for(const target of[home,dir]){if(fs.existsSync(target)&&!isOursAndPrivate(target,
|
|
7
|
+
"dir"))return false}return true}function readCache(key,options={}){if(options.refresh===true)return null;const env=options.env??process.env;const file=cacheFilePath(key,env);if(!isCacheLocationTrusted(env)||!isOursAndPrivate(file,"file"))return null;let parsed;try{parsed=JSON.parse(fs.readFileSync(file,"utf8"))}catch{return null}if(parsed?.version!==CACHE_VERSION||!parsed.key||!sameKey(parsed.key,key))return null;const fetchedAt=Date.parse(parsed.fetched_at);if(!Number.isFinite(fetchedAt))return null;
|
|
8
|
+
const ttl=options.ttlMs??DEFAULT_TTL_MS;const now=(options.now??Date.now)();if(Math.abs(now-fetchedAt)>ttl)return null;return parsed.value}function writeCache(key,value,options={}){const env=options.env??process.env;const dir=cacheDir(env);const file=cacheFilePath(key,env);const body={version:CACHE_VERSION,key:{profile:key.profile,scope:key.scope,...key.project!==void 0?{project:key.project}:{}},fetched_at:new Date((options.now??Date.now)()).toISOString(),value};if(!isCacheLocationTrusted(env))return;
|
|
9
|
+
const tmp=`${file}.${process.pid}.tmp`;try{fs.mkdirSync(dir,{recursive:true,mode:448});fs.writeFileSync(tmp,`${JSON.stringify(body)}
|
|
10
|
+
`,{mode:384});fs.renameSync(tmp,file)}catch{try{fs.rmSync(tmp,{force:true})}catch{}}}var DEFAULT_LOOKUP_SCOPE="\u3053\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8";function fold(value){return value.trim().toLowerCase()}function keysOf(ref){return[ref.id,ref.code,ref.name,...ref.aliases??[]].filter(v=>typeof v==="string"&&v.trim()!=="").map(fold)}function describe(ref){return ref.code!==void 0&&ref.code!==null&&ref.code!==""&&ref.code!==ref.name?`${ref.name}\uFF08${ref.code}\uFF09`:ref.name}async function suggest(input,candidates){try{const{default:fuzzysort}=await import("./fuzzysort-DFVKV4B4.js");
|
|
11
|
+
const indexed=candidates.map(ref=>({hay:keysOf(ref).join(" "),ref}));const hits=fuzzysort.go(input.trim(),indexed,{key:"hay",limit:5,threshold:-1e4});return hits.map(hit=>hit.obj.ref)}catch{return[]}}function listCandidates(candidates,limit=10){const shown=candidates.slice(0,limit).map(describe).join(" / ");return candidates.length>limit?`${shown} \u2026\uFF08\u5168 ${candidates.length} \u4EF6\uFF09`:shown}async function resolveNamed(input,candidates,ctx){const needle=fold(input);if(needle===""){
|
|
12
|
+
throw new UsageError(`${ctx.flag} \u306B\u7A7A\u306E\u5024\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093`)}if(candidates.length===0){throw new UsageError(`${ctx.scope??DEFAULT_LOOKUP_SCOPE}\u306B\u306F${ctx.label}\u304C1\u4EF6\u3082\u5B9A\u7FA9\u3055\u308C\u3066\u3044\u307E\u305B\u3093\uFF08${ctx.flag} ${input}\uFF09`)}const hits=candidates.filter(ref=>keysOf(ref).includes(needle));const distinct=[...new Map(hits.map(ref=>[ref.id,ref])).values()];if(distinct.length===1)return distinct[0];if(distinct.
|
|
13
|
+
length>1){throw new UsageError(`${ctx.flag} \u306E\u300C${input}\u300D\u304C${ctx.label}${distinct.length}\u4EF6\u306B\u4E00\u81F4\u3057\u307E\u3059: ${listCandidates(distinct)}`,`\u3069\u308C\u304B1\u3064\u306B\u6C7A\u307E\u308B\u5024\uFF08ID \u304B\u30B3\u30FC\u30C9\uFF09\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}const near=await suggest(input,candidates);throw new UsageError(`${ctx.flag} \u306E\u300C${input}\u300D\u306B\u4E00\u81F4\u3059\u308B${ctx.label}\u304C\u3042\u308A\u307E\u305B\u3093`,
|
|
14
|
+
near.length>0?`\u3082\u3057\u304B\u3057\u3066: ${listCandidates(near,5)}\uFF08\u5168 ${candidates.length} \u4EF6\uFF09`:`\u6307\u5B9A\u3067\u304D\u308B${ctx.label}: ${listCandidates(candidates)}`)}var SELF_REF="me";var PRIVATE_TASKS_PATH="/api/v2/tasks/private";var PRIVATE_MASTERS_CACHE_KEY="__private__";var PRIVATE_SCOPE_LABEL="\u500B\u4EBA\u30BF\u30B9\u30AF";function isRecord(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function str(value){return typeof value==="string"&&value.trim()!==""?value:null}function truthyFlag(value){return value===true||value===1}function rawGetVia(client){return async path2=>{try{return{ok:true,status:200,json:await client.request(
|
|
15
|
+
"GET",path2),error:null}}catch(err){if(err instanceof ApiError){return{ok:false,status:err.status,json:err.body,error:err.message}}throw err}}}var Resolver=class{constructor(client,options){this.client=client;this.options=options;this.get=rawGetVia(client)}client;options;get;privateMastersInFlight=null;async project(ref){const trimmed=ref.trim();if(trimmed==="")throw new UsageError("\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30B3\u30FC\u30C9\u304B ID \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044");
|
|
16
|
+
return resolveProjectRef(trimmed,this.get,safeProjectIdPolicy)}async taskByKey(key){const trimmed=key.trim();if(!isTaskKey(trimmed)){throw new UsageError(`\u30BF\u30B9\u30AF\u30AD\u30FC\u306E\u5F62\u5F0F\u3067\u306F\u3042\u308A\u307E\u305B\u3093: ${key}`,"\u30AD\u30FC\u306F\u300C\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u30B3\u30FC\u30C9-\u756A\u53F7\u300D\u306E\u5F62\u3067\u3059\uFF08\u4F8B: ABC-123\uFF09\u3002")}const res=await this.get(`/api/v2/tasks/resolve-by-key/${encodeURIComponent(trimmed)}`);
|
|
17
|
+
if(res.status===404){throw new ResolveError(`\u30BF\u30B9\u30AF\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: ${trimmed}\uFF08\u5B58\u5728\u3057\u306A\u3044\u304B\u3001\u95B2\u89A7\u3067\u304D\u308B\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306B\u3042\u308A\u307E\u305B\u3093\uFF09`,404)}if(!res.ok){throw new ResolveError(`\u30BF\u30B9\u30AF\u30AD\u30FC\u3092\u89E3\u6C7A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F: ${trimmed}\uFF08HTTP ${res.status}\uFF09\u3002\u63A5\u7D9A\u5148\u3068\u30ED\u30B0\u30A4\u30F3\u72B6\u614B\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,
|
|
18
|
+
res.status)}const body=isRecord(res.json)?res.json:{};const projectId=str(body["project_id"]);const task=body["task"];if(projectId===null||!isRecord(task)){throw new ResolveError("\u30BF\u30B9\u30AF\u30AD\u30FC\u89E3\u6C7A\u306E\u5FDC\u7B54\u306B project_id / task \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",res.status)}safeProjectIdPolicy.assertId(projectId);return{projectId,task}}async currentUser(){const res=await this.
|
|
19
|
+
get("/api/v2/user");if(!res.ok){throw new ResolveError(`\u30ED\u30B0\u30A4\u30F3\u4E2D\u306E\u30E6\u30FC\u30B6\u30FC\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08HTTP ${res.status}\uFF09\u3002twp login \u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,res.status)}const user=isRecord(res.json)?res.json["user"]:void 0;if(!isRecord(user)||str(user["id"])===null){throw new ResolveError("\u30E6\u30FC\u30B6\u30FC\u53D6\u5F97\u306E\u5FDC\u7B54\u306B user.id \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
20
|
+
res.status)}return{id:user["id"],name:str(user["name"])??user["id"],email:str(user["email"])}}async status(projectId,input){return resolveNamed(this.applyAlias("status",input),await this.statuses(projectId),{flag:"--status",label:"\u30B9\u30C6\u30FC\u30BF\u30B9"})}async taskType(projectId,input){return resolveNamed(this.applyAlias("type",input),await this.taskTypes(projectId),{flag:"--type",label:"\u7A2E\u5225"})}async assignee(projectId,input){if(input.trim().toLowerCase()===SELF_REF)return this.
|
|
21
|
+
self();const value=this.applyAlias("assignee",input);if(value.trim().toLowerCase()===SELF_REF)return this.self();return resolveNamed(value,await this.members(projectId),{flag:"--assignee",label:"\u30E1\u30F3\u30D0\u30FC"})}async self(){const me=await this.currentUser();return{id:me.id,name:me.name,...me.email!==null?{aliases:[me.email]}:{}}}async defaultStatus(projectId){return requireDefault(await this.statuses(projectId),{flag:"--status",label:"\u30B9\u30C6\u30FC\u30BF\u30B9"})}async defaultTaskType(projectId){
|
|
22
|
+
return requireDefault(await this.taskTypes(projectId),{flag:"--type",label:"\u7A2E\u5225"})}async statuses(projectId){return this.cached("task-statuses",projectId,()=>this.namedList(`/api/v2/projects/${encodeURIComponent(projectId)}/task-statuses`,"data","\u30B9\u30C6\u30FC\u30BF\u30B9",row=>({id:str(row["id"]),name:str(row["name"]),code:str(row["code"]),isDefault:truthyFlag(row["is_default"])})))}async taskTypes(projectId){return this.cached("task-types",projectId,()=>this.namedList(`/api/v2/pr\
|
|
23
|
+
ojects/${encodeURIComponent(projectId)}/task-types`,"data","\u7A2E\u5225",row=>({id:str(row["id"]),name:str(row["name"]),code:str(row["code"]),isDefault:truthyFlag(row["is_default"])})))}async privateStatuses(){return this.privateMasters("statuses","\u30B9\u30C6\u30FC\u30BF\u30B9")}async privateTaskTypes(){return this.privateMasters("types","\u7A2E\u5225")}async privateStatus(input){return resolveNamed(this.applyAlias("status",input),await this.privateStatuses(),{flag:"--status",label:"\u30B9\u30C6\u30FC\u30BF\u30B9",
|
|
24
|
+
scope:PRIVATE_SCOPE_LABEL})}async privateTaskType(input){return resolveNamed(this.applyAlias("type",input),await this.privateTaskTypes(),{flag:"--type",label:"\u7A2E\u5225",scope:PRIVATE_SCOPE_LABEL})}async privateDefaultStatus(){return requireDefault(await this.privateStatuses(),{flag:"--status",label:"\u30B9\u30C6\u30FC\u30BF\u30B9",scope:PRIVATE_SCOPE_LABEL})}async privateDefaultTaskType(){return requireDefault(await this.privateTaskTypes(),{flag:"--type",label:"\u7A2E\u5225",scope:PRIVATE_SCOPE_LABEL})}async privateTask(ref){
|
|
25
|
+
const trimmed=ref.trim();const res=await this.get(`${PRIVATE_TASKS_PATH}/${encodeURIComponent(trimmed)}`);if(res.status===404){throw new ResolveError(`\u500B\u4EBA\u30BF\u30B9\u30AF\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: ${trimmed}`,404)}if(!res.ok){throw new ResolveError(`\u500B\u4EBA\u30BF\u30B9\u30AF\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F: ${trimmed}\uFF08HTTP ${res.status}\uFF09\u3002\u63A5\u7D9A\u5148\u3068\u30ED\u30B0\u30A4\u30F3\u72B6\u614B\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,
|
|
26
|
+
res.status)}const task=isRecord(res.json)?res.json["task"]:void 0;if(!isRecord(task)){throw new ResolveError("\u500B\u4EBA\u30BF\u30B9\u30AF\u306E\u5FDC\u7B54\u306B task \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",res.status)}return task}async privateMasters(envelope,label){return this.cached(`private-${envelope}`,PRIVATE_MASTERS_CACHE_KEY,async()=>namedListFrom(await this.privateMastersResponse(),envelope,label,row=>({
|
|
27
|
+
id:str(row["id"]),name:str(row["name"]),code:str(row["code"]),isDefault:truthyFlag(row["is_default"])})))}privateMastersResponse(){this.privateMastersInFlight??=this.get(`${PRIVATE_TASKS_PATH}/masters`);return this.privateMastersInFlight}async members(projectId){return this.cached("members",projectId,()=>this.namedList(`/api/v2/projects/${encodeURIComponent(projectId)}/members`,"list","\u30E1\u30F3\u30D0\u30FC",row=>({id:str(row["user_id"]),name:str(row["user_name"]),code:null,aliases:[str(row["\
|
|
28
|
+
alias"]),str(row["user_email"])].filter(v=>v!==null)})))}async namedList(path2,envelope,label,map){return namedListFrom(await this.get(path2),envelope,label,map)}async cached(scope,projectId,load){const key={profile:this.options.profile,scope,project:projectId};const options={...this.options.env!==void 0?{env:this.options.env}:{},refresh:this.options.refresh,...this.options.ttlMs!==void 0?{ttlMs:this.options.ttlMs}:{},...this.options.now!==void 0?{now:this.options.now}:{}};const hit=readCache(key,
|
|
29
|
+
options);if(hit!==null&&Array.isArray(hit))return hit;const fresh=await load();writeCache(key,fresh,options);return fresh}applyAlias(kind,input){const table=this.options.aliases?.[kind];if(table===void 0)return input;const needle=input.trim().toLowerCase();for(const[from,to]of Object.entries(table)){if(from.trim().toLowerCase()===needle&&typeof to==="string"&&to.trim()!=="")return to}return input}get apiClient(){return this.client}};function namedListFrom(res,envelope,label,map){if(!res.ok){throw new ResolveError(
|
|
30
|
+
`${label}\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08HTTP ${res.status}\uFF09\u3002\u63A5\u7D9A\u5148\u3068\u30ED\u30B0\u30A4\u30F3\u72B6\u614B\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,res.status)}const list=isRecord(res.json)?res.json[envelope]:void 0;if(!Array.isArray(list)){throw new ResolveError(`${label}\u4E00\u89A7\u306E\u5FDC\u7B54\u306B ${envelope} \u914D\u5217\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,
|
|
31
|
+
res.status)}return list.map((row,index)=>{const mapped=map(isRecord(row)?row:{});if(mapped.id===null||mapped.name===null){throw new ResolveError(`${label}\u4E00\u89A7\u306E ${index+1} \u4EF6\u76EE\u306B id / \u540D\u524D\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,res.status)}return{id:mapped.id,name:mapped.name,...mapped.code!==void 0?{code:mapped.code}:{},...mapped.aliases!==void 0&&mapped.aliases.length>0?{aliases:mapped.
|
|
32
|
+
aliases}:{},...mapped.isDefault!==void 0?{isDefault:mapped.isDefault}:{}}})}function requireDefault(candidates,ctx){const hit=candidates.find(ref=>ref.isDefault===true);if(hit!==void 0)return hit;throw new UsageError(`${ctx.flag} \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08${ctx.scope??DEFAULT_LOOKUP_SCOPE}\u306B\u306F\u65E2\u5B9A\u306E${ctx.label}\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\uFF09`,`\u6307\u5B9A\u3067\u304D\u308B${ctx.label}: ${candidates.map(ref=>ref.
|
|
33
|
+
name).join(" / ")}\uFF08\u53E4\u3044\u30AD\u30E3\u30C3\u30B7\u30E5\u304C\u6B8B\u3063\u3066\u3044\u308B\u5834\u5408\u306F --refresh \u3067\u53D6\u308A\u76F4\u305B\u307E\u3059\uFF09`)}export{requireDefaultProject,PRIVATE_TASKS_PATH,Resolver};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{parseVersionCore}from"./chunk-DXXFUNYN.js";import{AuthSession,loadCredentials,withFileLock}from"./chunk-63LDNYGW.js";import{effectiveApiUrl,effectiveRelayUrl,resolveConfiguredModel,resolveProfile}from"./chunk-NERYSBA4.js";import{ensureTwpHome,twpHomeDir}from"./chunk-RZVI6PMW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";var MAX_EVENT_BYTES=8*1024*1024;var SseBufferOverflowError=class extends Error{constructor(limit){super(`SSE \u306E\u30A4\u30D9\u30F3\u30C8\u5883\u754C\uFF08\u7A7A\u884C\uFF09\u304C ${limit} \u30D0\u30A4\u30C8\u4EE5\u5185\u306B\u73FE\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u4E0A\u6D41\u306E\u5FDC\u7B54\u304C\u58CA\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002`)}};var SseParser=class{constructor(maxEventBytes=MAX_EVENT_BYTES){this.maxEventBytes=maxEventBytes}maxEventBytes;buffer="";pendingCr=false;push(chunk){
|
|
4
|
+
let pending=this.pendingCr?`\r${chunk}`:chunk;this.pendingCr=pending.endsWith("\r");if(this.pendingCr)pending=pending.slice(0,-1);this.buffer+=pending.replace(/\r\n/g,"\n").replace(/\r/g,"\n");if(this.buffer.length>this.maxEventBytes){this.buffer="";this.pendingCr=false;throw new SseBufferOverflowError(this.maxEventBytes)}const events=[];for(;;){const boundary=this.buffer.indexOf("\n\n");if(boundary===-1)break;const block=this.buffer.slice(0,boundary);this.buffer=this.buffer.slice(boundary+2);const parsed=parseBlock(
|
|
5
|
+
block);if(parsed)events.push(parsed)}return events}flush(){const rest=(this.pendingCr?`${this.buffer}
|
|
6
|
+
`:this.buffer).trim();this.buffer="";this.pendingCr=false;if(rest==="")return[];const parsed=parseBlock(rest);return parsed?[parsed]:[]}};function parseBlock(block){let event="message";const data=[];for(const line of block.split("\n")){if(line.startsWith(":"))continue;const colon=line.indexOf(":");const field=colon===-1?line:line.slice(0,colon);let value=colon===-1?"":line.slice(colon+1);if(value.startsWith(" "))value=value.slice(1);if(field==="event")event=value;else if(field==="data")data.push(
|
|
7
|
+
value)}if(data.length===0)return null;return{event,data:data.join("\n")}}var MODELS=[{id:"claude-opus-5",label:"Claude Opus 5",note:"\u6700\u3082\u9AD8\u6027\u80FD\u3002\u65E2\u5B9A"},{id:"claude-sonnet-5",label:"Claude Sonnet 5",note:"\u30D0\u30E9\u30F3\u30B9\u578B"},{id:"claude-haiku-4-5",label:"Claude Haiku 4.5",note:"\u9AD8\u901F\u30FB\u4F4E\u30B3\u30B9\u30C8"}];var DEFAULT_MODEL="claude-opus-5";function isSafeModelId(id){return/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(id)}function modelLabel(id){const known=MODELS.find(m=>m.id===id);if(known)return known.label;
|
|
8
|
+
return prettifyClaudeId(id)??stripTerminalControls(id).slice(0,128)}function prettifyClaudeId(id){const match=/^claude-([a-z]+)((?:-\d+)+)$/.exec(id);if(!match)return null;const family=match[1]??"";const version=(match[2]??"").replace(/^-/,"").split("-").join(".");return`Claude ${family.charAt(0).toUpperCase()}${family.slice(1)} ${version}`}function modelNote(id){return MODELS.find(m=>m.id===id)?.note??""}function toModelInfos(ids){return ids.map(id=>({id,label:modelLabel(id),note:modelNote(id)}))}function blockLength(block){if(block.type==="text")return block.text.length;if(block.type==="tool_result")return block.content.length;return block.name.length+JSON.stringify(block.input).length}function emptyUsage(){return{inputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,outputTokens:0}}var RelayError=class extends Error{constructor(kind,message,status){super(message);this.kind=kind;this.status=status;this.name="RelayError"}kind;status};var MODELS_TIMEOUT_MS=5e3;var RelayClient=class{constructor(relayUrl,session,fetchImpl=httpFetch,cliVersion="\
|
|
9
|
+
0.0.0-dev"){this.relayUrl=relayUrl;this.session=session;this.fetchImpl=fetchImpl;this.cliVersion=cliVersion}relayUrl;session;fetchImpl;cliVersion;async fetchModelCatalog(){const res=await this.send("GET","/api/cli/v1/models",void 0,AbortSignal.timeout(MODELS_TIMEOUT_MS));const body=await res.json().catch(()=>null);const ids=(body?.models??[]).map(m=>m.id).filter(id=>typeof id==="string"&&isSafeModelId(id));if(ids.length===0){throw new RelayError("upstream","\u30E2\u30C7\u30EB\u4E00\u89A7\u304C\u7A7A\u3067\u3057\u305F\uFF08\u30EA\u30EC\u30FC\u306E\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF09")}
|
|
10
|
+
const floor=body?.min_supported_version;const minSupportedVersion=typeof floor==="string"&&parseVersionCore(floor)!==null?floor.trim():null;return{ids,minSupportedVersion}}async stream(request,hooks){let res;try{res=await this.send("POST","/api/cli/v1/messages/stream",toWireBody(request),hooks.signal)}catch(err){if(isAbortError(err)||hooks.signal?.aborted===true){return{text:"",usage:emptyUsage(),toolUses:[],stopReason:null,aborted:true,upstreamError:null}}throw err}const body=res.body;if(!body){
|
|
11
|
+
throw new RelayError("upstream","\u30EA\u30EC\u30FC\u304C\u5FDC\u7B54\u672C\u6587\u3092\u8FD4\u3057\u307E\u305B\u3093\u3067\u3057\u305F")}const parser=new SseParser;const decoder=new TextDecoder;const usage=emptyUsage();let text="";let stopReason=null;let streamError=null;const reader=body.getReader();const building=new Map;const toolUses=[];const finalizeBlock=index=>{const pending=building.get(index);if(!pending)return;building.delete(index);const input=pending.json.trim()===""?{}:safeJson(pending.
|
|
12
|
+
json);if(input===null){streamError=`\u30C4\u30FC\u30EB ${pending.name} \u306E\u5F15\u6570\u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F`;return}toolUses.push({type:"tool_use",id:pending.id,name:pending.name,input})};const handle=events=>{for(const ev of events){const parsed=safeJson(ev.data);if(!parsed)continue;const type=typeof parsed["type"]==="string"?parsed["type"]:ev.event;if(type==="message_start"){const message=parsed["message"];applyUsage(usage,message?.usage);continue}
|
|
13
|
+
if(type==="content_block_start"){const block=parsed["content_block"];const index=numberOr(parsed["index"],-1);if(block?.type==="tool_use"&&typeof block.id==="string"&&typeof block.name==="string"){const seeded=block.input;const initial=typeof seeded==="object"&&seeded!==null&&!Array.isArray(seeded)?JSON.stringify(seeded):"";building.set(index,{id:block.id,name:block.name,json:initial==="{}"?"":initial})}continue}if(type==="content_block_delta"){const delta=parsed["delta"];if(delta?.type==="text_\
|
|
14
|
+
delta"&&typeof delta.text==="string"&&delta.text!==""){text+=delta.text;hooks.onTextDelta(delta.text);continue}if(delta?.type==="input_json_delta"&&typeof delta.partial_json==="string"){const pending=building.get(numberOr(parsed["index"],-1));if(pending)pending.json+=delta.partial_json}continue}if(type==="content_block_stop"){finalizeBlock(numberOr(parsed["index"],-1));continue}if(type==="message_delta"){applyUsage(usage,parsed["usage"]);const delta=parsed["delta"];if(typeof delta?.stop_reason===
|
|
15
|
+
"string")stopReason=delta.stop_reason;continue}if(type==="error"){const err=parsed["error"];streamError=typeof err?.message==="string"?err.message:"\u30B9\u30C8\u30EA\u30FC\u30E0\u304C\u4E2D\u65AD\u3055\u308C\u307E\u3057\u305F"}}};const onAbort=()=>{void reader.cancel().catch(()=>void 0)};if(hooks.signal){if(hooks.signal.aborted)onAbort();else hooks.signal.addEventListener("abort",onAbort,{once:true})}try{for(;;){const{done,value}=await reader.read();if(done)break;handle(parser.push(decoder.decode(
|
|
16
|
+
value,{stream:true})))}handle(parser.flush())}catch(err){if(err instanceof SseBufferOverflowError){streamError=err.message}else if(!isAbortError(err)&&hooks.signal?.aborted!==true){throw new RelayError("network",`\u30B9\u30C8\u30EA\u30FC\u30E0\u304C\u5207\u65AD\u3055\u308C\u307E\u3057\u305F: ${errorMessage(err)}`)}}finally{hooks.signal?.removeEventListener("abort",onAbort);void reader.cancel().catch(()=>void 0)}for(const index of[...building.keys()])finalizeBlock(index);return{text,usage,toolUses,
|
|
17
|
+
stopReason,aborted:hooks.signal?.aborted===true,upstreamError:streamError===null?null:stripTerminalControls(streamError)}}async send(method,path2,body,signal){let token;try{token=await this.session.getAccessToken()}catch(err){throw new RelayError("not_logged_in",errorMessage(err))}let res=await this.fetchOrThrow(method,path2,token,body,signal);if(res.status===401){try{token=await this.session.refresh(token)}catch(err){throw new RelayError("not_logged_in",errorMessage(err))}res=await this.fetchOrThrow(
|
|
18
|
+
method,path2,token,body,signal)}if(!res.ok)throw await toRelayError(res);return res}async fetchOrThrow(method,path2,token,body,signal){try{return await this.fetchImpl(`${this.relayUrl}${path2}`,{method,headers:{Accept:body===void 0?"application/json":"text/event-stream, application/json",Authorization:`Bearer ${token}`,"User-Agent":`twp-cli/${this.cliVersion}`,...body!==void 0?{"Content-Type":"application/json"}:{}},...body!==void 0?{body:JSON.stringify(body)}:{},...signal?{signal}:{}})}catch(err){
|
|
19
|
+
if(isAbortError(err))throw err;throw new RelayError("network",`\u30E2\u30C7\u30EB\u53D6\u6B21\u30B5\u30FC\u30D0\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\uFF08${this.relayUrl}\uFF09: ${errorMessage(err)}`)}}};function toWireBody(request){const messages=request.messages.map((m,i)=>({role:m.role,content:m.content.map((block,j)=>{const isLastBlockOfLastMessage=i===request.messages.length-1&&j===m.content.length-1;return isLastBlockOfLastMessage&&m.role==="user"?{...block,cache_control:{type:"\
|
|
20
|
+
ephemeral"}}:block})}));return{model:request.model,max_tokens:request.maxTokens,...request.system!==void 0?{system:request.system}:{},...request.tools&&request.tools.length>0?{tools:request.tools}:{},messages}}async function toRelayError(res){const body=await res.json().catch(()=>null);const nested=typeof body?.error==="object"&&body.error!==null?body.error:void 0;const message=stripTerminalControls(body?.message??nested?.message??`HTTP ${res.status}`);if(res.status===401){return new RelayError(
|
|
21
|
+
"unauthorized","\u30E2\u30C7\u30EB\u53D6\u6B21\u306E\u8A8D\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002`twp login`\uFF08\u30D6\u30E9\u30A6\u30B6\u59D4\u8B72\uFF09\u307E\u305F\u306F `twp login --password` \u3067\u30ED\u30B0\u30A4\u30F3\u3057\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\uFF08`twp login --token` \u3067\u4FDD\u5B58\u3057\u305F\u901A\u5E38\u30C8\u30FC\u30AF\u30F3\u306F\u30E2\u30C7\u30EB\u53D6\u6B21\u306B\u306F\u4F7F\u3048\u307E\u305B\u3093\uFF09\u3002",401)}if(res.status===403){
|
|
22
|
+
return new RelayError("cli_disabled",message,403)}if(res.status===429){return new RelayError("rate_limit",message,429)}if(res.status===400){const detail=body?.details;if(Array.isArray(detail?.allowed_models)){return new RelayError("model_not_allowed",`${message}
|
|
23
|
+
\u5229\u7528\u3067\u304D\u308B\u30E2\u30C7\u30EB: ${detail.allowed_models.join(" / ")}`,400)}return new RelayError("validation",message,400)}if(res.status===503){return new RelayError("unavailable",message,503)}return new RelayError("upstream",message,res.status)}function applyUsage(target,source){if(typeof source!=="object"||source===null)return;const usage=source;target.inputTokens=numberOr(usage["input_tokens"],target.inputTokens);target.cacheReadTokens=numberOr(usage["cache_read_input_tokens"],
|
|
24
|
+
target.cacheReadTokens);target.cacheWriteTokens=numberOr(usage["cache_creation_input_tokens"],target.cacheWriteTokens);target.outputTokens=numberOr(usage["output_tokens"],target.outputTokens)}function numberOr(value,fallback){return typeof value==="number"&&Number.isFinite(value)?value:fallback}function safeJson(text){try{const parsed=JSON.parse(text);return typeof parsed==="object"&&parsed!==null?parsed:null}catch{return null}}function isAbortError(err){return err instanceof Error&&(err.name===
|
|
25
|
+
"AbortError"||err.name==="TimeoutError")}function errorMessage(err){return err instanceof Error?err.message:String(err)}import fs from"fs";import path from"path";function modelCachePath(env=process.env){return path.join(twpHomeDir(env),"models.json")}function modelCacheLockPath(env=process.env){return path.join(twpHomeDir(env),"models.lock")}function builtinCatalog(){return{ids:MODELS.map(m=>m.id),source:"builtin",fetchedAt:null,minSupportedVersion:null}}function cacheFileIsTrustworthy(file){if(process.platform==="win32")return true;try{const st=fs.lstatSync(file);if(st.isSymbolicLink())return false;const uid=process.getuid?.();if(uid!==void 0&&st.uid!==
|
|
26
|
+
uid)return false;return(st.mode&18)===0}catch{return false}}function readCacheFile(env){const file=modelCachePath(env);if(!cacheFileIsTrustworthy(file)){return{version:1,entries:{}}}const parsed=JSON.parse(fs.readFileSync(file,"utf8"));if(!parsed||typeof parsed!=="object"||typeof parsed.entries!=="object"||parsed.entries===null){return{version:1,entries:{}}}return parsed}function readFloor(entry){const raw=entry.min_supported_version;return typeof raw==="string"&&parseVersionCore(raw)!==null?raw.
|
|
27
|
+
trim():null}function loadCachedVersionFloor(profile,relayUrl,env=process.env){try{const entry=readCacheFile(env).entries?.[profile];if(!entry||entry.relay_url!==relayUrl)return{minSupportedVersion:null,fetchedAt:null};return{minSupportedVersion:readFloor(entry),fetchedAt:typeof entry.fetched_at==="string"?entry.fetched_at:null}}catch{return{minSupportedVersion:null,fetchedAt:null}}}function loadCachedCatalog(profile,relayUrl,env=process.env){try{const parsed=readCacheFile(env).entries?.[profile];
|
|
28
|
+
if(!parsed||parsed.relay_url!==relayUrl)return null;const ids=Array.isArray(parsed.models)?parsed.models.filter(id=>typeof id==="string"&&isSafeModelId(id)):[];if(ids.length===0)return null;return{ids,source:"cache",fetchedAt:typeof parsed.fetched_at==="string"?parsed.fetched_at:null,minSupportedVersion:readFloor(parsed)}}catch{return null}}async function saveCatalog(profile,relayUrl,ids,minSupportedVersion,env=process.env,now=Date.now){try{ensureTwpHome(env);await withFileLock(modelCacheLockPath(
|
|
29
|
+
env),async()=>{let file;try{file=readCacheFile(env)}catch{file={version:1,entries:{}}}const entries={...file.entries??{}};entries[profile]={relay_url:relayUrl,fetched_at:new Date(now()).toISOString(),models:ids,min_supported_version:minSupportedVersion};const cachePath=modelCachePath(env);const tmp=`${cachePath}.${process.pid}.tmp`;fs.writeFileSync(tmp,`${JSON.stringify({version:1,entries},null,2)}
|
|
30
|
+
`,{mode:384});try{fs.renameSync(tmp,cachePath)}catch(err){fs.rmSync(tmp,{force:true});throw err}if(process.platform!=="win32"){try{fs.chmodSync(cachePath,384)}catch{}}})}catch{}}async function loadCatalog(client,profile,relayUrl,env=process.env){try{const{ids,minSupportedVersion}=await client.fetchModelCatalog();await saveCatalog(profile,relayUrl,ids,minSupportedVersion,env);return{ids,source:"server",fetchedAt:new Date().toISOString(),minSupportedVersion}}catch{return loadCachedCatalog(profile,
|
|
31
|
+
relayUrl,env)??builtinCatalog()}}function pickModel(catalog,configured){const fallback=catalog.ids[0]??MODELS[0]?.id??DEFAULT_MODEL;if(!configured||configured==="")return{model:fallback};if(catalog.ids.includes(configured))return{model:configured};if(catalog.source==="builtin"){return{model:configured,warning:`\u30E2\u30C7\u30EB\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u306A\u304B\u3063\u305F\u305F\u3081\u3001\u6307\u5B9A\u3055\u308C\u305F ${configured} \u3092\u305D\u306E\u307E\u307E\u4F7F\u3044\u307E\u3059\uFF08\u5229\u7528\u3067\u304D\u306A\u3044\u5834\u5408\u306F\u30EA\u30EC\u30FC\u304C 400 \u3092\u8FD4\u3057\u307E\u3059\uFF09`}}
|
|
32
|
+
return{model:fallback,warning:`${configured} \u306F\u5229\u7528\u3067\u304D\u306A\u3044\u305F\u3081 ${fallback} \u3092\u4F7F\u3044\u307E\u3059\uFF08\u5229\u7528\u53EF\u80FD: ${catalog.ids.join(" / ")}\uFF09`}}var DEFAULT_CONTEXT_WINDOW_TOKENS=2e5;var DEFAULT_MAX_TOKENS=8192;var TRIM_THRESHOLD=.8;var ContextManager=class{constructor(contextWindowTokens=DEFAULT_CONTEXT_WINDOW_TOKENS){this.contextWindowTokens=contextWindowTokens}contextWindowTokens;messages=[];totals=emptyUsage();turns=0;lastPromptTokens=0;pendingChars=0;droppedMessages=0;addUser(text){this.pendingChars+=text.length;const last=this.messages[this.messages.length-1];if(last?.role==="user"){last.content.push({type:"text",text});return}this.
|
|
33
|
+
messages.push({role:"user",content:[{type:"text",text}]})}addToolExchange(assistantText,toolUses,results){if(toolUses.length===0)return;const blocks=[];if(assistantText.trim()!=="")blocks.push({type:"text",text:assistantText});blocks.push(...toolUses);this.messages.push({role:"assistant",content:blocks});this.messages.push({role:"user",content:results});this.pendingChars+=blocks.reduce((n,b)=>n+blockLength(b),0);this.pendingChars+=results.reduce((n,b)=>n+blockLength(b),0)}completeTurn(assistantText){
|
|
34
|
+
const text=assistantText.trim();if(text===""){const last=this.messages[this.messages.length-1];if(last?.role==="user"&&!hasToolResult(last)){this.messages.pop();this.pendingChars=Math.max(0,this.pendingChars-lengthOf(last))}return false}this.messages.push({role:"assistant",content:[{type:"text",text:assistantText}]});this.pendingChars+=assistantText.length;this.turns+=1;return true}applyUsage(usage){this.totals={inputTokens:this.totals.inputTokens+usage.inputTokens,cacheReadTokens:this.totals.cacheReadTokens+
|
|
35
|
+
usage.cacheReadTokens,cacheWriteTokens:this.totals.cacheWriteTokens+usage.cacheWriteTokens,outputTokens:this.totals.outputTokens+usage.outputTokens};const prompt=usage.inputTokens+usage.cacheReadTokens+usage.cacheWriteTokens;if(prompt>0){this.lastPromptTokens=prompt;this.pendingChars=0}}history(){return this.messages.map(m=>({role:m.role,content:m.content.map(copyBlock)}))}isEmpty(){return this.messages.length===0}clear(){this.messages=[];this.totals=emptyUsage();this.turns=0;this.lastPromptTokens=
|
|
36
|
+
0;this.pendingChars=0;this.droppedMessages=0}trimToFit(maxTokens=DEFAULT_MAX_TOKENS){const limit=Math.max(1,Math.floor((this.contextWindowTokens-maxTokens)*TRIM_THRESHOLD));let dropped=0;while(this.estimatedPromptTokens()>limit&&this.messages.length>1){const removed=this.messages.shift();if(!removed)break;const removedTokens=Math.ceil(lengthOf(removed)/4);this.lastPromptTokens=Math.max(0,this.lastPromptTokens-removedTokens);dropped+=1}while(this.messages.length>0){const head2=this.messages[0];if(!head2)
|
|
37
|
+
break;const orphanResult=hasToolResult(head2)&&this.messages.length>1;if(head2.role!=="assistant"&&!orphanResult)break;this.messages.shift();this.lastPromptTokens=Math.max(0,this.lastPromptTokens-Math.ceil(lengthOf(head2)/4));dropped+=1}const head=this.messages[0];if(head&&hasToolResult(head)){const before=lengthOf(head);const kept=head.content.filter(block=>block.type!=="tool_result");head.content=kept.length>0?kept:[{type:"text",text:"\uFF08\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u4E0A\u9650\u306E\u305F\u3081\u3001\u76F4\u524D\u306E\u30C4\u30FC\u30EB\u5B9F\u884C\u7D50\u679C\u306F\u5C65\u6B74\u304B\u3089\u5916\u308C\u307E\u3057\u305F\uFF09"}];
|
|
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
|
+
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
|
+
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};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import os from"os";import path from"path";import fs from"fs";function twpHomeDir(env=process.env){const override=env.TWP_HOME;if(override&&override.trim()!=="")return override;return path.join(os.homedir(),".twp")}function configReadDirs(env=process.env){const home=twpHomeDir(env);if(env.TWP_HOME&&env.TWP_HOME.trim()!=="")return[home];const dirs=[home];if(env.XDG_CONFIG_HOME&&env.XDG_CONFIG_HOME.trim()!==""){dirs.push(path.join(env.XDG_CONFIG_HOME,"twp"))}if(process.platform==="win32"&&env.APPDATA&&
|
|
4
|
+
env.APPDATA.trim()!==""){dirs.push(path.join(env.APPDATA,"twp"))}return dirs}function ensureTwpHome(env=process.env){const dir=twpHomeDir(env);fs.mkdirSync(dir,{recursive:true,mode:448});if(process.platform!=="win32"){try{fs.chmodSync(dir,448)}catch{}}return dir}function findProjectConfigPath(cwd=process.cwd()){let dir=path.resolve(cwd);for(;;){const candidate=path.join(dir,".twp","config.json");if(fs.existsSync(candidate))return candidate;const parent=path.dirname(dir);if(parent===dir)return null;
|
|
5
|
+
dir=parent}}export{twpHomeDir,configReadDirs,ensureTwpHome,findProjectConfigPath};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf;var __hasOwnProp=Object.prototype.hasOwnProperty;var __require=(x=>typeof require!=="undefined"?require:typeof Proxy!=="undefined"?new Proxy(x,{get:(a,b)=>(typeof require!=="undefined"?require:a)[b]}):x)(function(x){if(typeof require!=="undefined")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var __commonJS=(cb,mod)=>function __require2(){try{return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports}catch(e){throw mod=0,e}};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:true})};var __copyProps=(to,from,except,desc)=>{if(from&&typeof from==="object"||typeof from==="function"){for(let key of __getOwnPropNames(from))if(!__hasOwnProp.call(to,key)&&key!==except)__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})}return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:true}):target,mod));export{__require,__commonJS,__export,__toESM};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
var DOMAIN_NAMES=["project","task"];function isDomainName(value){return value!==void 0&&DOMAIN_NAMES.includes(value)}var HELP_TOKEN="help";var GLOBAL_OPTIONS_HELP=`\u30B0\u30ED\u30FC\u30D0\u30EB\u30AA\u30D7\u30B7\u30E7\u30F3\uFF08\u30C9\u30E1\u30A4\u30F3\u30B3\u30DE\u30F3\u30C9\u5171\u901A\uFF09:
|
|
4
|
+
--profile <\u540D\u524D> \u63A5\u7D9A\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\uFF08\u30C6\u30CA\u30F3\u30C8\uFF09\u3092\u6307\u5B9A\uFF08TWP_PROFILE \u3067\u3082\u53EF\uFF09
|
|
5
|
+
--output <\u5F62\u5F0F> json | table | text | tsv
|
|
6
|
+
\u65E2\u5B9A\u306F\u7AEF\u672B\u306A\u3089 table\u3001\u30D1\u30A4\u30D7\u306A\u3089 json
|
|
7
|
+
\uFF08~/.twp/config.json \u306E "output" \u3067\u56FA\u5B9A\u3067\u304D\u308B\uFF09
|
|
8
|
+
json \u306F API \u306E\u751F\u30EC\u30B9\u30DD\u30F3\u30B9\u3001table / text / tsv \u306F
|
|
9
|
+
\u8AAD\u307F\u3084\u3059\u3055\u306E\u305F\u3081\u306B\u9078\u3093\u3060\u8981\u7D04\u5217\u3092\u51FA\u3057\u307E\u3059
|
|
10
|
+
--query <JMESPath> \u7D50\u679C\u3092 JMESPath \u3067\u7D5E\u308A\u8FBC\u3080\u3002**API \u306E\u751F\u30EC\u30B9\u30DD\u30F3\u30B9\u306B\u5BFE\u3057\u3066
|
|
11
|
+
\u8A55\u4FA1\u3055\u308C\u308B**\u306E\u3067\u3001\u8981\u7D04\u5217\u306B\u7121\u3044\u30D5\u30A3\u30FC\u30EB\u30C9\u3082\u53D6\u308A\u51FA\u305B\u308B
|
|
12
|
+
--dry-run \u9001\u308B\u306F\u305A\u306E HTTP\uFF08\u30E1\u30BD\u30C3\u30C9\u30FBURL\u30FB\u30DC\u30C7\u30A3\uFF09\u3092\u8868\u793A\u3057\u3066\u9001\u3089\u306A\u3044
|
|
13
|
+
\u26A0 \u5BFE\u8C61\u3092\u30B3\u30FC\u30C9\u30FB\u540D\u524D\u3067\u6307\u5B9A\u3057\u305F\u5834\u5408\uFF08--project TWP / --status \u540D\u524D \u7B49\uFF09\u3001
|
|
14
|
+
URL \u3092\u7D44\u307F\u7ACB\u3066\u308B\u305F\u3081\u306B\u89E3\u6C7A\u306E\u8AAD\u307F\u53D6\u308A\u5F80\u5FA9\u304C\u8D77\u3053\u308B\u3053\u3068\u304C\u3042\u308A\u3001
|
|
15
|
+
\u305D\u306E\u3068\u304D\u306F\u30ED\u30B0\u30A4\u30F3\u304C\u5FC5\u8981\u3067\u3059\u3002ID \u3092\u76F4\u63A5\u6E21\u305B\u3070\u5F80\u5FA9\u3057\u307E\u305B\u3093
|
|
16
|
+
--debug \u30EA\u30AF\u30A8\u30B9\u30C8\uFF0F\u30EC\u30B9\u30DD\u30F3\u30B9\u3092 stderr \u3078\u51FA\u3059
|
|
17
|
+
\uFF08Authorization \u30D8\u30C3\u30C0\u3068\u30C8\u30FC\u30AF\u30F3\u306F\u4F0F\u5B57\u5316\u3055\u308C\u308B\uFF09
|
|
18
|
+
--refresh --status / --type / --assignee \u3092\u540D\u524D\u3067\u53D7\u3051\u308B\u30B3\u30DE\u30F3\u30C9\u3067\u3001
|
|
19
|
+
\u540D\u524D \u2192 ID \u306E\u30AD\u30E3\u30C3\u30B7\u30E5\u3092\u8AAD\u307E\u305A\u306B\u53D6\u308A\u76F4\u3059\uFF08\u65E2\u5B9A 10 \u5206\uFF09
|
|
20
|
+
--yes \u7834\u58CA\u7684\u306A\u64CD\u4F5C\u306E\u78BA\u8A8D\u3092\u7701\u304F
|
|
21
|
+
|
|
22
|
+
\u5024\u306E\u66F8\u304D\u65B9:
|
|
23
|
+
--flag <\u5024> \u3068 --flag=<\u5024> \u306F\u3069\u3061\u3089\u3082\u4F7F\u3048\u307E\u3059\uFF08\u540C\u3058\u610F\u5473\uFF09\u3002
|
|
24
|
+
\u7A7A\u767D\u3092\u542B\u3080\u5024\u306F\u5F15\u7528\u3057\u3066\u304F\u3060\u3055\u3044\uFF08--keyword "\u5C71\u7530 \u592A\u90CE"\uFF09\u3002
|
|
25
|
+
\u300C-\u300D\u3067\u59CB\u307E\u308B\u5024\u306F = \u306E\u5F62\u3067\u3060\u3051\u6E21\u305B\u307E\u3059\uFF08--keyword=-foo\uFF09\u3002
|
|
26
|
+
\u7A7A\u767D\u533A\u5207\u308A\u3060\u3068\u6B21\u306E\u30D5\u30E9\u30B0\u3068\u533A\u5225\u304C\u4ED8\u304B\u306A\u3044\u305F\u3081\u3001\u5F15\u6570\u30A8\u30E9\u30FC\u306B\u306A\u308A\u307E\u3059\u3002
|
|
27
|
+
= \u304C\u4F7F\u3048\u308B\u306E\u306F -- \u3067\u59CB\u307E\u308B\u9577\u3044\u30D5\u30E9\u30B0\u3060\u3051\u3067\u3059\uFF08-p \u5024 \u306F\u7A7A\u767D\u3067\u533A\u5207\u308A\u307E\u3059\uFF09\u3002
|
|
28
|
+
-- \u4EE5\u964D\u306F\u3059\u3079\u3066\u4F4D\u7F6E\u5F15\u6570\u3068\u3057\u3066\u6271\u308F\u308C\u307E\u3059\u3002
|
|
29
|
+
|
|
30
|
+
\u7D42\u4E86\u30B3\u30FC\u30C9:
|
|
31
|
+
0 \u6210\u529F / 2 \u5F15\u6570\u30A8\u30E9\u30FC / 3 API 4xx / 4 API 5xx\u30FB\u901A\u4FE1\u5931\u6557 / 5 \u8A8D\u8A3C\u5931\u6557
|
|
32
|
+
|
|
33
|
+
\u51FA\u529B\u5148\u306E\u898F\u7D04:
|
|
34
|
+
\u6A5F\u68B0\u53EF\u8AAD\u306A\u7D50\u679C\u306F stdout\u3001\u9032\u6357\u30FB\u8B66\u544A\u30FB\u30A8\u30E9\u30FC\u306F stderr\u3002
|
|
35
|
+
--output json \u306E stdout \u306F\u5E38\u306B\u5358\u4E00\u306E JSON \u5024\uFF08\u5931\u6557\u6642\u306F\u7A7A\u3067\u3001\u30A8\u30E9\u30FC\u306F stderr \u3078 JSON \u3067\u51FA\u308B\uFF09\u3002
|
|
36
|
+
--output json \u306F\u8981\u7D04\u305B\u305A\u3001\u5FDC\u7B54\u306E\u5B9F\u4F53\u3092\u305D\u306E\u307E\u307E\u51FA\u3057\u307E\u3059\uFF08\u30B9\u30AF\u30EA\u30D7\u30C8\u306F\u3053\u3061\u3089\u3092\u8AAD\u3093\u3067\u304F\u3060\u3055\u3044\uFF09\u3002
|
|
37
|
+
\u5916\u5074\u306E\u30A8\u30F3\u30D9\u30ED\u30FC\u30D7\uFF08result / total / has_more / next_cursor \u7B49\uFF09\u306F\u5265\u304C\u3057\u3066\u4E2D\u8EAB\u3060\u3051\u3092\u51FA\u3057\u307E\u3059\u3002
|
|
38
|
+
\u7D9A\u304D\u306E\u6709\u7121\u306F stderr \u306E\u6CE8\u8A18\u3067\u77E5\u3089\u305B\u307E\u3059\u3002
|
|
39
|
+
\u5B9F\u4F53\u304C\u8907\u6570\u3042\u308B\u64CD\u4F5C\u3067\u306F\u4E3B\u305F\u308B\u5B9F\u4F53\u3060\u3051\u3092\u51FA\u3057\u307E\u3059\uFF08task update \u306E changes \u306F\u51FA\u307E\u305B\u3093\u3002
|
|
40
|
+
task delete / task comment delete \u306F result \u3068 message \u3060\u3051\u3067\u3059\uFF09\u3002
|
|
41
|
+
table / text / tsv \u306F\u4EBA\u304C\u8AAD\u3080\u305F\u3081\u306B\u9078\u3093\u3060\u8981\u7D04\u5217\u3067\u30013\u5F62\u5F0F\u3068\u3082\u540C\u3058\u5217\u3067\u3059\u3002
|
|
42
|
+
\u3053\u306E\u5217\u306F\u5951\u7D04\u3067\u306F\u306A\u304F\u4E88\u544A\u306A\u304F\u5909\u308F\u308A\u307E\u3059\u3002\u6A5F\u68B0\u51E6\u7406\u306F --output json \u304B --query \u3092\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\u3002`;function splitFlagToken(token){if(!token.startsWith("--"))return{name:token};const equals=token.indexOf("=");if(equals<3)return{name:token};return{name:token.slice(0,equals),value:token.slice(equals+1)}}export{splitFlagToken,isDomainName,HELP_TOKEN,GLOBAL_OPTIONS_HELP};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
function ansiRegex({onlyFirst=false}={}){const ST="(?:\\u0007|\\u001B\\u005C|\\u009C)";const osc=`(?:\\u001B\\][\\s\\S]*?${ST})`;const csi="[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]";const pattern=`${osc}|${csi}`;return new RegExp(pattern,onlyFirst?void 0:"g")}var regex=ansiRegex();function stripAnsi(string){if(typeof string!=="string"){throw new TypeError(`Expected a \`string\`, got \`${typeof string}\``)}if(!string.includes("\x1B")&&!string.includes("\x9B")){return string}return string.replace(regex,"")}var ambiguousMinimalCodePoint=161;var ambiguousMaximumCodePoint=1114109;var ambiguousRanges=[161,161,164,164,167,168,170,170,173,174,176,180,182,186,188,191,198,198,208,208,215,216,222,225,230,230,232,234,236,237,240,240,242,243,247,250,252,252,254,254,257,257,273,273,275,275,283,283,294,295,299,299,305,307,312,312,319,322,324,324,328,331,333,333,338,339,358,359,363,363,462,462,464,464,466,466,468,468,470,470,472,472,474,474,476,476,593,593,609,609,708,708,711,711,713,715,717,717,720,720,728,731,
|
|
4
|
+
733,733,735,735,768,879,913,929,931,937,945,961,963,969,1025,1025,1040,1103,1105,1105,8208,8208,8211,8214,8216,8217,8220,8221,8224,8226,8228,8231,8240,8240,8242,8243,8245,8245,8251,8251,8254,8254,8308,8308,8319,8319,8321,8324,8364,8364,8451,8451,8453,8453,8457,8457,8467,8467,8470,8470,8481,8482,8486,8486,8491,8491,8531,8532,8539,8542,8544,8555,8560,8569,8585,8585,8592,8601,8632,8633,8658,8658,8660,8660,8679,8679,8704,8704,8706,8707,8711,8712,8715,8715,8719,8719,8721,8721,8725,8725,8730,8730,8733,
|
|
5
|
+
8736,8739,8739,8741,8741,8743,8748,8750,8750,8756,8759,8764,8765,8776,8776,8780,8780,8786,8786,8800,8801,8804,8807,8810,8811,8814,8815,8834,8835,8838,8839,8853,8853,8857,8857,8869,8869,8895,8895,8978,8978,9312,9449,9451,9547,9552,9587,9600,9615,9618,9621,9632,9633,9635,9641,9650,9651,9654,9655,9660,9661,9664,9665,9670,9672,9675,9675,9678,9681,9698,9701,9711,9711,9733,9734,9737,9737,9742,9743,9756,9756,9758,9758,9792,9792,9794,9794,9824,9825,9827,9829,9831,9834,9836,9837,9839,9839,9886,9887,9919,
|
|
6
|
+
9919,9926,9933,9935,9939,9941,9953,9955,9955,9960,9961,9963,9969,9972,9972,9974,9977,9979,9980,9982,9983,10045,10045,10102,10111,11094,11097,12872,12879,57344,63743,65024,65039,65533,65533,127232,127242,127248,127277,127280,127337,127344,127373,127375,127376,127387,127404,917760,917999,983040,1048573,1048576,1114109];var fullwidthMinimalCodePoint=12288;var fullwidthMaximumCodePoint=65510;var fullwidthRanges=[12288,12288,65281,65376,65504,65510];var wideMinimalCodePoint=4352;var wideMaximumCodePoint=262141;var wideRanges=[4352,4447,8986,8987,9001,9002,9193,9196,9200,9200,9203,9203,9725,9726,9748,9749,9776,9783,9800,9811,9855,9855,9866,9871,9875,9875,9889,9889,9898,9899,9917,9918,9924,9925,9934,9934,9940,9940,9962,9962,9970,9971,9973,9973,9978,9978,9981,9981,9989,9989,9994,9995,10024,10024,10060,10060,10062,10062,10067,10069,10071,10071,10133,10135,10160,10160,10175,10175,11035,11036,11088,11088,11093,11093,11904,11929,11931,12019,12032,
|
|
7
|
+
12245,12272,12287,12289,12350,12353,12438,12441,12543,12549,12591,12593,12686,12688,12773,12783,12830,12832,12871,12880,42124,42128,42182,43360,43388,44032,55203,63744,64255,65040,65049,65072,65106,65108,65126,65128,65131,94176,94180,94192,94198,94208,101589,101631,101662,101760,101874,110576,110579,110581,110587,110589,110590,110592,110882,110898,110898,110928,110930,110933,110933,110948,110951,110960,111355,119552,119638,119648,119670,126980,126980,127183,127183,127374,127374,127377,127386,127488,
|
|
8
|
+
127490,127504,127547,127552,127560,127568,127569,127584,127589,127744,127776,127789,127797,127799,127868,127870,127891,127904,127946,127951,127955,127968,127984,127988,127988,127992,128062,128064,128064,128066,128252,128255,128317,128331,128334,128336,128359,128378,128378,128405,128406,128420,128420,128507,128591,128640,128709,128716,128716,128720,128722,128725,128728,128732,128735,128747,128748,128756,128764,128992,129003,129008,129008,129292,129338,129340,129349,129351,129535,129648,129660,129664,
|
|
9
|
+
129674,129678,129734,129736,129736,129741,129756,129759,129770,129775,129784,131072,196605,196608,262141];var isInRange=(ranges,codePoint)=>{let low=0;let high=Math.floor(ranges.length/2)-1;while(low<=high){const mid=Math.floor((low+high)/2);const i=mid*2;if(codePoint<ranges[i]){high=mid-1}else if(codePoint>ranges[i+1]){low=mid+1}else{return true}}return false};var commonCjkCodePoint=19968;var[wideFastPathStart,wideFastPathEnd]=findWideFastPathRange(wideRanges);function findWideFastPathRange(ranges){let fastPathStart=ranges[0];let fastPathEnd=ranges[1];for(let index=0;index<ranges.length;index+=2){const start=ranges[index];const end=ranges[index+1];if(commonCjkCodePoint>=start&&commonCjkCodePoint<=end){return[start,end]}if(end-start>fastPathEnd-fastPathStart){fastPathStart=start;fastPathEnd=end}}return[fastPathStart,fastPathEnd]}var isAmbiguous=codePoint=>{
|
|
10
|
+
if(codePoint<ambiguousMinimalCodePoint||codePoint>ambiguousMaximumCodePoint){return false}return isInRange(ambiguousRanges,codePoint)};var isFullWidth=codePoint=>{if(codePoint<fullwidthMinimalCodePoint||codePoint>fullwidthMaximumCodePoint){return false}return isInRange(fullwidthRanges,codePoint)};var isWide=codePoint=>{if(codePoint>=wideFastPathStart&&codePoint<=wideFastPathEnd){return true}if(codePoint<wideMinimalCodePoint||codePoint>wideMaximumCodePoint){return false}return isInRange(wideRanges,codePoint)};function validate(codePoint){if(!Number.isSafeInteger(codePoint)){throw new TypeError(`Expected a code point, got \`${typeof codePoint}\`.`)}}function eastAsianWidth(codePoint,{ambiguousAsWide=false}={}){validate(codePoint);if(isFullWidth(codePoint)||isWide(codePoint)||ambiguousAsWide&&isAmbiguous(codePoint)){return 2}return 1}var segmenter=new Intl.Segmenter;var zeroWidthClusterRegex=new RegExp("^(?:\\p{Default_Ignorable_Code_Point}|\\p{Control}|\\p{Format}|\\p{Nonspacing_Mark}|\\p{Enclosing_Mark}|\\p{Surrogate})+$","v");var leadingNonPrintingRegex=new RegExp("^[\\p{Default_Ignorable_Code_Point}\\p{Control}\\p{Format}\\p{Nonspacing_Mark}\\p{Enclosing_Mark}\\p{Surrogate}]+","v");var spacingMarkRegex=new RegExp("\\p{Spacing_Mark}","v");var rgiEmojiRegex=new RegExp("^\\p{RGI_Emoji}$","v");var unqualifiedKeycapRegex=/^[\d#*]\u20E3$/;
|
|
11
|
+
var extendedPictographicRegex=new RegExp("\\p{Extended_Pictographic}","gu");function isDoubleWidthNonRgiEmojiSequence(segment){if(segment.length>50){return false}if(unqualifiedKeycapRegex.test(segment)){return true}if(segment.includes("\u200D")){const pictographics=segment.match(extendedPictographicRegex);return pictographics!==null&&pictographics.length>=2}return false}function baseVisible(segment){return segment.replace(leadingNonPrintingRegex,"")}function isZeroWidthCluster(segment){return zeroWidthClusterRegex.
|
|
12
|
+
test(segment)}function isHangulLeadingJamo(codePoint){return codePoint>=4352&&codePoint<=4447||codePoint>=43360&&codePoint<=43388}function isHangulVowelJamo(codePoint){return codePoint>=4448&&codePoint<=4519||codePoint>=55216&&codePoint<=55238}function isHangulTrailingJamo(codePoint){return codePoint>=4520&&codePoint<=4607||codePoint>=55243&&codePoint<=55291}function isHangulJamo(codePoint){return isHangulLeadingJamo(codePoint)||isHangulVowelJamo(codePoint)||isHangulTrailingJamo(codePoint)}function hangulClusterWidth(visibleSegment,eastAsianWidthOptions){
|
|
13
|
+
const codePoints=[];for(const character of visibleSegment){if(zeroWidthClusterRegex.test(character)){continue}codePoints.push(character.codePointAt(0))}if(codePoints.length===0){return void 0}let width=0;for(let index=0;index<codePoints.length;index++){const codePoint=codePoints[index];if(!isHangulJamo(codePoint)){if(width===0){return void 0}for(let remaining=index;remaining<codePoints.length;remaining++){width+=eastAsianWidth(codePoints[remaining],eastAsianWidthOptions)}return width}if(isHangulLeadingJamo(
|
|
14
|
+
codePoint)&&isHangulVowelJamo(codePoints[index+1])){width+=2;index+=isHangulTrailingJamo(codePoints[index+2])?2:1;continue}width+=eastAsianWidth(codePoint,eastAsianWidthOptions)}return width}function trailingWidth(visibleSegment,eastAsianWidthOptions){let extra=0;let first=true;for(const character of visibleSegment){if(first){first=false;continue}if(spacingMarkRegex.test(character)||character>="\uFF00"&&character<="\uFFEF"){extra+=eastAsianWidth(character.codePointAt(0),eastAsianWidthOptions)}}return extra}
|
|
15
|
+
function stringWidth(input,options={}){if(typeof input!=="string"||input.length===0){return 0}const{ambiguousIsNarrow=true,countAnsiEscapeCodes=false}=options;let string=input;if(!countAnsiEscapeCodes&&(string.includes("\x1B")||string.includes("\x9B"))){string=stripAnsi(string)}if(string.length===0){return 0}if(/^[\u0020-\u007E]*$/.test(string)){return string.length}let width=0;const eastAsianWidthOptions={ambiguousAsWide:!ambiguousIsNarrow};for(const{segment}of segmenter.segment(string)){if(isZeroWidthCluster(
|
|
16
|
+
segment)){continue}if(rgiEmojiRegex.test(segment)||isDoubleWidthNonRgiEmojiSequence(segment)){width+=2;continue}const visibleSegment=baseVisible(segment);const hangulWidth=hangulClusterWidth(visibleSegment,eastAsianWidthOptions);if(hangulWidth!==void 0){width+=hangulWidth;continue}const codePoint=visibleSegment.codePointAt(0);width+=eastAsianWidth(codePoint,eastAsianWidthOptions);width+=trailingWidth(visibleSegment,eastAsianWidthOptions)}return width}export{stripAnsi,isFullWidth,isWide,stringWidth};
|