@mortiseai/stem 0.0.3 → 0.0.4
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/dist/cli.mjs +421 -421
- package/dist/daemon.mjs +4 -4
- package/dist/mcp.mjs +3 -3
- package/package.json +1 -1
package/dist/daemon.mjs
CHANGED
|
@@ -597,7 +597,7 @@ prompt 또는 slash command 를 지정한 간격으로 반복 실행합니다.
|
|
|
597
597
|
|
|
598
598
|
**철칙 2 — 중지는 LoopCancel 만 인정**: 작업이 완료되었거나 사용자가 중지를 요청했다고 판단되면, 루프를 멈출 수 있는 **유일한** 방법은 \`LoopCancel\` 도구를 호출하는 것입니다 — 반드시 호출하세요. "루프를 중지했습니다", "자동으로 닫겠습니다" 같은 **어떠한** 형태의 중지 선언 텍스트도, scheduler 는 응답을 읽지 않으므로 **완전히 무효**입니다. 도구를 호출하지 않고 텍스트로만 선언하면: (1) 다음 cron tick 에서 동일한 prompt 가 다시 도착합니다; (2) Repl 이 "중지를 선언했지만 도구를 호출하지 않은" 모순 상태를 감지하여 대신 LoopCancel 을 자동 호출하고, 당신의 응답을 반례로 진단 로그에 기록합니다. 멈추려면 도구를 호출하고, 호출하지 않으려면 멈췄다고 말하지 마세요.
|
|
599
599
|
|
|
600
|
-
**철칙 3 — 단일 채널 + loop 메타 commentary 금지**: 위의 prompt 를 **사용자가 일반 프롬프트에 방금 입력한 것**으로 취급하고, 평소의 대화 스타일로 자연스럽게 응답하세요 —— 도입부, 다단락 추론, markdown, 이모지, 되묻기 모두 prompt 에 어울리면 사용 가능합니다. **echo bot 처럼 동작하지 마세요**. 구조적 제약은 두 가지뿐: **(a) 단일 채널** —— 순수 assistant text 로 출력하거나 \`SendUserMessage\` 도구로 보내거나 둘 중 하나, **두 방식을 섞지 마세요** (섞으면 같은 내용이 UI 에 2~4번 나타나 모델이 혼잣말하는 것처럼 보입니다). **(b) loop bookkeeping 금지** —— "현재 N회차", "X회 실행됨", "정지 조건 충족", "다음 회차로 진입" 같은 메타 commentary 를 추가하지 마세요. loop 메커니즘은 prompt 입장에서 보이지 않습니다. 평범한 사용자가 입력하는 것처럼 응답하세요. 중지가 필요하면 철칙 2 에 따라 LoopCancel 만 호출하고 평소 응답은 그대로 두세요. **"loop 가 중지되었습니다" 같은 추가 문장은 쓰지 마세요**.`,closeConditionHint:'[시스템 강제 제약 — 자동 종료 조건] 사용자가 본 loop 에 자동 종료 조건을 설정했습니다: "{condition}". 이번 응답 완료 후, **조건이 현재 충족되었는지 판단**하세요. 충족되었다면 loop 를 실제로 중지하려면 `LoopCancel` 도구 호출이 **필수**입니다 — "조건을 충족했습니다", "loop 를 중지합니다" 같은 텍스트만 출력하는 것은 **완전히 무효**입니다 (scheduler 는 응답을 읽지 않고 도구 호출만 봅니다; Repl 이 "중지 선언했지만 도구 미호출" 모순을 감지하여 대신 LoopCancel 을 자동 호출하고 당신의 응답을 반례로 진단 로그에 기록합니다). "N회차 후"와 같은 수치 조건이라면 현재 회차는 위 철칙에 명시되어 있으니 정확히 세고, 너무 일찍 또는 너무 늦게 중지하지 마세요. 조건이 충족되지 않았다면 정상적으로 이번 회차를 완료하면 되며, 다음 cron tick 이 예정대로 도착합니다.',idLabel:"ID: {id}",activeBanner:'/loop {id} 활성 · {cadence} · "{prompt}"',cadenceSecond:"{count} 초마다",cadenceMinute:"{count} 분마다",cadenceHour:"{count} 시간마다",activeBannerMaxRunsSuffix:" · 최대 {count} 회",activeBannerStopSuffix:" · 자동 종료 조건: {condition}",cancelUnknownId:'/loop-cancel: id "{id}"에 해당하는 활성 loop가 없습니다.',toolUnknownId:"loop를 찾을 수 없음: {id}",toolCancelFailed:"{id} 종료 실패",toolCancelledSingle:"{id} 종료됨",toolNoActive:"종료할 loop가 없음",toolFoundButFailed:"loop를 찾았지만 모두 종료에 실패",toolCancelledMany:"종료: {ids}",autoStoppedByCondition:'현재 loop는 {count}회차 실행을 완료했고 자동 종료 조건("{condition}")을 충족해 자동으로 종료되었습니다.',autoStopped:"현재 loop는 {count}회차 실행을 완료했고 자동으로 종료되었습니다.",autoStoppedBannerByCondition:'Loop 자동 종료 · {count}회차 · 조건 충족: "{condition}"',autoStoppedBanner:"Loop 자동 종료 · {count}회차",debugStopReasonByCondition:'종료 트리거: {count}회차에서 자동 종료 조건("{condition}")을 충족했습니다.',debugStopReason:"종료 트리거: {count}회차 실행이 완료되었습니다."},cron:{runFired:"예약 작업 {id} {count}회차 실행 · {time}",runHint:'[시스템 알림] 아래 prompt는 ScheduleCron 예약 작업 {id}({count}회차)에 의해 자동 주입된 것으로, 사용자가 직접 입력한 것이 아닙니다. 사용자에게 확인을 요청하지 말고 바로 실행하세요. 이 예약 작업을 중지하려면 ScheduleCron 도구를 action="delete" id="{id}"로 호출하세요(oneShot 작업은 실행 후 자동 삭제되므로 불필요).'},causal:{stageObserve:"관측",stageChain:"소인",stageVerify:"검증",stageAttribute:"귀인",stageSummary:"요약",titleObserve:"인과 - 관측",titleChain:"인과 - 인과 사슬",titleVerify:"인과 - 검증",titleAttribute:"인과 - 귀인",titleSummary:"인과 - 요약",observationsTitle:"관측 신호",chainTitle:"인과 사슬(원인 → 결과)",rootCauseLabel:"근본 원인",confidenceLabel:"신뢰도",graphLabel:"인과 그래프",attributionTitle:"귀인",awaitingEngine:"엔진을 호출하여 인과 사슬을 추적 중…",awaitingCycles:"인과 분석 대기 중…",linkArrow:"→"},evolve:{titlePlan:"진화 - 계획",titleVerify:"진화 - 검증",titleLearn:"진화 - 학습",titleSummary:"진화 - 요약",iterFormat:"{current}/{total} 라운드",awaitingEngine:"결과 대기 중 …",awaitingCycles:"진화 사이클 완료 대기 중…",stageExecute:"실행",fileNotFound:"진화 파일을 찾을 수 없습니다: {path}",fileNotARegular:"일반 파일이 아닙니다: {path}",renamePrompt:"{path} 에 저장됨. Enter / y = 이 파일 이름 유지; 새 이름(.md 자동 추가) = 이번 라운드 이름 변경; n = 진화 종료.",renamePromptOverwrite:"{path} 에 저장됨. Enter / y = 이전 라운드({prev}) 덮어쓰기; 새 이름(.md 자동 추가) = 독립 파일; n = 진화 종료.",renamePromptHeader:"{path} 에 저장됨.",renamePromptCandidatesTitle:"덮어쓰기 가능한 기존 라운드:",renamePromptCandidateLine:" {n}. {label}",renamePromptFooter:"Enter = 기본 유지(독립 파일); 숫자 = 위 항목 덮어쓰기; 새 이름(.md 자동 추가) = 독립 파일 이름 변경; d = 이번 라운드 폐기(삭제); n = 진화 종료.",renamePromptFooterIter1:"Enter / y = 기본 유지; 새 이름(.md 자동 추가) = 이름 변경; d = 이번 라운드 폐기(삭제); n = 진화 종료.",discardDone:"이번 라운드를 폐기했습니다: {path}",discardFailed:"폐기 실패: {reason}",renameKeptDefault:"현재 파일 이름을 유지했습니다.",renameDone:"이름 변경됨: {path}",renameOverwrote:"업데이트됨: {path}",renameFailed:"이름 변경 실패: {reason}",targetReached:"진화 {round}/{total} 라운드 신뢰도 {score}/{max} 목표(≥ {target}) 달성 — 조기 수렴 완료.",notReachedMemory:"신뢰도 {score}/{max} 목표(≥ {target}) 미달 — 최종 라운드의 결론을 그대로 기억에 저장합니다(낮은 점수도 정직하게 기록).",nextInputRegenerated:"이전 라운드의 통찰 결과 + 통찰 입력으로 이번 라운드의 통찰 입력을 재생성하여 자동으로 다음 라운드로 진행합니다.",targetPrompt:"진화 {prev}/{total} 라운드 완료 — 다음 {next}/{total} 라운드 쓸 위치?",targetPromptFinal:"진화 {prev}/{total} 라운드 완료(최종)— 이 파일의 최종 위치?",targetMenuLine:" {n}. {label} {marker}",targetMenuCurrentMark:"(기본 · 현재 포인터)",targetMenuNewItem:"새로 만들기...",targetMenuFooter:"Enter = 현재 포인터 유지(다음 라운드는 여기에 기록); 「숫자」 입력으로 기존 선택(포인터를 해당 항목으로 전환, 다음 라운드는 거기에 기록); 「새 파일명」(단일 토큰, .md 자동 추가)으로 독립 파일; n = 취소.",targetMenuFooterFinal:"Enter = 현재 파일 유지(변경 없음); 「숫자」 입력 → 현재 파일을 해당 경로로 fs.rename(해당 항목이 현재 포인터가 아니면 덮어쓰기); 「새 파일명」(단일 토큰, .md 자동 추가) → 이름 변경; n = 종료(변경 없음).",targetInvalidWhitespace:"공백 불가 — 숫자나 정확한 파일명으로 선택; 독립 파일은 단일 토큰 파일명만.",targetSelected:"선택됨: {label}",targetCreatedNew:"새 독립 파일: {path}",targetInvalidPath:"파일명만 허용 — 디렉토리 구분자나 .. 불가.",targetInvalidIndex:"번호가 범위를 벗어났습니다.",targetNeedNewName:"새 파일 이름을 입력하세요(.md 자동 추가).",targetFilenameExists:"파일명 중복 — 이미 존재함: {path}. 다른 이름을 입력하거나 해당 「숫자」를 선택하세요."},distill:{titlePlan:"침전 - 계획",titleVerify:"침전 - 검증",titleLearn:"침전 - 학습",titleSummary:"침전 - 요약",causalAnalyzed:"인과 분석",phase:"단계:",rootCause:"근본 원인:",confidence:"신뢰도:",causalGraph:"인과 그래프:",hypotheses:"가설:",summary:"요약:",stagePlan:"계획",stageVerify:"검증",stageLearn:"학습",stageSummary:"요약",awaitingEngine:"결과 대기 중 …",awaitingCycles:"침전 사이클 완료 대기 중…"},insight:{stagePreset:"사전 설정",stageInit:"초기화",stageRun:"실행",stageOutput:"출력",stageScore:"평가",stageSummary:"요약",stageMemory:"기억",stageComplete:"완료",titlePreset:"인사이트 - 사전 설정",titleInit:"인사이트 - 초기화",titleRun:"인사이트 - 실행",titleOutput:"인사이트 - 출력",titleScore:"인사이트 - 평가",titleMemory:"인사이트 - 기억",memoryWriting:"stem memory 에 기록 중(인사이트 기억)…",inputTitle:"인사이트 내용",goalsTitle:"분석 목표",criteriaTitle:"신뢰도 평가 기준",targetLabel:"목표 점수",targetFormat:"≥ {target}/{max}",flowTitle:"실행 흐름",tasksTitle:"실행 단계",stepLabel:"단계{n}",resultTitle:"인사이트 결과",confidenceLabel:"신뢰도",scoreFormat:"{score}/{max}",scoreSummaryTitle:"실행도 요약",taskTypePrompt:"프롬프트",taskTypeDataRead:"데이터 읽기",taskTypeDataCompute:"데이터 계산",taskTypeWebSearch:"웹 검색",taskTypeAnalysisLocate:"분석 위치 지정",taskTypeSummarize:"요약 정리",taskTypeTool:"도구",taskTypeCommand:"명령어",taskTypeSubagent:"서브에이전트",taskTypeWorkflow:"워크플로",taskTypeMcpTool:"MCP 도구",taskTypeMemory:"기억 읽기/쓰기",awaitingEngine:"엔진을 호출하여 인사이트 흐름 실행 중…",inputFallbackToken:"입력",titleFormatCausal:"「{token}」 인과 인사이트",titleFormatDistill:"「{token}」 침전 인사이트",titleFormatEvolve:"「{token}」 진화 인사이트",goalScope:"분석 범위와 핵심 연결 고리 확정",goalCausalChain:"현상 → 근본 원인 → 영향 의 인과 사슬 산출",goalDistill:"재사용 가능한 결론과 패턴 침전",goalEvolve:"목표 신뢰도에 도달할 때까지 인사이트 결론 반복 수렴",goalActions:"계층별(P0/P1/P2) 대응 제안 제시",criterionLow:"증거 부족, 결론 사용 불가",criterionMid:"방향은 성립, 주도 요인 미확정",criterionHigh:"근본 원인 신뢰 가능, 영향 범위 미정량",criterionTop:"논리 루프 완결, 대응 제안 즉시 실행 가능",flowStart:"시작",flowEnd:"종료",scoreReachedDefault:"신뢰도 {score}/{max}, 목표 점수 달성(≥ {target}).",scoreMissedDefault:"신뢰도 {score}/{max}, 목표 점수 미달(≥ {target}).",engineParseFallback:"엔진 응답을 구조화된 인사이트로 해석하지 못해 원문을 출력에 반영했습니다. 신뢰도는 0(증거 부족)으로 기록.",engineEmptyOutput:"(엔진이 내용을 반환하지 않음)",engineCallFailed:"엔진 호출 실패: {reason}",summaryStream:"인사이트 완료{cycle}. 명령 「{command}」이(가) {mode} 모드에서 {stepCount}단계 플로우({flow})를 실행해 {tasksDone}/{tasksTotal}단계를 {duration}에 완료했습니다. 신뢰도 {score}/{max} (목표 ≥ {target}). 기억을 {path}에 저장했습니다.",unitHour:"시간",unitMinute:"분",unitSecond:"초",unitMs:"밀리초",durationInstant:"즉시",modeDistill:"침전",modeEvolve:"진화",modeCausal:"인과",savedLine:"✓ 저장됨: {path}",saveFailedLine:"✗ 저장 실패: {reason}",memorySavedLine:"✓ stem memory 에 저장됨: {path}",memoryUpdatedLine:"✓ stem memory 업데이트됨: {path}",memoryAdviceHeading:"권장 사항",memoryScoreLine:"신뢰도 {score}/{max}: {summary}",memoryIndexHook:"{mode} 인사이트 · 신뢰도 {score}/{max}",memoryInsightFileLine:"인사이트 파일: {path}",dataSavedLine:"인사이트 {mode} 파일 저장됨: {path}",dataSaveFailedLine:"인사이트 데이터 저장 실패: {reason}",statusPending:"대기",statusActive:"진행 중",statusDone:"완료",reportTitle:"인사이트 리포트",reportCommand:"명령",reportMode:"모드",reportGenerated:"생성 시각",reportFile:"파일",reportSteps:"단계",reportRangeHeader:"점수 구간",reportMeaningHeader:"의미"}},oS=oG0;var sG0=/\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g;function sS($,Z){if(!Z)return $;return $.replace(sG0,(O,Y)=>{let f=Z[Y];if(f===void 0||f===null)return O;return String(f)})}function jN(){let $=process.env.STEM_BIZ_NAME?.trim();return $?$:"MortiseAI"}function vE($){return $.replaceAll("MortiseAI",jN())}var UN=["zh","en","ja","ko"];function aS($){return UN.includes($)}function WN($){if(!$)return null;let Z=$.toLowerCase();for(let O of UN)if(Z.startsWith(O))return O;return null}function aG0($){let Z=[],O=null;for(let Y=0;Y<$.length;Y++){let f=$[Y];if(f==="--lang"){let X=$[Y+1];if(X!==void 0&&!X.startsWith("-")){if(aS(X))O=X;Y++}continue}if(f.startsWith("--lang=")){let X=f.slice(7);if(aS(X))O=X;continue}Z.push(f)}return{value:O,cleaned:Z}}function bN($=process.argv.slice(2)){let Z=aG0($);if(Z.value)return{locale:Z.value,cleanedArgv:Z.cleaned};let O=(process.env.STEM_DEF_LANGUAGE||"").toLowerCase();for(let f of UN)if(O.startsWith(f))return{locale:f,cleanedArgv:Z.cleaned};let Y=WN(process.env.LC_ALL)??WN(process.env.LC_MESSAGES)??WN(process.env.LANG);if(Y)return{locale:Y,cleanedArgv:Z.cleaned};return{locale:"zh",cleanedArgv:Z.cleaned}}var tG0={zh:ME,en:rS,ja:iS,ko:oS},tS=ME,eS="zh";function $M($){eS=$,tS=tG0[$]??ME}function I5(){return eS}function ZM($){let Z=$.split("."),O=tS;for(let Y of Z){if(typeof O!=="object"||Array.isArray(O)||O===null)return;if(O=O[Y],O===void 0)return}return O}function w($,Z){let O=ZM($);if(typeof O!=="string")return console.warn(`[i18n] missing string key: ${$}`),$;return sS(O,{bizName:jN(),...Z})}function OM($,Z){let O=ZM("commandsCatalog");if(!O||typeof O!=="object"||Array.isArray(O))return;let Y=O[$];if(!Y||typeof Y!=="object"||Array.isArray(Y))return;let f=Y[Z];return typeof f==="string"?f:void 0}function HN($){return OM($,"label")??`/${$}`}function YM($){return OM($,"description")??""}O$();import{appendFileSync as eG0,existsSync as SM0,mkdirSync as $V0}from"node:fs";import{dirname as ZV0,join as fM}from"node:path";function OV0(){if(process.env.STEM_CMD_LOG)return!0;let $=(process.env.STEM_DEBUG??"").toLowerCase();return $==="1"||$==="true"||$==="yes"||$==="on"}function C($,Z,O="info"){if(O!=="error"&&!OV0())return;let Y=QM();try{$V0(ZV0(Y),{recursive:!0});let f=GV0(new Date),X=O.padEnd(5," "),J=Z===void 0?"":` ${JSON.stringify(Z)}`;if(eG0(Y,IG(`${f} · ${X} · [${$}]${J}
|
|
600
|
+
**철칙 3 — 단일 채널 + loop 메타 commentary 금지**: 위의 prompt 를 **사용자가 일반 프롬프트에 방금 입력한 것**으로 취급하고, 평소의 대화 스타일로 자연스럽게 응답하세요 —— 도입부, 다단락 추론, markdown, 이모지, 되묻기 모두 prompt 에 어울리면 사용 가능합니다. **echo bot 처럼 동작하지 마세요**. 구조적 제약은 두 가지뿐: **(a) 단일 채널** —— 순수 assistant text 로 출력하거나 \`SendUserMessage\` 도구로 보내거나 둘 중 하나, **두 방식을 섞지 마세요** (섞으면 같은 내용이 UI 에 2~4번 나타나 모델이 혼잣말하는 것처럼 보입니다). **(b) loop bookkeeping 금지** —— "현재 N회차", "X회 실행됨", "정지 조건 충족", "다음 회차로 진입" 같은 메타 commentary 를 추가하지 마세요. loop 메커니즘은 prompt 입장에서 보이지 않습니다. 평범한 사용자가 입력하는 것처럼 응답하세요. 중지가 필요하면 철칙 2 에 따라 LoopCancel 만 호출하고 평소 응답은 그대로 두세요. **"loop 가 중지되었습니다" 같은 추가 문장은 쓰지 마세요**.`,closeConditionHint:'[시스템 강제 제약 — 자동 종료 조건] 사용자가 본 loop 에 자동 종료 조건을 설정했습니다: "{condition}". 이번 응답 완료 후, **조건이 현재 충족되었는지 판단**하세요. 충족되었다면 loop 를 실제로 중지하려면 `LoopCancel` 도구 호출이 **필수**입니다 — "조건을 충족했습니다", "loop 를 중지합니다" 같은 텍스트만 출력하는 것은 **완전히 무효**입니다 (scheduler 는 응답을 읽지 않고 도구 호출만 봅니다; Repl 이 "중지 선언했지만 도구 미호출" 모순을 감지하여 대신 LoopCancel 을 자동 호출하고 당신의 응답을 반례로 진단 로그에 기록합니다). "N회차 후"와 같은 수치 조건이라면 현재 회차는 위 철칙에 명시되어 있으니 정확히 세고, 너무 일찍 또는 너무 늦게 중지하지 마세요. 조건이 충족되지 않았다면 정상적으로 이번 회차를 완료하면 되며, 다음 cron tick 이 예정대로 도착합니다.',idLabel:"ID: {id}",activeBanner:'/loop {id} 활성 · {cadence} · "{prompt}"',cadenceSecond:"{count} 초마다",cadenceMinute:"{count} 분마다",cadenceHour:"{count} 시간마다",activeBannerMaxRunsSuffix:" · 최대 {count} 회",activeBannerStopSuffix:" · 자동 종료 조건: {condition}",cancelUnknownId:'/loop-cancel: id "{id}"에 해당하는 활성 loop가 없습니다.',toolUnknownId:"loop를 찾을 수 없음: {id}",toolCancelFailed:"{id} 종료 실패",toolCancelledSingle:"{id} 종료됨",toolNoActive:"종료할 loop가 없음",toolFoundButFailed:"loop를 찾았지만 모두 종료에 실패",toolCancelledMany:"종료: {ids}",autoStoppedByCondition:'현재 loop는 {count}회차 실행을 완료했고 자동 종료 조건("{condition}")을 충족해 자동으로 종료되었습니다.',autoStopped:"현재 loop는 {count}회차 실행을 완료했고 자동으로 종료되었습니다.",autoStoppedBannerByCondition:'Loop 자동 종료 · {count}회차 · 조건 충족: "{condition}"',autoStoppedBanner:"Loop 자동 종료 · {count}회차",debugStopReasonByCondition:'종료 트리거: {count}회차에서 자동 종료 조건("{condition}")을 충족했습니다.',debugStopReason:"종료 트리거: {count}회차 실행이 완료되었습니다."},cron:{runFired:"예약 작업 {id} {count}회차 실행 · {time}",runHint:'[시스템 알림] 아래 prompt는 ScheduleCron 예약 작업 {id}({count}회차)에 의해 자동 주입된 것으로, 사용자가 직접 입력한 것이 아닙니다. 사용자에게 확인을 요청하지 말고 바로 실행하세요. 이 예약 작업을 중지하려면 ScheduleCron 도구를 action="delete" id="{id}"로 호출하세요(oneShot 작업은 실행 후 자동 삭제되므로 불필요).'},causal:{stageObserve:"관측",stageChain:"소인",stageVerify:"검증",stageAttribute:"귀인",stageSummary:"요약",titleObserve:"인과 - 관측",titleChain:"인과 - 인과 사슬",titleVerify:"인과 - 검증",titleAttribute:"인과 - 귀인",titleSummary:"인과 - 요약",observationsTitle:"관측 신호",chainTitle:"인과 사슬(원인 → 결과)",rootCauseLabel:"근본 원인",confidenceLabel:"신뢰도",graphLabel:"인과 그래프",attributionTitle:"귀인",awaitingEngine:"엔진을 호출하여 인과 사슬을 추적 중…",awaitingCycles:"인과 분석 대기 중…",linkArrow:"→"},evolve:{titlePlan:"진화 - 계획",titleVerify:"진화 - 검증",titleLearn:"진화 - 학습",titleSummary:"진화 - 요약",iterFormat:"{current}/{total} 라운드",awaitingEngine:"결과 대기 중 …",awaitingCycles:"진화 사이클 완료 대기 중…",stageExecute:"실행",fileNotFound:"진화 파일을 찾을 수 없습니다: {path}",fileNotARegular:"일반 파일이 아닙니다: {path}",renamePrompt:"{path} 에 저장됨. Enter / y = 이 파일 이름 유지; 새 이름(.md 자동 추가) = 이번 라운드 이름 변경; n = 진화 종료.",renamePromptOverwrite:"{path} 에 저장됨. Enter / y = 이전 라운드({prev}) 덮어쓰기; 새 이름(.md 자동 추가) = 독립 파일; n = 진화 종료.",renamePromptHeader:"{path} 에 저장됨.",renamePromptCandidatesTitle:"덮어쓰기 가능한 기존 라운드:",renamePromptCandidateLine:" {n}. {label}",renamePromptFooter:"Enter = 기본 유지(독립 파일); 숫자 = 위 항목 덮어쓰기; 새 이름(.md 자동 추가) = 독립 파일 이름 변경; d = 이번 라운드 폐기(삭제); n = 진화 종료.",renamePromptFooterIter1:"Enter / y = 기본 유지; 새 이름(.md 자동 추가) = 이름 변경; d = 이번 라운드 폐기(삭제); n = 진화 종료.",discardDone:"이번 라운드를 폐기했습니다: {path}",discardFailed:"폐기 실패: {reason}",renameKeptDefault:"현재 파일 이름을 유지했습니다.",renameDone:"이름 변경됨: {path}",renameOverwrote:"업데이트됨: {path}",renameFailed:"이름 변경 실패: {reason}",targetReached:"진화 {round}/{total} 라운드 신뢰도 {score}/{max} 목표(≥ {target}) 달성 — 조기 수렴 완료.",notReachedMemory:"신뢰도 {score}/{max} 목표(≥ {target}) 미달 — 최종 라운드의 결론을 그대로 기억에 저장합니다(낮은 점수도 정직하게 기록).",nextInputRegenerated:"이전 라운드의 통찰 결과 + 통찰 입력으로 이번 라운드의 통찰 입력을 재생성하여 자동으로 다음 라운드로 진행합니다.",targetPrompt:"진화 {prev}/{total} 라운드 완료 — 다음 {next}/{total} 라운드 쓸 위치?",targetPromptFinal:"진화 {prev}/{total} 라운드 완료(최종)— 이 파일의 최종 위치?",targetMenuLine:" {n}. {label} {marker}",targetMenuCurrentMark:"(기본 · 현재 포인터)",targetMenuNewItem:"새로 만들기...",targetMenuFooter:"Enter = 현재 포인터 유지(다음 라운드는 여기에 기록); 「숫자」 입력으로 기존 선택(포인터를 해당 항목으로 전환, 다음 라운드는 거기에 기록); 「새 파일명」(단일 토큰, .md 자동 추가)으로 독립 파일; n = 취소.",targetMenuFooterFinal:"Enter = 현재 파일 유지(변경 없음); 「숫자」 입력 → 현재 파일을 해당 경로로 fs.rename(해당 항목이 현재 포인터가 아니면 덮어쓰기); 「새 파일명」(단일 토큰, .md 자동 추가) → 이름 변경; n = 종료(변경 없음).",targetInvalidWhitespace:"공백 불가 — 숫자나 정확한 파일명으로 선택; 독립 파일은 단일 토큰 파일명만.",targetSelected:"선택됨: {label}",targetCreatedNew:"새 독립 파일: {path}",targetInvalidPath:"파일명만 허용 — 디렉토리 구분자나 .. 불가.",targetInvalidIndex:"번호가 범위를 벗어났습니다.",targetNeedNewName:"새 파일 이름을 입력하세요(.md 자동 추가).",targetFilenameExists:"파일명 중복 — 이미 존재함: {path}. 다른 이름을 입력하거나 해당 「숫자」를 선택하세요."},distill:{titlePlan:"침전 - 계획",titleVerify:"침전 - 검증",titleLearn:"침전 - 학습",titleSummary:"침전 - 요약",causalAnalyzed:"인과 분석",phase:"단계:",rootCause:"근본 원인:",confidence:"신뢰도:",causalGraph:"인과 그래프:",hypotheses:"가설:",summary:"요약:",stagePlan:"계획",stageVerify:"검증",stageLearn:"학습",stageSummary:"요약",awaitingEngine:"결과 대기 중 …",awaitingCycles:"침전 사이클 완료 대기 중…"},insight:{stagePreset:"사전 설정",stageInit:"초기화",stageRun:"실행",stageOutput:"출력",stageScore:"평가",stageSummary:"요약",stageMemory:"기억",stageComplete:"완료",titlePreset:"인사이트 - 사전 설정",titleInit:"인사이트 - 초기화",titleRun:"인사이트 - 실행",titleOutput:"인사이트 - 출력",titleScore:"인사이트 - 평가",titleMemory:"인사이트 - 기억",memoryWriting:"stem memory 에 기록 중(인사이트 기억)…",inputTitle:"인사이트 내용",goalsTitle:"분석 목표",criteriaTitle:"신뢰도 평가 기준",targetLabel:"목표 점수",targetFormat:"≥ {target}/{max}",flowTitle:"실행 흐름",tasksTitle:"실행 단계",stepLabel:"단계{n}",resultTitle:"인사이트 결과",confidenceLabel:"신뢰도",scoreFormat:"{score}/{max}",scoreSummaryTitle:"실행도 요약",taskTypePrompt:"프롬프트",taskTypeDataRead:"데이터 읽기",taskTypeDataCompute:"데이터 계산",taskTypeWebSearch:"웹 검색",taskTypeAnalysisLocate:"분석 위치 지정",taskTypeSummarize:"요약 정리",taskTypeTool:"도구",taskTypeCommand:"명령어",taskTypeSubagent:"서브에이전트",taskTypeWorkflow:"워크플로",taskTypeMcpTool:"MCP 도구",taskTypeMemory:"기억 읽기/쓰기",awaitingEngine:"엔진을 호출하여 인사이트 흐름 실행 중…",inputFallbackToken:"입력",titleFormatCausal:"「{token}」 인과 인사이트",titleFormatDistill:"「{token}」 침전 인사이트",titleFormatEvolve:"「{token}」 진화 인사이트",goalScope:"분석 범위와 핵심 연결 고리 확정",goalCausalChain:"현상 → 근본 원인 → 영향 의 인과 사슬 산출",goalDistill:"재사용 가능한 결론과 패턴 침전",goalEvolve:"목표 신뢰도에 도달할 때까지 인사이트 결론 반복 수렴",goalActions:"계층별(P0/P1/P2) 대응 제안 제시",criterionLow:"증거 부족, 결론 사용 불가",criterionMid:"방향은 성립, 주도 요인 미확정",criterionHigh:"근본 원인 신뢰 가능, 영향 범위 미정량",criterionTop:"논리 루프 완결, 대응 제안 즉시 실행 가능",flowStart:"시작",flowEnd:"종료",scoreReachedDefault:"신뢰도 {score}/{max}, 목표 점수 달성(≥ {target}).",scoreMissedDefault:"신뢰도 {score}/{max}, 목표 점수 미달(≥ {target}).",engineParseFallback:"엔진 응답을 구조화된 인사이트로 해석하지 못해 원문을 출력에 반영했습니다. 신뢰도는 0(증거 부족)으로 기록.",engineEmptyOutput:"(엔진이 내용을 반환하지 않음)",engineCallFailed:"엔진 호출 실패: {reason}",summaryStream:"인사이트 완료{cycle}. 명령 「{command}」이(가) {mode} 모드에서 {stepCount}단계 플로우({flow})를 실행해 {tasksDone}/{tasksTotal}단계를 {duration}에 완료했습니다. 신뢰도 {score}/{max} (목표 ≥ {target}). 기억을 {path}에 저장했습니다.",unitHour:"시간",unitMinute:"분",unitSecond:"초",unitMs:"밀리초",durationInstant:"즉시",modeDistill:"침전",modeEvolve:"진화",modeCausal:"인과",savedLine:"✓ 저장됨: {path}",saveFailedLine:"✗ 저장 실패: {reason}",memorySavedLine:"✓ stem memory 에 저장됨: {path}",memoryUpdatedLine:"✓ stem memory 업데이트됨: {path}",memoryAdviceHeading:"권장 사항",memoryScoreLine:"신뢰도 {score}/{max}: {summary}",memoryIndexHook:"{mode} 인사이트 · 신뢰도 {score}/{max}",memoryInsightFileLine:"인사이트 파일: {path}",dataSavedLine:"인사이트 {mode} 파일 저장됨: {path}",dataSaveFailedLine:"인사이트 데이터 저장 실패: {reason}",statusPending:"대기",statusActive:"진행 중",statusDone:"완료",reportTitle:"인사이트 리포트",reportCommand:"명령",reportMode:"모드",reportGenerated:"생성 시각",reportFile:"파일",reportSteps:"단계",reportRangeHeader:"점수 구간",reportMeaningHeader:"의미"}},oS=oG0;var sG0=/\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g;function sS($,Z){if(!Z)return $;return $.replace(sG0,(O,Y)=>{let f=Z[Y];if(f===void 0||f===null)return O;return String(f)})}function jN(){let $=process.env.STEM_BIZ_NAME?.trim();return $?$:"MortiseAI"}function vE($){return $.replaceAll("MortiseAI",jN())}var UN=["zh","en","ja","ko"];function aS($){return UN.includes($)}function WN($){if(!$)return null;let Z=$.toLowerCase();for(let O of UN)if(Z.startsWith(O))return O;return null}function aG0($){let Z=[],O=null;for(let Y=0;Y<$.length;Y++){let f=$[Y];if(f==="--lang"){let X=$[Y+1];if(X!==void 0&&!X.startsWith("-")){if(aS(X))O=X;Y++}continue}if(f.startsWith("--lang=")){let X=f.slice(7);if(aS(X))O=X;continue}Z.push(f)}return{value:O,cleaned:Z}}function bN($=process.argv.slice(2)){let Z=aG0($);if(Z.value)return{locale:Z.value,cleanedArgv:Z.cleaned};let O=(process.env.STEM_DEF_LANGUAGE||"").toLowerCase();for(let f of UN)if(O.startsWith(f))return{locale:f,cleanedArgv:Z.cleaned};let Y=WN(process.env.LC_ALL)??WN(process.env.LC_MESSAGES)??WN(process.env.LANG);if(Y)return{locale:Y,cleanedArgv:Z.cleaned};return{locale:"zh",cleanedArgv:Z.cleaned}}var tG0={zh:ME,en:rS,ja:iS,ko:oS},tS=ME,eS="zh";function $M($){eS=$,tS=tG0[$]??ME}function I5(){return eS}function ZM($){let Z=$.split("."),O=tS;for(let Y of Z){if(typeof O!=="object"||Array.isArray(O)||O===null)return;if(O=O[Y],O===void 0)return}return O}function w($,Z){let O=ZM($);if(typeof O!=="string")return console.warn(`[i18n] missing string key: ${$}`),$;return sS(O,{bizName:jN(),...Z})}function OM($,Z){let O=ZM("commandsCatalog");if(!O||typeof O!=="object"||Array.isArray(O))return;let Y=O[$];if(!Y||typeof Y!=="object"||Array.isArray(Y))return;let f=Y[Z];return typeof f==="string"?f:void 0}function HN($){return OM($,"label")??`/${$}`}function YM($){return OM($,"description")??""}O$();import{appendFileSync as eG0,existsSync as SM0,mkdirSync as $V0}from"node:fs";import{dirname as ZV0,join as fM}from"node:path";function OV0(){if(process.env.STEM_CMD_LOG)return!0;let $=(process.env.STEM_DEBUG??"").toLowerCase();return $==="1"||$==="2"||$==="true"||$==="yes"||$==="on"}function C($,Z,O="info"){if(O!=="error"&&!OV0())return;let Y=QM();try{$V0(ZV0(Y),{recursive:!0});let f=GV0(new Date),X=O.padEnd(5," "),J=Z===void 0?"":` ${JSON.stringify(Z)}`;if(eG0(Y,IG(`${f} · ${X} · [${$}]${J}
|
|
601
601
|
`),"utf8"),XM!==!0){XM=!0;for(let G of YV0)try{G()}catch{}}}catch{}}var XM=null,YV0=new Set;var fV0=/token|secret|passwd|password|credential|authorization|api[_-]?key/i,FN=new Set;function DG($){if(typeof $==="string"&&$.length>=6)FN.add($)}function IG($){if(!$||FN.size===0)return $;let Z=$;for(let O of FN){if(Z.includes(O))Z=Z.split(O).join("<redacted>");let Y=JSON.stringify(O).slice(1,-1);if(Y!==O&&Z.includes(Y))Z=Z.split(Y).join("<redacted>")}return Z}function NB($){if(Array.isArray($))return $.map((Z)=>NB(Z));if($&&typeof $==="object"){let Z={};for(let[O,Y]of Object.entries($))Z[O]=fV0.test(O)&&typeof Y==="string"?`<redacted len=${Y.length}>`:NB(Y);return Z}return $}async function _0($,Z,O){let Y=Date.now(),f={};for(let X of Object.keys(Z))f[X]=F8(NB(Z[X]));C(`${$}.invoke:in`,f);try{let X=await O();return C(`${$}.invoke:ok`,{ms:Date.now()-Y,result:XV0(X)}),X}catch(X){let J=X instanceof Error?X.stack??X.message:String(X);throw C(`${$}.invoke:err`,{ms:Date.now()-Y,error:F8(J,500)},"error"),X}}function XV0($,Z=300){if($===void 0)return"<undefined>";if($===null)return"<null>";if(typeof $!=="object")return F8($);let O=$,Y={};if("ok"in O)Y.ok=O.ok;if(O.is_error)Y.is_error=!0;if(O.ok===!1||O.is_error){let f=O.output??O.error;if(f!==void 0)Y.output=F8(f,Z);return Y}if(O.data!==void 0&&typeof O.data==="object"&&O.data!==null){let f=O.data;Y.dataKeys=Object.keys(f);let X=["content","diff","files","counts","matches","output"];for(let G of X)if(f[G]!==void 0){Y[`${G}Preview`]=F8(f[G],Z);break}let J=new Set(X);for(let[G,V]of Object.entries(f)){if(J.has(G))continue;if(typeof V==="number"||typeof V==="boolean"||V===null)Y[G]=V;else if(typeof V==="string"&&V.length<=32)Y[G]=V}return Y}if(O.data!==void 0)return Y.data=F8(O.data,Z),Y;if(O.output!==void 0)Y.output=F8(O.output,Z);return Y}function F8($,Z=200){if($===void 0)return"<undefined>";if($===null)return"<null>";let O;try{O=typeof $==="string"?$:JSON.stringify($)}catch{O=String($)}if(O.length<=Z)return O;return`${O.slice(0,Z)}...(+${O.length-Z})`}function QM(){if(process.env.STEM_CMD_LOG)return process.env.STEM_CMD_LOG;if(JM)return JM;return fM(hQ(fM(process.cwd(),"logs")),`${JV0()}_${QV0()}.txt`)}var JM=null;function pE(){return QM()}var EN=null;function JV0(){if(EN===null)EN=VV0(new Date);return EN}var wN=null;function QV0(){if(wN===null)wN=Math.random().toString(36).slice(2,10);return wN}var MQ=($)=>String($).padStart(2,"0");function GV0($){return`${$.getFullYear()}-${MQ($.getMonth()+1)}-${MQ($.getDate())}_${MQ($.getHours())}-${MQ($.getMinutes())}-${MQ($.getSeconds())}`}function VV0($){return`${$.getFullYear()}-${MQ($.getMonth()+1)}-${MQ($.getDate())}_${MQ($.getHours())}-${MQ($.getMinutes())}`}T1();var gE="workspace.additionalDirs";function yB(){let $=g0(gE);return Array.isArray($)?$.filter((Z)=>typeof Z==="string"&&Z.length>0):[]}function zM(){let $=yB();if($.length===0)return"";return`
|
|
602
602
|
|
|
603
603
|
Additional working directories (added via /add-dir — you may read and `+`modify files under these paths in addition to cwd):
|
|
@@ -855,7 +855,7 @@ ${J}`:""}`,j=await f({model:$.model,system:$.system,vcrFixture:$.vcrFixture,mess
|
|
|
855
855
|
`),sections:Y,variant:Z}}}function DT0(){return["# Charts","The TUI renders ```chart fenced blocks as terminal charts. When presenting proportions, trends, or ranked comparisons, prefer a chart over a markdown table. The fence body is one JSON object:",'- Share of whole: `{"type":"pie","title":"...","data":[{"label":"A","value":40},...]}` — '+"rendered as colored proportion bars with automatic percentages (no circular pie)",'- Bar (ranked comparison, horizontal; best for long labels): `{"type":"bar","title":"...","data":[{"label":"A","value":42},...]}`','- Column (vertical bars; best for few categories with short labels): `{"type":"column","title":"...","data":[{"label":"A","value":42},...]}`','- Line (trend): `{"type":"line","title":"...","series":[{"name":"S1","points":[1,2,3]}],"xLabels":["Jan","Feb","Mar"]}` (single series may use `"data":[1,2,3]` instead of `series`)',"Rules: at most 6 slices/series (extras are folded into an 'other' bucket); values must be plain finite numbers; keep labels short. Emit the complete fenced block in one piece."].join(`
|
|
856
856
|
`)}function IT0(){let $={zh:"Chinese (中文)",en:"English",ja:"Japanese (日本語)",ko:"Korean (한국어)"},Z=I5(),O=$[Z]??$.zh;return["# Response language",`The CLI locale is "${Z}". Respond in ${O} — all user-facing text (answers, summaries, `+`reports, questions) must be in ${O}, unless the user explicitly writes in or requests a different language. Code identifiers, protocol names, and command names stay in English as-is.`].join(`
|
|
857
857
|
`)}function NT0(){let $;try{$=TP()}catch{return null}if($.length===0)return null;C("systemPrompt.skills",{count:$.length,names:$.map((O)=>O.name)});let Z=["# Skills","Locally installed skills (SKILL.md under .mstem/def/skills, plus bundled skills; project-level shadows user-level and bundled on name clash).","When the user's request matches a skill's triggers (or names the skill explicitly), FIRST call the Skill tool with action='read', name='<skill>' (pass the user's task detail via `args`) to load its instructions, then follow them. Do NOT act on a matched skill from memory without reading it first.",""];for(let O of $)Z.push(HF(O));return Z.join(`
|
|
858
|
-
`)}function yT0(){return["# Turn discipline","Do not stop mid-task. Before ending your turn, check your last paragraph: if it is a plan, "+`a list of next steps, or a promise about work not yet done ("接下来我会…", "I'll now…", `+`"then I'll handle the remaining files"), DO that work now with tool calls instead of ending the turn. Working through many files or steps in a single turn is expected and encouraged.`,"A status report is not a stopping point. If you hit an obstacle (a tool is unavailable, a command "+"fails), state it briefly and immediately continue with the best available alternative — do not "+'end the turn to wait for the user to say "continue".',"End your turn only when the task is complete, or you are blocked on input that only the user can provide (a genuine decision, a credential, a destructive-action confirmation)."].join(`
|
|
858
|
+
`)}function yT0(){return["# Turn discipline","For any multi-step task (3+ distinct steps, multiple files to change, or work that spans several "+"tool calls), you MUST create a todo list with TodoWrite BEFORE starting the work — one item per "+"step. Keep it live as you go: mark each item in_progress when you start it and completed immediately when it is done; add newly discovered steps as new items. The harness watches this "+"list — if you end your turn while items are still pending or in_progress, it will automatically "+"resume you, so an accurate todo list is what lets long tasks run to completion unattended.","Do not stop mid-task. Before ending your turn, check your last paragraph: if it is a plan, "+`a list of next steps, or a promise about work not yet done ("接下来我会…", "I'll now…", `+`"then I'll handle the remaining files"), DO that work now with tool calls instead of ending the turn. Working through many files or steps in a single turn is expected and encouraged.`,"A status report is not a stopping point. If you hit an obstacle (a tool is unavailable, a command "+"fails), state it briefly and immediately continue with the best available alternative — do not "+'end the turn to wait for the user to say "continue".',"End your turn only when the task is complete, or you are blocked on input that only the user can provide (a genuine decision, a credential, a destructive-action confirmation). Before ending, bring the todo list to a truthful final state: everything done is marked completed; anything intentionally not done is removed or reworded with a brief explanation to the user."].join(`
|
|
859
859
|
`)}function _T0(){return["# Workflow execution",'When the user asks you to write, create, author, or design a workflow (e.g. "写个 Workflow …", '+'"build a workflow that …"), the deliverable is the RUN, not the script file. After authoring the '+"script you MUST invoke the Workflow tool (via `script` or `scriptPath`) to actually execute it, then "+"report the returned runId and end your turn — its completion is announced to you automatically.",'NEVER substitute a prose description of the expected outcome for an actual run: do not narrate what the run "would" output, which agent "would" fail, what a value "would" be, or that it "should" complete. '+"A narrated or predicted result does NOT satisfy the request — only a real run does.","The only time to stop at authoring (without running) is when the user explicitly says not to run it."].join(`
|
|
860
860
|
`)}var PT0=80000,qT0=24,KT0=12,TT0=80;function RT0(){for(let $=0;$<4;$++){let Z=crypto.randomUUID().replaceAll("-","").slice(0,4);if(!bZ(Z))return Z}return crypto.randomUUID().replaceAll("-","").slice(0,8)}function AT0($){let Y=(($.trim().split(/\s+/)[0]??"").split(/[。..,,、!!??::;;'"「」()()]/)[0]??"").toLowerCase().slice(0,KT0);return Y.length>0?Y:"fork"}function rT($,Z=PT0){let O=(G)=>{let V=[];for(let B of G){let j=V[V.length-1];if(j&&j.role===B.role)j.text=`${j.text}
|
|
861
861
|
|
|
@@ -1436,9 +1436,9 @@ ${$}`}]},f=await Promise.race([R$(Y),new Promise((X,J)=>setTimeout(()=>J(Error(`
|
|
|
1436
1436
|
`)}async function CX0($){if(!ZS0())return{ok:!1,is_error:!0,output:OS0};let Z=$??{};if(typeof Z.query!=="string"||Z.query.trim().length===0)return{ok:!1,is_error:!0,output:"`query` must be a non-empty string"};let O=Z.query.trim(),Y=typeof Z.max_results==="number"&&Z.max_results>=1?Math.min(Math.floor(Z.max_results),eC0):tC0,f=hX0();if("error"in f)return{ok:!1,is_error:!0,output:f.error};let X=Date.now(),J=[],G=null,V=!1,B=[];for(let W of f.providers)try{let b=await W.search(O,{maxResults:Y,signal:k2(AbortSignal.timeout($S0))});if(b.length>0){J=b,G=W.name;break}V=!0}catch(b){B.push(`${W.name}: ${b.message}`)}if(G===null&&!V)return{ok:!1,is_error:!0,output:`web_search failed on all providers — ${B.join(" · ")}`};let j=[`Query: ${O}`,`Provider: ${G??f.providers.map((W)=>W.name).join("→")}`,`Results: ${J.length}`,`Duration: ${Date.now()-X}ms`,""];if(J.length===0)return{ok:!0,output:[...j,"No results found. Try a broader or differently-worded query."].join(`
|
|
1437
1437
|
`)};return{ok:!0,output:[...j,YS0(J)].join(`
|
|
1438
1438
|
`)}}class SH extends I{onAttach(){super.onAttach()}onInstall(){super.onInstall()}onDetach(){super.onDetach()}handleStateEvent($){switch($.getMessage()){case qQ.TOOL_WEB_SEARCH_INVOKE:this.handleInvoke($.getModel(),$.getSender());break;default:super.handleStateEvent($);break}}async handleInvoke($,Z){let O=$?.payload??$??{},Y=await _0("MaiCliServerToolWebSearchLogic",{receiver:Z,input:O},()=>CX0(O)),f=new Ru;P0(f,Y),this.sendActionEvent(PQ.TOOL_WEB_SEARCH_RESULT,f,Z)}}SH=Q([_(!0,PQ),T(!0,qQ),y()],SH);class KQ extends q{}KQ.TOOL_WORKFLOW_RESULT="tool_workflow_result",Q([N(!0,"tool_workflow_result","MaiCliServerToolWorkflowLogicActionModel"),z("design:type",Object)],KQ,"TOOL_WORKFLOW_RESULT",void 0),KQ=Q([P()],KQ);class xu extends K{ok;data;error}class TQ extends A{}TQ.TOOL_WORKFLOW_INVOKE="tool_workflow_invoke",Q([D(!0,!0,"tool_workflow_invoke"),z("design:type",Object)],TQ,"TOOL_WORKFLOW_INVOKE",void 0),TQ=Q([R()],TQ);class MH extends I{onAttach(){super.onAttach()}onInstall(){super.onInstall()}onDetach(){super.onDetach()}handleStateEvent($){switch($.getMessage()){case TQ.TOOL_WORKFLOW_INVOKE:this.handleInvoke($.getModel(),$.getSender());break;default:super.handleStateEvent($);break}}async handleInvoke($,Z){let O=$?.payload??$??{},Y=await _0("MaiCliServerToolWorkflowLogic",{receiver:Z,input:O},()=>_4(O)),f=new xu;P0(f,Y),this.sendActionEvent(KQ.TOOL_WORKFLOW_RESULT,f,Z)}}MH=Q([_(!0,KQ),T(!0,TQ),y()],MH);var SX0={MaiCliServerToolAdvisorLogic:jb,MaiCliServerToolAgentLogic:Ub,MaiCliServerToolAskUserQuestionLogic:bb,MaiCliServerToolAskUserTextLogic:Hb,MaiCliServerToolBashLogic:Eb,MaiCliServerToolBriefLogic:wb,MaiCliServerToolConfigLogic:Fb,MaiCliServerToolCtxInspectLogic:Db,MaiCliServerToolDiscoverSkillsLogic:Ib,MaiCliServerToolEnterPlanModeLogic:Nb,MaiCliServerToolEnterWorktreeLogic:yb,MaiCliServerToolExitPlanModeLogic:_b,MaiCliServerToolExitWorktreeLogic:qb,MaiCliServerToolFileEditLogic:Kb,MaiCliServerToolFileReadLogic:Tb,MaiCliServerToolFileWriteLogic:Rb,MaiCliServerToolGlobLogic:Ab,MaiCliServerToolGrepLogic:kb,MaiCliServerToolListMcpResourcesLogic:xb,MaiCliServerToolListPeersLogic:Lb,MaiCliServerToolLoopCancelLogic:ub,MaiCliServerToolLspLogic:hb,MaiCliServerToolMcpAuthLogic:Cb,MaiCliServerToolMcpLogic:Sb,MaiCliServerToolMonitorLogic:Mb,MaiCliServerToolNotebookEditLogic:vb,MaiCliServerToolOverflowTestLogic:pb,MaiCliServerToolPowerShellLogic:gb,MaiCliServerToolPushNotificationLogic:mb,MaiCliServerToolReadMcpResourceLogic:cb,MaiCliServerToolRemoteTriggerLogic:lb,MaiCliServerToolReplLogic:db,MaiCliServerToolReviewArtifactLogic:nb,MaiCliServerToolScheduleCronLogic:rb,MaiCliServerToolSendMessageLogic:ib,MaiCliServerToolSendUserFileLogic:ob,MaiCliServerToolSkillLogic:sb,MaiCliServerToolSleepLogic:ab,MaiCliServerToolSnipLogic:tb,MaiCliServerToolSubscribePrLogic:eb,MaiCliServerToolSuggestBackgroundPrLogic:$H,MaiCliServerToolSyntheticOutputLogic:ZH,MaiCliServerToolTaskCreateLogic:OH,MaiCliServerToolTaskGetLogic:YH,MaiCliServerToolTaskListLogic:fH,MaiCliServerToolTaskOutputLogic:XH,MaiCliServerToolTaskStopLogic:JH,MaiCliServerToolTaskUpdateLogic:QH,MaiCliServerToolTeamCreateLogic:GH,MaiCliServerToolTeamDeleteLogic:VH,MaiCliServerToolTerminalCaptureLogic:BH,MaiCliServerToolTodoWriteLogic:zH,MaiCliServerToolToolSearchLogic:jH,MaiCliServerToolTungstenLogic:WH,MaiCliServerToolVerifyPlanExecutionLogic:UH,MaiCliServerToolWebBrowserLogic:bH,MaiCliServerToolWebFetchLogic:CH,MaiCliServerToolWebSearchLogic:SH,MaiCliServerToolWorkflowLogic:MH},MX0={MaiCliServerToolAdvisorLogicActionKeys:EX,MaiCliServerToolAgentLogicActionKeys:FX,MaiCliServerToolAskUserQuestionLogicActionKeys:IX,MaiCliServerToolAskUserTextLogicActionKeys:yX,MaiCliServerToolBashLogicActionKeys:_X,MaiCliServerToolBriefLogicActionKeys:qX,MaiCliServerToolConfigLogicActionKeys:TX,MaiCliServerToolCtxInspectLogicActionKeys:AX,MaiCliServerToolDiscoverSkillsLogicActionKeys:xX,MaiCliServerToolEnterPlanModeLogicActionKeys:uX,MaiCliServerToolEnterWorktreeLogicActionKeys:CX,MaiCliServerToolExitPlanModeLogicActionKeys:MX,MaiCliServerToolExitWorktreeLogicActionKeys:pX,MaiCliServerToolFileEditLogicActionKeys:mX,MaiCliServerToolFileReadLogicActionKeys:lX,MaiCliServerToolFileWriteLogicActionKeys:nX,MaiCliServerToolGlobLogicActionKeys:iX,MaiCliServerToolGrepLogicActionKeys:sX,MaiCliServerToolListMcpResourcesLogicActionKeys:tX,MaiCliServerToolListPeersLogicActionKeys:$J,MaiCliServerToolLoopCancelLogicActionKeys:OJ,MaiCliServerToolLspLogicActionKeys:fJ,MaiCliServerToolMcpAuthLogicActionKeys:JJ,MaiCliServerToolMcpLogicActionKeys:GJ,MaiCliServerToolMonitorLogicActionKeys:BJ,MaiCliServerToolNotebookEditLogicActionKeys:jJ,MaiCliServerToolOverflowTestLogicActionKeys:UJ,MaiCliServerToolPowerShellLogicActionKeys:HJ,MaiCliServerToolPushNotificationLogicActionKeys:wJ,MaiCliServerToolReadMcpResourceLogicActionKeys:DJ,MaiCliServerToolRemoteTriggerLogicActionKeys:NJ,MaiCliServerToolReplLogicActionKeys:_J,MaiCliServerToolReviewArtifactLogicActionKeys:qJ,MaiCliServerToolScheduleCronLogicActionKeys:TJ,MaiCliServerToolSendMessageLogicActionKeys:AJ,MaiCliServerToolSendUserFileLogicActionKeys:xJ,MaiCliServerToolSkillLogicActionKeys:uJ,MaiCliServerToolSleepLogicActionKeys:CJ,MaiCliServerToolSnipLogicActionKeys:MJ,MaiCliServerToolSubscribePrLogicActionKeys:pJ,MaiCliServerToolSuggestBackgroundPrLogicActionKeys:mJ,MaiCliServerToolSyntheticOutputLogicActionKeys:lJ,MaiCliServerToolTaskCreateLogicActionKeys:nJ,MaiCliServerToolTaskGetLogicActionKeys:iJ,MaiCliServerToolTaskListLogicActionKeys:sJ,MaiCliServerToolTaskOutputLogicActionKeys:tJ,MaiCliServerToolTaskStopLogicActionKeys:$Q,MaiCliServerToolTaskUpdateLogicActionKeys:OQ,MaiCliServerToolTeamCreateLogicActionKeys:fQ,MaiCliServerToolTeamDeleteLogicActionKeys:JQ,MaiCliServerToolTerminalCaptureLogicActionKeys:GQ,MaiCliServerToolTodoWriteLogicActionKeys:BQ,MaiCliServerToolToolSearchLogicActionKeys:jQ,MaiCliServerToolTungstenLogicActionKeys:UQ,MaiCliServerToolVerifyPlanExecutionLogicActionKeys:HQ,MaiCliServerToolWebBrowserLogicActionKeys:wQ,MaiCliServerToolWebFetchLogicActionKeys:DQ,MaiCliServerToolWebSearchLogicActionKeys:PQ,MaiCliServerToolWorkflowLogicActionKeys:KQ},vX0={MaiCliServerToolAdvisorLogicStateKeys:wX,MaiCliServerToolAgentLogicStateKeys:DX,MaiCliServerToolAskUserQuestionLogicStateKeys:NX,MaiCliServerToolBashLogicStateKeys:PX,MaiCliServerToolBriefLogicStateKeys:KX,MaiCliServerToolConfigLogicStateKeys:RX,MaiCliServerToolCtxInspectLogicStateKeys:kX,MaiCliServerToolDiscoverSkillsLogicStateKeys:LX,MaiCliServerToolEnterPlanModeLogicStateKeys:hX,MaiCliServerToolEnterWorktreeLogicStateKeys:SX,MaiCliServerToolExitPlanModeLogicStateKeys:vX,MaiCliServerToolExitWorktreeLogicStateKeys:gX,MaiCliServerToolFileEditLogicStateKeys:cX,MaiCliServerToolFileReadLogicStateKeys:dX,MaiCliServerToolFileWriteLogicStateKeys:rX,MaiCliServerToolGlobLogicStateKeys:oX,MaiCliServerToolGrepLogicStateKeys:aX,MaiCliServerToolListMcpResourcesLogicStateKeys:eX,MaiCliServerToolListPeersLogicStateKeys:ZJ,MaiCliServerToolLoopCancelLogicStateKeys:YJ,MaiCliServerToolLspLogicStateKeys:XJ,MaiCliServerToolMcpAuthLogicStateKeys:QJ,MaiCliServerToolMcpLogicStateKeys:VJ,MaiCliServerToolMonitorLogicStateKeys:zJ,MaiCliServerToolNotebookEditLogicStateKeys:WJ,MaiCliServerToolOverflowTestLogicStateKeys:bJ,MaiCliServerToolPowerShellLogicStateKeys:EJ,MaiCliServerToolPushNotificationLogicStateKeys:FJ,MaiCliServerToolReadMcpResourceLogicStateKeys:IJ,MaiCliServerToolRemoteTriggerLogicStateKeys:yJ,MaiCliServerToolReplLogicStateKeys:PJ,MaiCliServerToolReviewArtifactLogicStateKeys:KJ,MaiCliServerToolScheduleCronLogicStateKeys:RJ,MaiCliServerToolSendMessageLogicStateKeys:kJ,MaiCliServerToolSendUserFileLogicStateKeys:LJ,MaiCliServerToolSkillLogicStateKeys:hJ,MaiCliServerToolSleepLogicStateKeys:SJ,MaiCliServerToolSnipLogicStateKeys:vJ,MaiCliServerToolSubscribePrLogicStateKeys:gJ,MaiCliServerToolSuggestBackgroundPrLogicStateKeys:cJ,MaiCliServerToolSyntheticOutputLogicStateKeys:dJ,MaiCliServerToolTaskCreateLogicStateKeys:rJ,MaiCliServerToolTaskGetLogicStateKeys:oJ,MaiCliServerToolTaskListLogicStateKeys:aJ,MaiCliServerToolTaskOutputLogicStateKeys:eJ,MaiCliServerToolTaskStopLogicStateKeys:ZQ,MaiCliServerToolTaskUpdateLogicStateKeys:YQ,MaiCliServerToolTeamCreateLogicStateKeys:XQ,MaiCliServerToolTeamDeleteLogicStateKeys:QQ,MaiCliServerToolTerminalCaptureLogicStateKeys:VQ,MaiCliServerToolTodoWriteLogicStateKeys:zQ,MaiCliServerToolToolSearchLogicStateKeys:WQ,MaiCliServerToolTungstenLogicStateKeys:bQ,MaiCliServerToolVerifyPlanExecutionLogicStateKeys:EQ,MaiCliServerToolWebBrowserLogicStateKeys:FQ,MaiCliServerToolWebFetchLogicStateKeys:IQ,MaiCliServerToolWebSearchLogicStateKeys:qQ,MaiCliServerToolWorkflowLogicStateKeys:TQ};class RQ extends q{}RQ.SHELL_DOCTOR_SCREEN_RESULT="shell_doctor_screen_result",Q([N(!0,"shell_doctor_screen_result","MscCliShellDoctorScreenLogicActionModel"),z("design:type",Object)],RQ,"SHELL_DOCTOR_SCREEN_RESULT",void 0),RQ=Q([P()],RQ);class Lu extends K{ok;data;error}class AQ extends A{}AQ.SHELL_DOCTOR_SCREEN_INVOKE="shell_doctor_screen_invoke",Q([D(!0,!0,"shell_doctor_screen_invoke"),z("design:type",Object)],AQ,"SHELL_DOCTOR_SCREEN_INVOKE",void 0),AQ=Q([R()],AQ);class vH extends I{onAttach(){super.onAttach()}onInstall(){super.onInstall()}onDetach(){super.onDetach()}handleStateEvent($){switch($.getMessage()){case AQ.SHELL_DOCTOR_SCREEN_INVOKE:this.handleInvoke($.getModel(),$.getSender());break;default:super.handleStateEvent($);break}}handleInvoke($,Z){let O=new Lu;O.ok=!0,this.sendActionEvent(RQ.SHELL_DOCTOR_SCREEN_RESULT,O,Z)}}vH=Q([_(!0,RQ),T(!0,AQ),y()],vH);class kQ extends q{}kQ.SHELL_RESUME_SCREEN_RESULT="shell_resume_screen_result",Q([N(!0,"shell_resume_screen_result","MscCliShellResumeScreenLogicActionModel"),z("design:type",Object)],kQ,"SHELL_RESUME_SCREEN_RESULT",void 0),kQ=Q([P()],kQ);class uu extends K{ok;data;error}class xQ extends A{}xQ.SHELL_RESUME_SCREEN_INVOKE="shell_resume_screen_invoke",Q([D(!0,!0,"shell_resume_screen_invoke"),z("design:type",Object)],xQ,"SHELL_RESUME_SCREEN_INVOKE",void 0),xQ=Q([R()],xQ);class pH extends I{onAttach(){super.onAttach()}onInstall(){super.onInstall()}onDetach(){super.onDetach()}handleStateEvent($){switch($.getMessage()){case xQ.SHELL_RESUME_SCREEN_INVOKE:this.handleInvoke($.getModel(),$.getSender());break;default:super.handleStateEvent($);break}}handleInvoke($,Z){let O=new uu;O.ok=!0,this.sendActionEvent(kQ.SHELL_RESUME_SCREEN_RESULT,O,Z)}}pH=Q([_(!0,kQ),T(!0,xQ),y()],pH);class hu extends E${handleActionEvent($){super.handleActionEvent($)}}class Cu extends E${handleActionEvent($){switch($.getSender()){default:super.handleActionEvent($);break}}}class Su extends E${handleActionEvent($){switch($.getSender()){default:super.handleActionEvent($);break}}}class Mu extends E${handleActionEvent($){switch($.getSender()){default:super.handleActionEvent($);break}}}class vu extends E${handleActionEvent($){switch($.getSender()){default:super.handleActionEvent($);break}}}class pu extends E${handleActionEvent($){switch($.getSender()){default:super.handleActionEvent($);break}}}class gu extends E${handleActionEvent($){switch($.getSender()){default:super.handleActionEvent($);break}}}class mu extends E${handleActionEvent($){switch($.getSender()){default:super.handleActionEvent($);break}}}class cu extends E${handleActionEvent($){switch($.getSender()){default:super.handleActionEvent($);break}}}class lu extends E${handleActionEvent($){switch($.getSender()){default:super.handleActionEvent($);break}}}class du{_dsl={mai_cli_server_dsl:lS,cli_doctor_screen_dsl:dS,cli_resume_screen_dsl:nS};_view={};_logic={...v70,...L60,...SX0,...Z70,...n60,...d70,...M60,...$O0,...U60,MscCliShellDoctorScreenLogic:vH,MscCliShellResumeScreenLogic:pH};_workflow={MaiCliServerRouterWorkflow:hu,MaiCliServerCoreWorkflow:Cu,MaiCliServerToolWorkflow:Su,MaiCliServerServiceWorkflow:Mu,MaiCliServerCommandWorkflow:vu,MaiCliServerRemoteWorkflow:pu,MaiCliServerSwarmWorkflow:gu,MaiCliServerExtensionWorkflow:mu,CliDoctorScreenWorkflow:cu,CliResumeScreenWorkflow:lu};_actionKeys={...p70,...u60,...MX0,...O70,...r60,...n70,...v60,...ZO0,...b60,MscCliShellDoctorScreenLogicActionKeys:RQ,MscCliShellResumeScreenLogicActionKeys:kQ};_stateKeys={...g70,...h60,...vX0,...Y70,...i60,...r70,...p60,...OO0,...H60,MscCliShellDoctorScreenLogicStateKeys:AQ,MscCliShellResumeScreenLogicStateKeys:xQ};_sidecar={};appId(){return"stem"}view($){return this._view[$]}logic($){return this._logic[$]}workflow($){return this._workflow[$]}dsl($){return this._dsl[$]}actionKeys($){return this._actionKeys[$]}stateKeys($){return this._stateKeys[$]}sidecar($){return this._sidecar[$]}}var nu=process.env.NEXT_PUBLIC_MSC_LOG_OPEN==="true";function fS0($){if($===null||$===void 0)return null;if(typeof $==="string")return $;try{return JSON.stringify($)}catch{return null}}function ru($){if($==="???")console.warn("[MscLog] tag is missing, caller stack:",Error().stack)}function iu($,Z,O){let Y=fS0(O);if(Y!==null)return`${$} ${Z}
|
|
1439
|
-
${Y}`;return`${$} ${Z}`}function XS0($,Z,O="???"){if(nu)ru(O),console.log(iu(`[MscInfo | ${O}]`,$,Z))}function JS0($,Z,O="???"){if(nu)ru(O),console.warn(iu(`[MscWarn | ${O}]`,$,Z))}function QS0($,Z,O="???"){if(nu)ru(O),console.error(iu(`[MscError | ${O}]`,$,Z))}var rD={infoLog:XS0,warnLog:JS0,errorLog:QS0};function GS0($,Z,O){rD.infoLog(Z,O,$)}function VS0($,Z,O){rD.warnLog(Z,O,$)}function BS0($,Z,O){rD.errorLog(Z,O,$)}var c4={trackInfo:GS0,trackWarn:VS0,trackError:BS0};class ou{dsl;debug;mscInstance;requestCount=0;constructor($,Z){if(this.debug=Z,!p1.isRegistryMscEnv())p1.registryMscEnv(new du);this.handleContainerDsl($)}handleContainerDsl($){let Z=p1.MscEnv().dsl($);if(Z)Z(),this.dsl=$}handlerCreateContainer($){if(!this.mscInstance&&this.dsl)this.mscInstance=new HS(this.debug).dls(this.dsl).observer({handleActionEvent(Z){$.onActionEvent(Z)},handleStateEvent(Z){$.onStateEvent(Z)},handleLifecycleEvent(Z){$.onLifecycleEvent(Z)},handleErrorEvent(Z){$.onErrorEvent(Z)}}).build(),this.mscInstance.install()}handleDestroyContainer(){try{if(this.mscInstance)this.mscInstance.uninstall(),this.mscInstance=null}catch($){c4.trackError("MscCliContainer",`handleDestroyContainer error: ${$}`)}}handleContainerStateEvent($){if(this.requestCount++,this.requestCount%1000===0){let Z=process.memoryUsage();c4.trackInfo("MscCliContainer",`[MemProbe] dsl=${this.dsl} req#${this.requestCount} heapUsed=${(Z.heapUsed/1024/1024).toFixed(1)}MB heapTotal=${(Z.heapTotal/1024/1024).toFixed(1)}MB external=${(Z.external/1024/1024).toFixed(1)}MB`)}if(this.mscInstance)this.mscInstance.sendState($)}}class su{listeners=new Set;addListener($){this.listeners.add($)}removeListener($){this.listeners.delete($)}onActionEvent($){this.listeners.forEach((Z)=>Z.onActionEvent($))}onStateEvent($){this.listeners.forEach((Z)=>Z.onStateEvent($))}onLifecycleEvent($){this.listeners.forEach((Z)=>Z.onLifecycleEvent($))}onErrorEvent($){this.listeners.forEach((Z)=>Z.onErrorEvent($))}}var zS0=600000;class T7{static _instanceKey=Symbol.for("MscCliManager");static getInstance(){let $=globalThis;if(!$[T7._instanceKey])$[T7._instanceKey]=new T7;return $[T7._instanceKey]}constructor(){}entries=new Map;reuseCount=new Map;getServerContainer($){let Z=this.entries.get($);if(Z){let O=(this.reuseCount.get($)??0)+1;if(this.reuseCount.set($,O),O%1000===0)c4.trackInfo("MscCliManager",`MscCliContainer Reuse #${O} for dsl: ${$}, tag: ${Z.tag}`)}else{let O=Date.now().toString();c4.trackInfo("MscCliManager",`MscCliContainer Create for dsl: ${$}, tag: ${O}`);let Y=new ou($),f=new su,X=new Map,J={onActionEvent(G){let V=X.get(G.getReceiver());if(V){V.timing.t3=Date.now(),clearTimeout(V.timer),X.delete(G.getReceiver());let B=G.getModel();V.resolve({receiver:G.getReceiver(),model:B,tag:O,timing:V.timing})}},onErrorEvent(G){let V=X.get(G.getReceiver());if(V)V.timing.t3=Date.now(),clearTimeout(V.timer),X.delete(G.getReceiver()),V.reject({receiver:G.getReceiver(),error:G.getMessage(),tag:O,timing:V.timing})},onLifecycleEvent(G){},onStateEvent(G){}};f.addListener(J),Y.handlerCreateContainer(f),Z={container:Y,listener:f,pendingRequests:X,tag:O},this.entries.set($,Z)}return Z}warmupContainer($){this.getServerContainer($)}handleContainerEvent($,Z,O=zS0){let Y=Date.now(),{container:f,pendingRequests:X}=this.getServerContainer($),J=Date.now();if(X.has(Z.sender))return Promise.reject({error:`request ${Z.sender} is already in progress`});return new Promise((G,V)=>{let B=setTimeout(()=>{X.delete(Z.sender),V({error:`request ${Z.sender} timed out after ${O}ms`})},O),j={t0:Y,t1:J,t2:0,t3:0},W=Date.now();j.t2=W,X.set(Z.sender,{resolve:G,reject:V,timer:B,timing:j}),f.handleContainerStateEvent(Z)})}bumpRequestTimer($,Z,O){let Y=this.entries.get($);if(!Y)return!1;let f=Y.pendingRequests.get(Z);if(!f)return!1;return clearTimeout(f.timer),f.timer=setTimeout(()=>{Y.pendingRequests.delete(Z),f.reject({error:`request ${Z} idle for ${O}ms`})},O),!0}handleContainerDestroy($){let Z=this.entries.get($);if(Z){for(let[,O]of Z.pendingRequests)clearTimeout(O.timer),O.reject({error:`container destroyed for dsl: ${$}`});Z.pendingRequests.clear(),Z.container.handleDestroyContainer(),this.entries.delete($)}}}O$();O$();import{mkdirSync as jS0}from"node:fs";import{join as pX0}from"node:path";function gX0($=process.env.CALLER_DIR||process.cwd()){if(!fE())return;let Z=[a1($),pX0(w1(),"projects"),hQ(pX0($,"logs")),...Object.keys(MN).map((O)=>pN(O,$))];for(let O of Z)try{jS0(O,{recursive:!0})}catch{}}var iD="mai_cli_server_dsl";function WS0(){process.stdout.write(JSON.stringify({ok:!0,app:"stem",mode:"daemon",dsl:iD,version:{VERSION:"0.0.
|
|
1439
|
+
${Y}`;return`${$} ${Z}`}function XS0($,Z,O="???"){if(nu)ru(O),console.log(iu(`[MscInfo | ${O}]`,$,Z))}function JS0($,Z,O="???"){if(nu)ru(O),console.warn(iu(`[MscWarn | ${O}]`,$,Z))}function QS0($,Z,O="???"){if(nu)ru(O),console.error(iu(`[MscError | ${O}]`,$,Z))}var rD={infoLog:XS0,warnLog:JS0,errorLog:QS0};function GS0($,Z,O){rD.infoLog(Z,O,$)}function VS0($,Z,O){rD.warnLog(Z,O,$)}function BS0($,Z,O){rD.errorLog(Z,O,$)}var c4={trackInfo:GS0,trackWarn:VS0,trackError:BS0};class ou{dsl;debug;mscInstance;requestCount=0;constructor($,Z){if(this.debug=Z,!p1.isRegistryMscEnv())p1.registryMscEnv(new du);this.handleContainerDsl($)}handleContainerDsl($){let Z=p1.MscEnv().dsl($);if(Z)Z(),this.dsl=$}handlerCreateContainer($){if(!this.mscInstance&&this.dsl)this.mscInstance=new HS(this.debug).dls(this.dsl).observer({handleActionEvent(Z){$.onActionEvent(Z)},handleStateEvent(Z){$.onStateEvent(Z)},handleLifecycleEvent(Z){$.onLifecycleEvent(Z)},handleErrorEvent(Z){$.onErrorEvent(Z)}}).build(),this.mscInstance.install()}handleDestroyContainer(){try{if(this.mscInstance)this.mscInstance.uninstall(),this.mscInstance=null}catch($){c4.trackError("MscCliContainer",`handleDestroyContainer error: ${$}`)}}handleContainerStateEvent($){if(this.requestCount++,this.requestCount%1000===0){let Z=process.memoryUsage();c4.trackInfo("MscCliContainer",`[MemProbe] dsl=${this.dsl} req#${this.requestCount} heapUsed=${(Z.heapUsed/1024/1024).toFixed(1)}MB heapTotal=${(Z.heapTotal/1024/1024).toFixed(1)}MB external=${(Z.external/1024/1024).toFixed(1)}MB`)}if(this.mscInstance)this.mscInstance.sendState($)}}class su{listeners=new Set;addListener($){this.listeners.add($)}removeListener($){this.listeners.delete($)}onActionEvent($){this.listeners.forEach((Z)=>Z.onActionEvent($))}onStateEvent($){this.listeners.forEach((Z)=>Z.onStateEvent($))}onLifecycleEvent($){this.listeners.forEach((Z)=>Z.onLifecycleEvent($))}onErrorEvent($){this.listeners.forEach((Z)=>Z.onErrorEvent($))}}var zS0=600000;class T7{static _instanceKey=Symbol.for("MscCliManager");static getInstance(){let $=globalThis;if(!$[T7._instanceKey])$[T7._instanceKey]=new T7;return $[T7._instanceKey]}constructor(){}entries=new Map;reuseCount=new Map;getServerContainer($){let Z=this.entries.get($);if(Z){let O=(this.reuseCount.get($)??0)+1;if(this.reuseCount.set($,O),O%1000===0)c4.trackInfo("MscCliManager",`MscCliContainer Reuse #${O} for dsl: ${$}, tag: ${Z.tag}`)}else{let O=Date.now().toString();c4.trackInfo("MscCliManager",`MscCliContainer Create for dsl: ${$}, tag: ${O}`);let Y=new ou($),f=new su,X=new Map,J={onActionEvent(G){let V=X.get(G.getReceiver());if(V){V.timing.t3=Date.now(),clearTimeout(V.timer),X.delete(G.getReceiver());let B=G.getModel();V.resolve({receiver:G.getReceiver(),model:B,tag:O,timing:V.timing})}},onErrorEvent(G){let V=X.get(G.getReceiver());if(V)V.timing.t3=Date.now(),clearTimeout(V.timer),X.delete(G.getReceiver()),V.reject({receiver:G.getReceiver(),error:G.getMessage(),tag:O,timing:V.timing})},onLifecycleEvent(G){},onStateEvent(G){}};f.addListener(J),Y.handlerCreateContainer(f),Z={container:Y,listener:f,pendingRequests:X,tag:O},this.entries.set($,Z)}return Z}warmupContainer($){this.getServerContainer($)}handleContainerEvent($,Z,O=zS0){let Y=Date.now(),{container:f,pendingRequests:X}=this.getServerContainer($),J=Date.now();if(X.has(Z.sender))return Promise.reject({error:`request ${Z.sender} is already in progress`});return new Promise((G,V)=>{let B=setTimeout(()=>{X.delete(Z.sender),V({error:`request ${Z.sender} timed out after ${O}ms`})},O),j={t0:Y,t1:J,t2:0,t3:0},W=Date.now();j.t2=W,X.set(Z.sender,{resolve:G,reject:V,timer:B,timing:j}),f.handleContainerStateEvent(Z)})}bumpRequestTimer($,Z,O){let Y=this.entries.get($);if(!Y)return!1;let f=Y.pendingRequests.get(Z);if(!f)return!1;return clearTimeout(f.timer),f.timer=setTimeout(()=>{Y.pendingRequests.delete(Z),f.reject({error:`request ${Z} idle for ${O}ms`})},O),!0}handleContainerDestroy($){let Z=this.entries.get($);if(Z){for(let[,O]of Z.pendingRequests)clearTimeout(O.timer),O.reject({error:`container destroyed for dsl: ${$}`});Z.pendingRequests.clear(),Z.container.handleDestroyContainer(),this.entries.delete($)}}}O$();O$();import{mkdirSync as jS0}from"node:fs";import{join as pX0}from"node:path";function gX0($=process.env.CALLER_DIR||process.cwd()){if(!fE())return;let Z=[a1($),pX0(w1(),"projects"),hQ(pX0($,"logs")),...Object.keys(MN).map((O)=>pN(O,$))];for(let O of Z)try{jS0(O,{recursive:!0})}catch{}}var iD="mai_cli_server_dsl";function WS0(){process.stdout.write(JSON.stringify({ok:!0,app:"stem",mode:"daemon",dsl:iD,version:{VERSION:"0.0.4",PACKAGE_URL:"@mortiseai/stem",NATIVE_PACKAGE_URL:"@mortiseai/stem",BUILD_TIME:"2026-07-28T13:26:13.277Z",FEEDBACK_CHANNEL:"npm",MSC_ENGINE_VERSION:"0.0.3"}.VERSION},null,2)+`
|
|
1440
1440
|
`)}function US0(){let $=(Z)=>{try{T7.getInstance().handleContainerDestroy(iD)}finally{process.stderr.write(w("daemon.stopped",{signal:Z})+`
|
|
1441
1441
|
`),process.exit(Z==="SIGTERM"?143:130)}};process.on("SIGTERM",()=>$("SIGTERM")),process.on("SIGINT",()=>$("SIGINT"))}function bS0($=process.argv.slice(2)){let{locale:Z,cleanedArgv:O}=bN($);$M(Z);let{cleanedArgv:Y}=YE(O);if(process.env.STEM_TENANT_INVALID!==void 0)process.stderr.write((process.env.STEM_TENANT_INVALID_NPM?w("errors.invalidTenantNpmForm"):w("errors.invalidTenant",{code:process.env.STEM_TENANT_INVALID,rule:String(VI)}))+`
|
|
1442
1442
|
`),process.exit(1);$=Y;let f=$[0]??"run";if(f==="status"){WS0();return}if(f!=="run")process.stderr.write(w("daemon.unknownCommand",{command:f})+`
|
|
1443
|
-
`),process.exit(1);gX0(),T7.getInstance().warmupContainer(iD),US0(),process.stderr.write(w("daemon.running",{dsl:iD,version:{VERSION:"0.0.
|
|
1443
|
+
`),process.exit(1);gX0(),T7.getInstance().warmupContainer(iD),US0(),process.stderr.write(w("daemon.running",{dsl:iD,version:{VERSION:"0.0.4",PACKAGE_URL:"@mortiseai/stem",NATIVE_PACKAGE_URL:"@mortiseai/stem",BUILD_TIME:"2026-07-28T13:26:13.277Z",FEEDBACK_CHANNEL:"npm",MSC_ENGINE_VERSION:"0.0.3"}.VERSION})+`
|
|
1444
1444
|
`),setInterval(()=>{},1073741824)}bS0();export{bS0 as startDaemon};
|
package/dist/mcp.mjs
CHANGED
|
@@ -599,7 +599,7 @@ prompt 또는 slash command 를 지정한 간격으로 반복 실행합니다.
|
|
|
599
599
|
|
|
600
600
|
**철칙 2 — 중지는 LoopCancel 만 인정**: 작업이 완료되었거나 사용자가 중지를 요청했다고 판단되면, 루프를 멈출 수 있는 **유일한** 방법은 \`LoopCancel\` 도구를 호출하는 것입니다 — 반드시 호출하세요. "루프를 중지했습니다", "자동으로 닫겠습니다" 같은 **어떠한** 형태의 중지 선언 텍스트도, scheduler 는 응답을 읽지 않으므로 **완전히 무효**입니다. 도구를 호출하지 않고 텍스트로만 선언하면: (1) 다음 cron tick 에서 동일한 prompt 가 다시 도착합니다; (2) Repl 이 "중지를 선언했지만 도구를 호출하지 않은" 모순 상태를 감지하여 대신 LoopCancel 을 자동 호출하고, 당신의 응답을 반례로 진단 로그에 기록합니다. 멈추려면 도구를 호출하고, 호출하지 않으려면 멈췄다고 말하지 마세요.
|
|
601
601
|
|
|
602
|
-
**철칙 3 — 단일 채널 + loop 메타 commentary 금지**: 위의 prompt 를 **사용자가 일반 프롬프트에 방금 입력한 것**으로 취급하고, 평소의 대화 스타일로 자연스럽게 응답하세요 —— 도입부, 다단락 추론, markdown, 이모지, 되묻기 모두 prompt 에 어울리면 사용 가능합니다. **echo bot 처럼 동작하지 마세요**. 구조적 제약은 두 가지뿐: **(a) 단일 채널** —— 순수 assistant text 로 출력하거나 \`SendUserMessage\` 도구로 보내거나 둘 중 하나, **두 방식을 섞지 마세요** (섞으면 같은 내용이 UI 에 2~4번 나타나 모델이 혼잣말하는 것처럼 보입니다). **(b) loop bookkeeping 금지** —— "현재 N회차", "X회 실행됨", "정지 조건 충족", "다음 회차로 진입" 같은 메타 commentary 를 추가하지 마세요. loop 메커니즘은 prompt 입장에서 보이지 않습니다. 평범한 사용자가 입력하는 것처럼 응답하세요. 중지가 필요하면 철칙 2 에 따라 LoopCancel 만 호출하고 평소 응답은 그대로 두세요. **"loop 가 중지되었습니다" 같은 추가 문장은 쓰지 마세요**.`,closeConditionHint:'[시스템 강제 제약 — 자동 종료 조건] 사용자가 본 loop 에 자동 종료 조건을 설정했습니다: "{condition}". 이번 응답 완료 후, **조건이 현재 충족되었는지 판단**하세요. 충족되었다면 loop 를 실제로 중지하려면 `LoopCancel` 도구 호출이 **필수**입니다 — "조건을 충족했습니다", "loop 를 중지합니다" 같은 텍스트만 출력하는 것은 **완전히 무효**입니다 (scheduler 는 응답을 읽지 않고 도구 호출만 봅니다; Repl 이 "중지 선언했지만 도구 미호출" 모순을 감지하여 대신 LoopCancel 을 자동 호출하고 당신의 응답을 반례로 진단 로그에 기록합니다). "N회차 후"와 같은 수치 조건이라면 현재 회차는 위 철칙에 명시되어 있으니 정확히 세고, 너무 일찍 또는 너무 늦게 중지하지 마세요. 조건이 충족되지 않았다면 정상적으로 이번 회차를 완료하면 되며, 다음 cron tick 이 예정대로 도착합니다.',idLabel:"ID: {id}",activeBanner:'/loop {id} 활성 · {cadence} · "{prompt}"',cadenceSecond:"{count} 초마다",cadenceMinute:"{count} 분마다",cadenceHour:"{count} 시간마다",activeBannerMaxRunsSuffix:" · 최대 {count} 회",activeBannerStopSuffix:" · 자동 종료 조건: {condition}",cancelUnknownId:'/loop-cancel: id "{id}"에 해당하는 활성 loop가 없습니다.',toolUnknownId:"loop를 찾을 수 없음: {id}",toolCancelFailed:"{id} 종료 실패",toolCancelledSingle:"{id} 종료됨",toolNoActive:"종료할 loop가 없음",toolFoundButFailed:"loop를 찾았지만 모두 종료에 실패",toolCancelledMany:"종료: {ids}",autoStoppedByCondition:'현재 loop는 {count}회차 실행을 완료했고 자동 종료 조건("{condition}")을 충족해 자동으로 종료되었습니다.',autoStopped:"현재 loop는 {count}회차 실행을 완료했고 자동으로 종료되었습니다.",autoStoppedBannerByCondition:'Loop 자동 종료 · {count}회차 · 조건 충족: "{condition}"',autoStoppedBanner:"Loop 자동 종료 · {count}회차",debugStopReasonByCondition:'종료 트리거: {count}회차에서 자동 종료 조건("{condition}")을 충족했습니다.',debugStopReason:"종료 트리거: {count}회차 실행이 완료되었습니다."},cron:{runFired:"예약 작업 {id} {count}회차 실행 · {time}",runHint:'[시스템 알림] 아래 prompt는 ScheduleCron 예약 작업 {id}({count}회차)에 의해 자동 주입된 것으로, 사용자가 직접 입력한 것이 아닙니다. 사용자에게 확인을 요청하지 말고 바로 실행하세요. 이 예약 작업을 중지하려면 ScheduleCron 도구를 action="delete" id="{id}"로 호출하세요(oneShot 작업은 실행 후 자동 삭제되므로 불필요).'},causal:{stageObserve:"관측",stageChain:"소인",stageVerify:"검증",stageAttribute:"귀인",stageSummary:"요약",titleObserve:"인과 - 관측",titleChain:"인과 - 인과 사슬",titleVerify:"인과 - 검증",titleAttribute:"인과 - 귀인",titleSummary:"인과 - 요약",observationsTitle:"관측 신호",chainTitle:"인과 사슬(원인 → 결과)",rootCauseLabel:"근본 원인",confidenceLabel:"신뢰도",graphLabel:"인과 그래프",attributionTitle:"귀인",awaitingEngine:"엔진을 호출하여 인과 사슬을 추적 중…",awaitingCycles:"인과 분석 대기 중…",linkArrow:"→"},evolve:{titlePlan:"진화 - 계획",titleVerify:"진화 - 검증",titleLearn:"진화 - 학습",titleSummary:"진화 - 요약",iterFormat:"{current}/{total} 라운드",awaitingEngine:"결과 대기 중 …",awaitingCycles:"진화 사이클 완료 대기 중…",stageExecute:"실행",fileNotFound:"진화 파일을 찾을 수 없습니다: {path}",fileNotARegular:"일반 파일이 아닙니다: {path}",renamePrompt:"{path} 에 저장됨. Enter / y = 이 파일 이름 유지; 새 이름(.md 자동 추가) = 이번 라운드 이름 변경; n = 진화 종료.",renamePromptOverwrite:"{path} 에 저장됨. Enter / y = 이전 라운드({prev}) 덮어쓰기; 새 이름(.md 자동 추가) = 독립 파일; n = 진화 종료.",renamePromptHeader:"{path} 에 저장됨.",renamePromptCandidatesTitle:"덮어쓰기 가능한 기존 라운드:",renamePromptCandidateLine:" {n}. {label}",renamePromptFooter:"Enter = 기본 유지(독립 파일); 숫자 = 위 항목 덮어쓰기; 새 이름(.md 자동 추가) = 독립 파일 이름 변경; d = 이번 라운드 폐기(삭제); n = 진화 종료.",renamePromptFooterIter1:"Enter / y = 기본 유지; 새 이름(.md 자동 추가) = 이름 변경; d = 이번 라운드 폐기(삭제); n = 진화 종료.",discardDone:"이번 라운드를 폐기했습니다: {path}",discardFailed:"폐기 실패: {reason}",renameKeptDefault:"현재 파일 이름을 유지했습니다.",renameDone:"이름 변경됨: {path}",renameOverwrote:"업데이트됨: {path}",renameFailed:"이름 변경 실패: {reason}",targetReached:"진화 {round}/{total} 라운드 신뢰도 {score}/{max} 목표(≥ {target}) 달성 — 조기 수렴 완료.",notReachedMemory:"신뢰도 {score}/{max} 목표(≥ {target}) 미달 — 최종 라운드의 결론을 그대로 기억에 저장합니다(낮은 점수도 정직하게 기록).",nextInputRegenerated:"이전 라운드의 통찰 결과 + 통찰 입력으로 이번 라운드의 통찰 입력을 재생성하여 자동으로 다음 라운드로 진행합니다.",targetPrompt:"진화 {prev}/{total} 라운드 완료 — 다음 {next}/{total} 라운드 쓸 위치?",targetPromptFinal:"진화 {prev}/{total} 라운드 완료(최종)— 이 파일의 최종 위치?",targetMenuLine:" {n}. {label} {marker}",targetMenuCurrentMark:"(기본 · 현재 포인터)",targetMenuNewItem:"새로 만들기...",targetMenuFooter:"Enter = 현재 포인터 유지(다음 라운드는 여기에 기록); 「숫자」 입력으로 기존 선택(포인터를 해당 항목으로 전환, 다음 라운드는 거기에 기록); 「새 파일명」(단일 토큰, .md 자동 추가)으로 독립 파일; n = 취소.",targetMenuFooterFinal:"Enter = 현재 파일 유지(변경 없음); 「숫자」 입력 → 현재 파일을 해당 경로로 fs.rename(해당 항목이 현재 포인터가 아니면 덮어쓰기); 「새 파일명」(단일 토큰, .md 자동 추가) → 이름 변경; n = 종료(변경 없음).",targetInvalidWhitespace:"공백 불가 — 숫자나 정확한 파일명으로 선택; 독립 파일은 단일 토큰 파일명만.",targetSelected:"선택됨: {label}",targetCreatedNew:"새 독립 파일: {path}",targetInvalidPath:"파일명만 허용 — 디렉토리 구분자나 .. 불가.",targetInvalidIndex:"번호가 범위를 벗어났습니다.",targetNeedNewName:"새 파일 이름을 입력하세요(.md 자동 추가).",targetFilenameExists:"파일명 중복 — 이미 존재함: {path}. 다른 이름을 입력하거나 해당 「숫자」를 선택하세요."},distill:{titlePlan:"침전 - 계획",titleVerify:"침전 - 검증",titleLearn:"침전 - 학습",titleSummary:"침전 - 요약",causalAnalyzed:"인과 분석",phase:"단계:",rootCause:"근본 원인:",confidence:"신뢰도:",causalGraph:"인과 그래프:",hypotheses:"가설:",summary:"요약:",stagePlan:"계획",stageVerify:"검증",stageLearn:"학습",stageSummary:"요약",awaitingEngine:"결과 대기 중 …",awaitingCycles:"침전 사이클 완료 대기 중…"},insight:{stagePreset:"사전 설정",stageInit:"초기화",stageRun:"실행",stageOutput:"출력",stageScore:"평가",stageSummary:"요약",stageMemory:"기억",stageComplete:"완료",titlePreset:"인사이트 - 사전 설정",titleInit:"인사이트 - 초기화",titleRun:"인사이트 - 실행",titleOutput:"인사이트 - 출력",titleScore:"인사이트 - 평가",titleMemory:"인사이트 - 기억",memoryWriting:"stem memory 에 기록 중(인사이트 기억)…",inputTitle:"인사이트 내용",goalsTitle:"분석 목표",criteriaTitle:"신뢰도 평가 기준",targetLabel:"목표 점수",targetFormat:"≥ {target}/{max}",flowTitle:"실행 흐름",tasksTitle:"실행 단계",stepLabel:"단계{n}",resultTitle:"인사이트 결과",confidenceLabel:"신뢰도",scoreFormat:"{score}/{max}",scoreSummaryTitle:"실행도 요약",taskTypePrompt:"프롬프트",taskTypeDataRead:"데이터 읽기",taskTypeDataCompute:"데이터 계산",taskTypeWebSearch:"웹 검색",taskTypeAnalysisLocate:"분석 위치 지정",taskTypeSummarize:"요약 정리",taskTypeTool:"도구",taskTypeCommand:"명령어",taskTypeSubagent:"서브에이전트",taskTypeWorkflow:"워크플로",taskTypeMcpTool:"MCP 도구",taskTypeMemory:"기억 읽기/쓰기",awaitingEngine:"엔진을 호출하여 인사이트 흐름 실행 중…",inputFallbackToken:"입력",titleFormatCausal:"「{token}」 인과 인사이트",titleFormatDistill:"「{token}」 침전 인사이트",titleFormatEvolve:"「{token}」 진화 인사이트",goalScope:"분석 범위와 핵심 연결 고리 확정",goalCausalChain:"현상 → 근본 원인 → 영향 의 인과 사슬 산출",goalDistill:"재사용 가능한 결론과 패턴 침전",goalEvolve:"목표 신뢰도에 도달할 때까지 인사이트 결론 반복 수렴",goalActions:"계층별(P0/P1/P2) 대응 제안 제시",criterionLow:"증거 부족, 결론 사용 불가",criterionMid:"방향은 성립, 주도 요인 미확정",criterionHigh:"근본 원인 신뢰 가능, 영향 범위 미정량",criterionTop:"논리 루프 완결, 대응 제안 즉시 실행 가능",flowStart:"시작",flowEnd:"종료",scoreReachedDefault:"신뢰도 {score}/{max}, 목표 점수 달성(≥ {target}).",scoreMissedDefault:"신뢰도 {score}/{max}, 목표 점수 미달(≥ {target}).",engineParseFallback:"엔진 응답을 구조화된 인사이트로 해석하지 못해 원문을 출력에 반영했습니다. 신뢰도는 0(증거 부족)으로 기록.",engineEmptyOutput:"(엔진이 내용을 반환하지 않음)",engineCallFailed:"엔진 호출 실패: {reason}",summaryStream:"인사이트 완료{cycle}. 명령 「{command}」이(가) {mode} 모드에서 {stepCount}단계 플로우({flow})를 실행해 {tasksDone}/{tasksTotal}단계를 {duration}에 완료했습니다. 신뢰도 {score}/{max} (목표 ≥ {target}). 기억을 {path}에 저장했습니다.",unitHour:"시간",unitMinute:"분",unitSecond:"초",unitMs:"밀리초",durationInstant:"즉시",modeDistill:"침전",modeEvolve:"진화",modeCausal:"인과",savedLine:"✓ 저장됨: {path}",saveFailedLine:"✗ 저장 실패: {reason}",memorySavedLine:"✓ stem memory 에 저장됨: {path}",memoryUpdatedLine:"✓ stem memory 업데이트됨: {path}",memoryAdviceHeading:"권장 사항",memoryScoreLine:"신뢰도 {score}/{max}: {summary}",memoryIndexHook:"{mode} 인사이트 · 신뢰도 {score}/{max}",memoryInsightFileLine:"인사이트 파일: {path}",dataSavedLine:"인사이트 {mode} 파일 저장됨: {path}",dataSaveFailedLine:"인사이트 데이터 저장 실패: {reason}",statusPending:"대기",statusActive:"진행 중",statusDone:"완료",reportTitle:"인사이트 리포트",reportCommand:"명령",reportMode:"모드",reportGenerated:"생성 시각",reportFile:"파일",reportSteps:"단계",reportRangeHeader:"점수 구간",reportMeaningHeader:"의미"}},Qc=dH0;var nH0=/\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g;function Gc($,Z){if(!Z)return $;return $.replace(nH0,(O,Y)=>{let X=Z[Y];if(X===void 0||X===null)return O;return String(X)})}function J_(){let $=process.env.STEM_BIZ_NAME?.trim();return $?$:"MortiseAI"}function aw($){return $.replaceAll("MortiseAI",J_())}var G_=["zh","en","ja","ko"];function Vc($){return G_.includes($)}function Q_($){if(!$)return null;let Z=$.toLowerCase();for(let O of G_)if(Z.startsWith(O))return O;return null}function rH0($){let Z=[],O=null;for(let Y=0;Y<$.length;Y++){let X=$[Y];if(X==="--lang"){let f=$[Y+1];if(f!==void 0&&!f.startsWith("-")){if(Vc(f))O=f;Y++}continue}if(X.startsWith("--lang=")){let f=X.slice(7);if(Vc(f))O=f;continue}Z.push(X)}return{value:O,cleaned:Z}}function V_($=process.argv.slice(2)){let Z=rH0($);if(Z.value)return{locale:Z.value,cleanedArgv:Z.cleaned};let O=(process.env.STEM_DEF_LANGUAGE||"").toLowerCase();for(let X of G_)if(O.startsWith(X))return{locale:X,cleanedArgv:Z.cleaned};let Y=Q_(process.env.LC_ALL)??Q_(process.env.LC_MESSAGES)??Q_(process.env.LANG);if(Y)return{locale:Y,cleanedArgv:Z.cleaned};return{locale:"zh",cleanedArgv:Z.cleaned}}var iH0={zh:sw,en:fc,ja:Jc,ko:Qc},Bc=sw,zc="zh";function jc($){zc=$,Bc=iH0[$]??sw}function h5(){return zc}function Wc($){let Z=$.split("."),O=Bc;for(let Y of Z){if(typeof O!=="object"||Array.isArray(O)||O===null)return;if(O=O[Y],O===void 0)return}return O}function w($,Z){let O=Wc($);if(typeof O!=="string")return console.warn(`[i18n] missing string key: ${$}`),$;return Gc(O,{bizName:J_(),...Z})}function Uc($,Z){let O=Wc("commandsCatalog");if(!O||typeof O!=="object"||Array.isArray(O))return;let Y=O[$];if(!Y||typeof Y!=="object"||Array.isArray(Y))return;let X=Y[Z];return typeof X==="string"?X:void 0}function B_($){return Uc($,"label")??`/${$}`}function bc($){return Uc($,"description")??""}O$();import{appendFileSync as oH0,existsSync as vl0,mkdirSync as sH0}from"node:fs";import{dirname as aH0,join as Hc}from"node:path";function tH0(){if(process.env.STEM_CMD_LOG)return!0;let $=(process.env.STEM_DEBUG??"").toLowerCase();return $==="1"||$==="true"||$==="yes"||$==="on"}function C($,Z,O="info"){if(O!=="error"&&!tH0())return;let Y=Fc();try{sH0(aH0(Y),{recursive:!0});let X=XE0(new Date),f=O.padEnd(5," "),J=Z===void 0?"":` ${JSON.stringify(Z)}`;if(oH0(Y,LG(`${X} · ${f} · [${$}]${J}
|
|
602
|
+
**철칙 3 — 단일 채널 + loop 메타 commentary 금지**: 위의 prompt 를 **사용자가 일반 프롬프트에 방금 입력한 것**으로 취급하고, 평소의 대화 스타일로 자연스럽게 응답하세요 —— 도입부, 다단락 추론, markdown, 이모지, 되묻기 모두 prompt 에 어울리면 사용 가능합니다. **echo bot 처럼 동작하지 마세요**. 구조적 제약은 두 가지뿐: **(a) 단일 채널** —— 순수 assistant text 로 출력하거나 \`SendUserMessage\` 도구로 보내거나 둘 중 하나, **두 방식을 섞지 마세요** (섞으면 같은 내용이 UI 에 2~4번 나타나 모델이 혼잣말하는 것처럼 보입니다). **(b) loop bookkeeping 금지** —— "현재 N회차", "X회 실행됨", "정지 조건 충족", "다음 회차로 진입" 같은 메타 commentary 를 추가하지 마세요. loop 메커니즘은 prompt 입장에서 보이지 않습니다. 평범한 사용자가 입력하는 것처럼 응답하세요. 중지가 필요하면 철칙 2 에 따라 LoopCancel 만 호출하고 평소 응답은 그대로 두세요. **"loop 가 중지되었습니다" 같은 추가 문장은 쓰지 마세요**.`,closeConditionHint:'[시스템 강제 제약 — 자동 종료 조건] 사용자가 본 loop 에 자동 종료 조건을 설정했습니다: "{condition}". 이번 응답 완료 후, **조건이 현재 충족되었는지 판단**하세요. 충족되었다면 loop 를 실제로 중지하려면 `LoopCancel` 도구 호출이 **필수**입니다 — "조건을 충족했습니다", "loop 를 중지합니다" 같은 텍스트만 출력하는 것은 **완전히 무효**입니다 (scheduler 는 응답을 읽지 않고 도구 호출만 봅니다; Repl 이 "중지 선언했지만 도구 미호출" 모순을 감지하여 대신 LoopCancel 을 자동 호출하고 당신의 응답을 반례로 진단 로그에 기록합니다). "N회차 후"와 같은 수치 조건이라면 현재 회차는 위 철칙에 명시되어 있으니 정확히 세고, 너무 일찍 또는 너무 늦게 중지하지 마세요. 조건이 충족되지 않았다면 정상적으로 이번 회차를 완료하면 되며, 다음 cron tick 이 예정대로 도착합니다.',idLabel:"ID: {id}",activeBanner:'/loop {id} 활성 · {cadence} · "{prompt}"',cadenceSecond:"{count} 초마다",cadenceMinute:"{count} 분마다",cadenceHour:"{count} 시간마다",activeBannerMaxRunsSuffix:" · 최대 {count} 회",activeBannerStopSuffix:" · 자동 종료 조건: {condition}",cancelUnknownId:'/loop-cancel: id "{id}"에 해당하는 활성 loop가 없습니다.',toolUnknownId:"loop를 찾을 수 없음: {id}",toolCancelFailed:"{id} 종료 실패",toolCancelledSingle:"{id} 종료됨",toolNoActive:"종료할 loop가 없음",toolFoundButFailed:"loop를 찾았지만 모두 종료에 실패",toolCancelledMany:"종료: {ids}",autoStoppedByCondition:'현재 loop는 {count}회차 실행을 완료했고 자동 종료 조건("{condition}")을 충족해 자동으로 종료되었습니다.',autoStopped:"현재 loop는 {count}회차 실행을 완료했고 자동으로 종료되었습니다.",autoStoppedBannerByCondition:'Loop 자동 종료 · {count}회차 · 조건 충족: "{condition}"',autoStoppedBanner:"Loop 자동 종료 · {count}회차",debugStopReasonByCondition:'종료 트리거: {count}회차에서 자동 종료 조건("{condition}")을 충족했습니다.',debugStopReason:"종료 트리거: {count}회차 실행이 완료되었습니다."},cron:{runFired:"예약 작업 {id} {count}회차 실행 · {time}",runHint:'[시스템 알림] 아래 prompt는 ScheduleCron 예약 작업 {id}({count}회차)에 의해 자동 주입된 것으로, 사용자가 직접 입력한 것이 아닙니다. 사용자에게 확인을 요청하지 말고 바로 실행하세요. 이 예약 작업을 중지하려면 ScheduleCron 도구를 action="delete" id="{id}"로 호출하세요(oneShot 작업은 실행 후 자동 삭제되므로 불필요).'},causal:{stageObserve:"관측",stageChain:"소인",stageVerify:"검증",stageAttribute:"귀인",stageSummary:"요약",titleObserve:"인과 - 관측",titleChain:"인과 - 인과 사슬",titleVerify:"인과 - 검증",titleAttribute:"인과 - 귀인",titleSummary:"인과 - 요약",observationsTitle:"관측 신호",chainTitle:"인과 사슬(원인 → 결과)",rootCauseLabel:"근본 원인",confidenceLabel:"신뢰도",graphLabel:"인과 그래프",attributionTitle:"귀인",awaitingEngine:"엔진을 호출하여 인과 사슬을 추적 중…",awaitingCycles:"인과 분석 대기 중…",linkArrow:"→"},evolve:{titlePlan:"진화 - 계획",titleVerify:"진화 - 검증",titleLearn:"진화 - 학습",titleSummary:"진화 - 요약",iterFormat:"{current}/{total} 라운드",awaitingEngine:"결과 대기 중 …",awaitingCycles:"진화 사이클 완료 대기 중…",stageExecute:"실행",fileNotFound:"진화 파일을 찾을 수 없습니다: {path}",fileNotARegular:"일반 파일이 아닙니다: {path}",renamePrompt:"{path} 에 저장됨. Enter / y = 이 파일 이름 유지; 새 이름(.md 자동 추가) = 이번 라운드 이름 변경; n = 진화 종료.",renamePromptOverwrite:"{path} 에 저장됨. Enter / y = 이전 라운드({prev}) 덮어쓰기; 새 이름(.md 자동 추가) = 독립 파일; n = 진화 종료.",renamePromptHeader:"{path} 에 저장됨.",renamePromptCandidatesTitle:"덮어쓰기 가능한 기존 라운드:",renamePromptCandidateLine:" {n}. {label}",renamePromptFooter:"Enter = 기본 유지(독립 파일); 숫자 = 위 항목 덮어쓰기; 새 이름(.md 자동 추가) = 독립 파일 이름 변경; d = 이번 라운드 폐기(삭제); n = 진화 종료.",renamePromptFooterIter1:"Enter / y = 기본 유지; 새 이름(.md 자동 추가) = 이름 변경; d = 이번 라운드 폐기(삭제); n = 진화 종료.",discardDone:"이번 라운드를 폐기했습니다: {path}",discardFailed:"폐기 실패: {reason}",renameKeptDefault:"현재 파일 이름을 유지했습니다.",renameDone:"이름 변경됨: {path}",renameOverwrote:"업데이트됨: {path}",renameFailed:"이름 변경 실패: {reason}",targetReached:"진화 {round}/{total} 라운드 신뢰도 {score}/{max} 목표(≥ {target}) 달성 — 조기 수렴 완료.",notReachedMemory:"신뢰도 {score}/{max} 목표(≥ {target}) 미달 — 최종 라운드의 결론을 그대로 기억에 저장합니다(낮은 점수도 정직하게 기록).",nextInputRegenerated:"이전 라운드의 통찰 결과 + 통찰 입력으로 이번 라운드의 통찰 입력을 재생성하여 자동으로 다음 라운드로 진행합니다.",targetPrompt:"진화 {prev}/{total} 라운드 완료 — 다음 {next}/{total} 라운드 쓸 위치?",targetPromptFinal:"진화 {prev}/{total} 라운드 완료(최종)— 이 파일의 최종 위치?",targetMenuLine:" {n}. {label} {marker}",targetMenuCurrentMark:"(기본 · 현재 포인터)",targetMenuNewItem:"새로 만들기...",targetMenuFooter:"Enter = 현재 포인터 유지(다음 라운드는 여기에 기록); 「숫자」 입력으로 기존 선택(포인터를 해당 항목으로 전환, 다음 라운드는 거기에 기록); 「새 파일명」(단일 토큰, .md 자동 추가)으로 독립 파일; n = 취소.",targetMenuFooterFinal:"Enter = 현재 파일 유지(변경 없음); 「숫자」 입력 → 현재 파일을 해당 경로로 fs.rename(해당 항목이 현재 포인터가 아니면 덮어쓰기); 「새 파일명」(단일 토큰, .md 자동 추가) → 이름 변경; n = 종료(변경 없음).",targetInvalidWhitespace:"공백 불가 — 숫자나 정확한 파일명으로 선택; 독립 파일은 단일 토큰 파일명만.",targetSelected:"선택됨: {label}",targetCreatedNew:"새 독립 파일: {path}",targetInvalidPath:"파일명만 허용 — 디렉토리 구분자나 .. 불가.",targetInvalidIndex:"번호가 범위를 벗어났습니다.",targetNeedNewName:"새 파일 이름을 입력하세요(.md 자동 추가).",targetFilenameExists:"파일명 중복 — 이미 존재함: {path}. 다른 이름을 입력하거나 해당 「숫자」를 선택하세요."},distill:{titlePlan:"침전 - 계획",titleVerify:"침전 - 검증",titleLearn:"침전 - 학습",titleSummary:"침전 - 요약",causalAnalyzed:"인과 분석",phase:"단계:",rootCause:"근본 원인:",confidence:"신뢰도:",causalGraph:"인과 그래프:",hypotheses:"가설:",summary:"요약:",stagePlan:"계획",stageVerify:"검증",stageLearn:"학습",stageSummary:"요약",awaitingEngine:"결과 대기 중 …",awaitingCycles:"침전 사이클 완료 대기 중…"},insight:{stagePreset:"사전 설정",stageInit:"초기화",stageRun:"실행",stageOutput:"출력",stageScore:"평가",stageSummary:"요약",stageMemory:"기억",stageComplete:"완료",titlePreset:"인사이트 - 사전 설정",titleInit:"인사이트 - 초기화",titleRun:"인사이트 - 실행",titleOutput:"인사이트 - 출력",titleScore:"인사이트 - 평가",titleMemory:"인사이트 - 기억",memoryWriting:"stem memory 에 기록 중(인사이트 기억)…",inputTitle:"인사이트 내용",goalsTitle:"분석 목표",criteriaTitle:"신뢰도 평가 기준",targetLabel:"목표 점수",targetFormat:"≥ {target}/{max}",flowTitle:"실행 흐름",tasksTitle:"실행 단계",stepLabel:"단계{n}",resultTitle:"인사이트 결과",confidenceLabel:"신뢰도",scoreFormat:"{score}/{max}",scoreSummaryTitle:"실행도 요약",taskTypePrompt:"프롬프트",taskTypeDataRead:"데이터 읽기",taskTypeDataCompute:"데이터 계산",taskTypeWebSearch:"웹 검색",taskTypeAnalysisLocate:"분석 위치 지정",taskTypeSummarize:"요약 정리",taskTypeTool:"도구",taskTypeCommand:"명령어",taskTypeSubagent:"서브에이전트",taskTypeWorkflow:"워크플로",taskTypeMcpTool:"MCP 도구",taskTypeMemory:"기억 읽기/쓰기",awaitingEngine:"엔진을 호출하여 인사이트 흐름 실행 중…",inputFallbackToken:"입력",titleFormatCausal:"「{token}」 인과 인사이트",titleFormatDistill:"「{token}」 침전 인사이트",titleFormatEvolve:"「{token}」 진화 인사이트",goalScope:"분석 범위와 핵심 연결 고리 확정",goalCausalChain:"현상 → 근본 원인 → 영향 의 인과 사슬 산출",goalDistill:"재사용 가능한 결론과 패턴 침전",goalEvolve:"목표 신뢰도에 도달할 때까지 인사이트 결론 반복 수렴",goalActions:"계층별(P0/P1/P2) 대응 제안 제시",criterionLow:"증거 부족, 결론 사용 불가",criterionMid:"방향은 성립, 주도 요인 미확정",criterionHigh:"근본 원인 신뢰 가능, 영향 범위 미정량",criterionTop:"논리 루프 완결, 대응 제안 즉시 실행 가능",flowStart:"시작",flowEnd:"종료",scoreReachedDefault:"신뢰도 {score}/{max}, 목표 점수 달성(≥ {target}).",scoreMissedDefault:"신뢰도 {score}/{max}, 목표 점수 미달(≥ {target}).",engineParseFallback:"엔진 응답을 구조화된 인사이트로 해석하지 못해 원문을 출력에 반영했습니다. 신뢰도는 0(증거 부족)으로 기록.",engineEmptyOutput:"(엔진이 내용을 반환하지 않음)",engineCallFailed:"엔진 호출 실패: {reason}",summaryStream:"인사이트 완료{cycle}. 명령 「{command}」이(가) {mode} 모드에서 {stepCount}단계 플로우({flow})를 실행해 {tasksDone}/{tasksTotal}단계를 {duration}에 완료했습니다. 신뢰도 {score}/{max} (목표 ≥ {target}). 기억을 {path}에 저장했습니다.",unitHour:"시간",unitMinute:"분",unitSecond:"초",unitMs:"밀리초",durationInstant:"즉시",modeDistill:"침전",modeEvolve:"진화",modeCausal:"인과",savedLine:"✓ 저장됨: {path}",saveFailedLine:"✗ 저장 실패: {reason}",memorySavedLine:"✓ stem memory 에 저장됨: {path}",memoryUpdatedLine:"✓ stem memory 업데이트됨: {path}",memoryAdviceHeading:"권장 사항",memoryScoreLine:"신뢰도 {score}/{max}: {summary}",memoryIndexHook:"{mode} 인사이트 · 신뢰도 {score}/{max}",memoryInsightFileLine:"인사이트 파일: {path}",dataSavedLine:"인사이트 {mode} 파일 저장됨: {path}",dataSaveFailedLine:"인사이트 데이터 저장 실패: {reason}",statusPending:"대기",statusActive:"진행 중",statusDone:"완료",reportTitle:"인사이트 리포트",reportCommand:"명령",reportMode:"모드",reportGenerated:"생성 시각",reportFile:"파일",reportSteps:"단계",reportRangeHeader:"점수 구간",reportMeaningHeader:"의미"}},Qc=dH0;var nH0=/\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g;function Gc($,Z){if(!Z)return $;return $.replace(nH0,(O,Y)=>{let X=Z[Y];if(X===void 0||X===null)return O;return String(X)})}function J_(){let $=process.env.STEM_BIZ_NAME?.trim();return $?$:"MortiseAI"}function aw($){return $.replaceAll("MortiseAI",J_())}var G_=["zh","en","ja","ko"];function Vc($){return G_.includes($)}function Q_($){if(!$)return null;let Z=$.toLowerCase();for(let O of G_)if(Z.startsWith(O))return O;return null}function rH0($){let Z=[],O=null;for(let Y=0;Y<$.length;Y++){let X=$[Y];if(X==="--lang"){let f=$[Y+1];if(f!==void 0&&!f.startsWith("-")){if(Vc(f))O=f;Y++}continue}if(X.startsWith("--lang=")){let f=X.slice(7);if(Vc(f))O=f;continue}Z.push(X)}return{value:O,cleaned:Z}}function V_($=process.argv.slice(2)){let Z=rH0($);if(Z.value)return{locale:Z.value,cleanedArgv:Z.cleaned};let O=(process.env.STEM_DEF_LANGUAGE||"").toLowerCase();for(let X of G_)if(O.startsWith(X))return{locale:X,cleanedArgv:Z.cleaned};let Y=Q_(process.env.LC_ALL)??Q_(process.env.LC_MESSAGES)??Q_(process.env.LANG);if(Y)return{locale:Y,cleanedArgv:Z.cleaned};return{locale:"zh",cleanedArgv:Z.cleaned}}var iH0={zh:sw,en:fc,ja:Jc,ko:Qc},Bc=sw,zc="zh";function jc($){zc=$,Bc=iH0[$]??sw}function h5(){return zc}function Wc($){let Z=$.split("."),O=Bc;for(let Y of Z){if(typeof O!=="object"||Array.isArray(O)||O===null)return;if(O=O[Y],O===void 0)return}return O}function w($,Z){let O=Wc($);if(typeof O!=="string")return console.warn(`[i18n] missing string key: ${$}`),$;return Gc(O,{bizName:J_(),...Z})}function Uc($,Z){let O=Wc("commandsCatalog");if(!O||typeof O!=="object"||Array.isArray(O))return;let Y=O[$];if(!Y||typeof Y!=="object"||Array.isArray(Y))return;let X=Y[Z];return typeof X==="string"?X:void 0}function B_($){return Uc($,"label")??`/${$}`}function bc($){return Uc($,"description")??""}O$();import{appendFileSync as oH0,existsSync as vl0,mkdirSync as sH0}from"node:fs";import{dirname as aH0,join as Hc}from"node:path";function tH0(){if(process.env.STEM_CMD_LOG)return!0;let $=(process.env.STEM_DEBUG??"").toLowerCase();return $==="1"||$==="2"||$==="true"||$==="yes"||$==="on"}function C($,Z,O="info"){if(O!=="error"&&!tH0())return;let Y=Fc();try{sH0(aH0(Y),{recursive:!0});let X=XE0(new Date),f=O.padEnd(5," "),J=Z===void 0?"":` ${JSON.stringify(Z)}`;if(oH0(Y,LG(`${X} · ${f} · [${$}]${J}
|
|
603
603
|
`),"utf8"),Ec!==!0){Ec=!0;for(let G of eH0)try{G()}catch{}}}catch{}}var Ec=null,eH0=new Set;var $E0=/token|secret|passwd|password|credential|authorization|api[_-]?key/i,W_=new Set;function xG($){if(typeof $==="string"&&$.length>=6)W_.add($)}function LG($){if(!$||W_.size===0)return $;let Z=$;for(let O of W_){if(Z.includes(O))Z=Z.split(O).join("<redacted>");let Y=JSON.stringify(O).slice(1,-1);if(Y!==O&&Z.includes(Y))Z=Z.split(Y).join("<redacted>")}return Z}function Bz($){if(Array.isArray($))return $.map((Z)=>Bz(Z));if($&&typeof $==="object"){let Z={};for(let[O,Y]of Object.entries($))Z[O]=$E0.test(O)&&typeof Y==="string"?`<redacted len=${Y.length}>`:Bz(Y);return Z}return $}async function _0($,Z,O){let Y=Date.now(),X={};for(let f of Object.keys(Z))X[f]=I8(Bz(Z[f]));C(`${$}.invoke:in`,X);try{let f=await O();return C(`${$}.invoke:ok`,{ms:Date.now()-Y,result:ZE0(f)}),f}catch(f){let J=f instanceof Error?f.stack??f.message:String(f);throw C(`${$}.invoke:err`,{ms:Date.now()-Y,error:I8(J,500)},"error"),f}}function ZE0($,Z=300){if($===void 0)return"<undefined>";if($===null)return"<null>";if(typeof $!=="object")return I8($);let O=$,Y={};if("ok"in O)Y.ok=O.ok;if(O.is_error)Y.is_error=!0;if(O.ok===!1||O.is_error){let X=O.output??O.error;if(X!==void 0)Y.output=I8(X,Z);return Y}if(O.data!==void 0&&typeof O.data==="object"&&O.data!==null){let X=O.data;Y.dataKeys=Object.keys(X);let f=["content","diff","files","counts","matches","output"];for(let G of f)if(X[G]!==void 0){Y[`${G}Preview`]=I8(X[G],Z);break}let J=new Set(f);for(let[G,V]of Object.entries(X)){if(J.has(G))continue;if(typeof V==="number"||typeof V==="boolean"||V===null)Y[G]=V;else if(typeof V==="string"&&V.length<=32)Y[G]=V}return Y}if(O.data!==void 0)return Y.data=I8(O.data,Z),Y;if(O.output!==void 0)Y.output=I8(O.output,Z);return Y}function I8($,Z=200){if($===void 0)return"<undefined>";if($===null)return"<null>";let O;try{O=typeof $==="string"?$:JSON.stringify($)}catch{O=String($)}if(O.length<=Z)return O;return`${O.slice(0,Z)}...(+${O.length-Z})`}function Fc(){if(process.env.STEM_CMD_LOG)return process.env.STEM_CMD_LOG;if(wc)return wc;return Hc(uQ(Hc(process.cwd(),"logs")),`${OE0()}_${YE0()}.txt`)}var wc=null;function tw(){return Fc()}var z_=null;function OE0(){if(z_===null)z_=fE0(new Date);return z_}var j_=null;function YE0(){if(j_===null)j_=Math.random().toString(36).slice(2,10);return j_}var dQ=($)=>String($).padStart(2,"0");function XE0($){return`${$.getFullYear()}-${dQ($.getMonth()+1)}-${dQ($.getDate())}_${dQ($.getHours())}-${dQ($.getMinutes())}-${dQ($.getSeconds())}`}function fE0($){return`${$.getFullYear()}-${dQ($.getMonth()+1)}-${dQ($.getDate())}_${dQ($.getHours())}-${dQ($.getMinutes())}`}T1();var ew="workspace.additionalDirs";function zz(){let $=m0(ew);return Array.isArray($)?$.filter((Z)=>typeof Z==="string"&&Z.length>0):[]}function yc(){let $=zz();if($.length===0)return"";return`
|
|
604
604
|
|
|
605
605
|
Additional working directories (added via /add-dir — you may read and `+`modify files under these paths in addition to cwd):
|
|
@@ -855,7 +855,7 @@ ${J}`:""}`,j=await X({model:$.model,system:$.system,vcrFixture:$.vcrFixture,mess
|
|
|
855
855
|
`),sections:Y,variant:Z}}}function PT0(){return["# Charts","The TUI renders ```chart fenced blocks as terminal charts. When presenting proportions, trends, or ranked comparisons, prefer a chart over a markdown table. The fence body is one JSON object:",'- Share of whole: `{"type":"pie","title":"...","data":[{"label":"A","value":40},...]}` — '+"rendered as colored proportion bars with automatic percentages (no circular pie)",'- Bar (ranked comparison, horizontal; best for long labels): `{"type":"bar","title":"...","data":[{"label":"A","value":42},...]}`','- Column (vertical bars; best for few categories with short labels): `{"type":"column","title":"...","data":[{"label":"A","value":42},...]}`','- Line (trend): `{"type":"line","title":"...","series":[{"name":"S1","points":[1,2,3]}],"xLabels":["Jan","Feb","Mar"]}` (single series may use `"data":[1,2,3]` instead of `series`)',"Rules: at most 6 slices/series (extras are folded into an 'other' bucket); values must be plain finite numbers; keep labels short. Emit the complete fenced block in one piece."].join(`
|
|
856
856
|
`)}function qT0(){let $={zh:"Chinese (中文)",en:"English",ja:"Japanese (日本語)",ko:"Korean (한국어)"},Z=h5(),O=$[Z]??$.zh;return["# Response language",`The CLI locale is "${Z}". Respond in ${O} — all user-facing text (answers, summaries, `+`reports, questions) must be in ${O}, unless the user explicitly writes in or requests a different language. Code identifiers, protocol names, and command names stay in English as-is.`].join(`
|
|
857
857
|
`)}function KT0(){let $;try{$=mP()}catch{return null}if($.length===0)return null;C("systemPrompt.skills",{count:$.length,names:$.map((O)=>O.name)});let Z=["# Skills","Locally installed skills (SKILL.md under .mstem/def/skills, plus bundled skills; project-level shadows user-level and bundled on name clash).","When the user's request matches a skill's triggers (or names the skill explicitly), FIRST call the Skill tool with action='read', name='<skill>' (pass the user's task detail via `args`) to load its instructions, then follow them. Do NOT act on a matched skill from memory without reading it first.",""];for(let O of $)Z.push(AF(O));return Z.join(`
|
|
858
|
-
`)}function TT0(){return["# Turn discipline","Do not stop mid-task. Before ending your turn, check your last paragraph: if it is a plan, "+`a list of next steps, or a promise about work not yet done ("接下来我会…", "I'll now…", `+`"then I'll handle the remaining files"), DO that work now with tool calls instead of ending the turn. Working through many files or steps in a single turn is expected and encouraged.`,"A status report is not a stopping point. If you hit an obstacle (a tool is unavailable, a command "+"fails), state it briefly and immediately continue with the best available alternative — do not "+'end the turn to wait for the user to say "continue".',"End your turn only when the task is complete, or you are blocked on input that only the user can provide (a genuine decision, a credential, a destructive-action confirmation)."].join(`
|
|
858
|
+
`)}function TT0(){return["# Turn discipline","For any multi-step task (3+ distinct steps, multiple files to change, or work that spans several "+"tool calls), you MUST create a todo list with TodoWrite BEFORE starting the work — one item per "+"step. Keep it live as you go: mark each item in_progress when you start it and completed immediately when it is done; add newly discovered steps as new items. The harness watches this "+"list — if you end your turn while items are still pending or in_progress, it will automatically "+"resume you, so an accurate todo list is what lets long tasks run to completion unattended.","Do not stop mid-task. Before ending your turn, check your last paragraph: if it is a plan, "+`a list of next steps, or a promise about work not yet done ("接下来我会…", "I'll now…", `+`"then I'll handle the remaining files"), DO that work now with tool calls instead of ending the turn. Working through many files or steps in a single turn is expected and encouraged.`,"A status report is not a stopping point. If you hit an obstacle (a tool is unavailable, a command "+"fails), state it briefly and immediately continue with the best available alternative — do not "+'end the turn to wait for the user to say "continue".',"End your turn only when the task is complete, or you are blocked on input that only the user can provide (a genuine decision, a credential, a destructive-action confirmation). Before ending, bring the todo list to a truthful final state: everything done is marked completed; anything intentionally not done is removed or reworded with a brief explanation to the user."].join(`
|
|
859
859
|
`)}function RT0(){return["# Workflow execution",'When the user asks you to write, create, author, or design a workflow (e.g. "写个 Workflow …", '+'"build a workflow that …"), the deliverable is the RUN, not the script file. After authoring the '+"script you MUST invoke the Workflow tool (via `script` or `scriptPath`) to actually execute it, then "+"report the returned runId and end your turn — its completion is announced to you automatically.",'NEVER substitute a prose description of the expected outcome for an actual run: do not narrate what the run "would" output, which agent "would" fail, what a value "would" be, or that it "should" complete. '+"A narrated or predicted result does NOT satisfy the request — only a real run does.","The only time to stop at authoring (without running) is when the user explicitly says not to run it."].join(`
|
|
860
860
|
`)}var AT0=80000,kT0=24,xT0=12,LT0=80;function uT0(){for(let $=0;$<4;$++){let Z=crypto.randomUUID().replaceAll("-","").slice(0,4);if(!HZ(Z))return Z}return crypto.randomUUID().replaceAll("-","").slice(0,8)}function hT0($){let Y=(($.trim().split(/\s+/)[0]??"").split(/[。..,,、!!??::;;'"「」()()]/)[0]??"").toLowerCase().slice(0,xT0);return Y.length>0?Y:"fork"}function QR($,Z=AT0){let O=(G)=>{let V=[];for(let B of G){let j=V[V.length-1];if(j&&j.role===B.role)j.text=`${j.text}
|
|
861
861
|
|
|
@@ -1437,4 +1437,4 @@ ${$}`}]},X=await Promise.race([A$(Y),new Promise((f,J)=>setTimeout(()=>J(Error(`
|
|
|
1437
1437
|
`)};return{ok:!0,output:[...j,GS0(J)].join(`
|
|
1438
1438
|
`)}}class rH extends N{onAttach(){super.onAttach()}onInstall(){super.onInstall()}onDetach(){super.onDetach()}handleStateEvent($){switch($.getMessage()){case PQ.TOOL_WEB_SEARCH_INVOKE:this.handleInvoke($.getModel(),$.getSender());break;default:super.handleStateEvent($);break}}async handleInvoke($,Z){let O=$?.payload??$??{},Y=await _0("MaiCliServerToolWebSearchLogic",{receiver:Z,input:O},()=>df0(O)),X=new cu;P0(X,Y),this.sendActionEvent(_Q.TOOL_WEB_SEARCH_RESULT,X,Z)}}rH=Q([_(!0,_Q),T(!0,PQ),y()],rH);class qQ extends q{}qQ.TOOL_WORKFLOW_RESULT="tool_workflow_result",Q([I(!0,"tool_workflow_result","MaiCliServerToolWorkflowLogicActionModel"),z("design:type",Object)],qQ,"TOOL_WORKFLOW_RESULT",void 0),qQ=Q([P()],qQ);class nu extends K{ok;data;error}class KQ extends A{}KQ.TOOL_WORKFLOW_INVOKE="tool_workflow_invoke",Q([D(!0,!0,"tool_workflow_invoke"),z("design:type",Object)],KQ,"TOOL_WORKFLOW_INVOKE",void 0),KQ=Q([R()],KQ);class iH extends N{onAttach(){super.onAttach()}onInstall(){super.onInstall()}onDetach(){super.onDetach()}handleStateEvent($){switch($.getMessage()){case KQ.TOOL_WORKFLOW_INVOKE:this.handleInvoke($.getModel(),$.getSender());break;default:super.handleStateEvent($);break}}async handleInvoke($,Z){let O=$?.payload??$??{},Y=await _0("MaiCliServerToolWorkflowLogic",{receiver:Z,input:O},()=>K4(O)),X=new nu;P0(X,Y),this.sendActionEvent(qQ.TOOL_WORKFLOW_RESULT,X,Z)}}iH=Q([_(!0,qQ),T(!0,KQ),y()],iH);var nf0={MaiCliServerToolAdvisorLogic:Ib,MaiCliServerToolAgentLogic:_b,MaiCliServerToolAskUserQuestionLogic:Pb,MaiCliServerToolAskUserTextLogic:qb,MaiCliServerToolBashLogic:Kb,MaiCliServerToolBriefLogic:Tb,MaiCliServerToolConfigLogic:Rb,MaiCliServerToolCtxInspectLogic:Ab,MaiCliServerToolDiscoverSkillsLogic:kb,MaiCliServerToolEnterPlanModeLogic:xb,MaiCliServerToolEnterWorktreeLogic:Lb,MaiCliServerToolExitPlanModeLogic:ub,MaiCliServerToolExitWorktreeLogic:Cb,MaiCliServerToolFileEditLogic:Sb,MaiCliServerToolFileReadLogic:Mb,MaiCliServerToolFileWriteLogic:vb,MaiCliServerToolGlobLogic:gb,MaiCliServerToolGrepLogic:pb,MaiCliServerToolListMcpResourcesLogic:mb,MaiCliServerToolListPeersLogic:cb,MaiCliServerToolLoopCancelLogic:lb,MaiCliServerToolLspLogic:db,MaiCliServerToolMcpAuthLogic:nb,MaiCliServerToolMcpLogic:rb,MaiCliServerToolMonitorLogic:ib,MaiCliServerToolNotebookEditLogic:ob,MaiCliServerToolOverflowTestLogic:sb,MaiCliServerToolPowerShellLogic:ab,MaiCliServerToolPushNotificationLogic:tb,MaiCliServerToolReadMcpResourceLogic:eb,MaiCliServerToolRemoteTriggerLogic:$H,MaiCliServerToolReplLogic:ZH,MaiCliServerToolReviewArtifactLogic:OH,MaiCliServerToolScheduleCronLogic:YH,MaiCliServerToolSendMessageLogic:XH,MaiCliServerToolSendUserFileLogic:fH,MaiCliServerToolSkillLogic:JH,MaiCliServerToolSleepLogic:QH,MaiCliServerToolSnipLogic:GH,MaiCliServerToolSubscribePrLogic:VH,MaiCliServerToolSuggestBackgroundPrLogic:BH,MaiCliServerToolSyntheticOutputLogic:zH,MaiCliServerToolTaskCreateLogic:jH,MaiCliServerToolTaskGetLogic:WH,MaiCliServerToolTaskListLogic:UH,MaiCliServerToolTaskOutputLogic:bH,MaiCliServerToolTaskStopLogic:HH,MaiCliServerToolTaskUpdateLogic:EH,MaiCliServerToolTeamCreateLogic:wH,MaiCliServerToolTeamDeleteLogic:FH,MaiCliServerToolTerminalCaptureLogic:DH,MaiCliServerToolTodoWriteLogic:NH,MaiCliServerToolToolSearchLogic:IH,MaiCliServerToolTungstenLogic:yH,MaiCliServerToolVerifyPlanExecutionLogic:_H,MaiCliServerToolWebBrowserLogic:PH,MaiCliServerToolWebFetchLogic:nH,MaiCliServerToolWebSearchLogic:rH,MaiCliServerToolWorkflowLogic:iH},rf0={MaiCliServerToolAdvisorLogicActionKeys:bf,MaiCliServerToolAgentLogicActionKeys:Ef,MaiCliServerToolAskUserQuestionLogicActionKeys:Ff,MaiCliServerToolAskUserTextLogicActionKeys:Nf,MaiCliServerToolBashLogicActionKeys:If,MaiCliServerToolBriefLogicActionKeys:_f,MaiCliServerToolConfigLogicActionKeys:qf,MaiCliServerToolCtxInspectLogicActionKeys:Tf,MaiCliServerToolDiscoverSkillsLogicActionKeys:Af,MaiCliServerToolEnterPlanModeLogicActionKeys:xf,MaiCliServerToolEnterWorktreeLogicActionKeys:uf,MaiCliServerToolExitPlanModeLogicActionKeys:Cf,MaiCliServerToolExitWorktreeLogicActionKeys:Mf,MaiCliServerToolFileEditLogicActionKeys:gf,MaiCliServerToolFileReadLogicActionKeys:mf,MaiCliServerToolFileWriteLogicActionKeys:lf,MaiCliServerToolGlobLogicActionKeys:nf,MaiCliServerToolGrepLogicActionKeys:of,MaiCliServerToolListMcpResourcesLogicActionKeys:af,MaiCliServerToolListPeersLogicActionKeys:ef,MaiCliServerToolLoopCancelLogicActionKeys:ZJ,MaiCliServerToolLspLogicActionKeys:YJ,MaiCliServerToolMcpAuthLogicActionKeys:fJ,MaiCliServerToolMcpLogicActionKeys:QJ,MaiCliServerToolMonitorLogicActionKeys:VJ,MaiCliServerToolNotebookEditLogicActionKeys:zJ,MaiCliServerToolOverflowTestLogicActionKeys:WJ,MaiCliServerToolPowerShellLogicActionKeys:bJ,MaiCliServerToolPushNotificationLogicActionKeys:EJ,MaiCliServerToolReadMcpResourceLogicActionKeys:FJ,MaiCliServerToolRemoteTriggerLogicActionKeys:NJ,MaiCliServerToolReplLogicActionKeys:yJ,MaiCliServerToolReviewArtifactLogicActionKeys:PJ,MaiCliServerToolScheduleCronLogicActionKeys:KJ,MaiCliServerToolSendMessageLogicActionKeys:RJ,MaiCliServerToolSendUserFileLogicActionKeys:kJ,MaiCliServerToolSkillLogicActionKeys:LJ,MaiCliServerToolSleepLogicActionKeys:hJ,MaiCliServerToolSnipLogicActionKeys:SJ,MaiCliServerToolSubscribePrLogicActionKeys:vJ,MaiCliServerToolSuggestBackgroundPrLogicActionKeys:pJ,MaiCliServerToolSyntheticOutputLogicActionKeys:cJ,MaiCliServerToolTaskCreateLogicActionKeys:dJ,MaiCliServerToolTaskGetLogicActionKeys:rJ,MaiCliServerToolTaskListLogicActionKeys:oJ,MaiCliServerToolTaskOutputLogicActionKeys:aJ,MaiCliServerToolTaskStopLogicActionKeys:eJ,MaiCliServerToolTaskUpdateLogicActionKeys:ZQ,MaiCliServerToolTeamCreateLogicActionKeys:YQ,MaiCliServerToolTeamDeleteLogicActionKeys:fQ,MaiCliServerToolTerminalCaptureLogicActionKeys:QQ,MaiCliServerToolTodoWriteLogicActionKeys:VQ,MaiCliServerToolToolSearchLogicActionKeys:zQ,MaiCliServerToolTungstenLogicActionKeys:WQ,MaiCliServerToolVerifyPlanExecutionLogicActionKeys:bQ,MaiCliServerToolWebBrowserLogicActionKeys:EQ,MaiCliServerToolWebFetchLogicActionKeys:FQ,MaiCliServerToolWebSearchLogicActionKeys:_Q,MaiCliServerToolWorkflowLogicActionKeys:qQ},if0={MaiCliServerToolAdvisorLogicStateKeys:Hf,MaiCliServerToolAgentLogicStateKeys:wf,MaiCliServerToolAskUserQuestionLogicStateKeys:Df,MaiCliServerToolBashLogicStateKeys:yf,MaiCliServerToolBriefLogicStateKeys:Pf,MaiCliServerToolConfigLogicStateKeys:Kf,MaiCliServerToolCtxInspectLogicStateKeys:Rf,MaiCliServerToolDiscoverSkillsLogicStateKeys:kf,MaiCliServerToolEnterPlanModeLogicStateKeys:Lf,MaiCliServerToolEnterWorktreeLogicStateKeys:hf,MaiCliServerToolExitPlanModeLogicStateKeys:Sf,MaiCliServerToolExitWorktreeLogicStateKeys:vf,MaiCliServerToolFileEditLogicStateKeys:pf,MaiCliServerToolFileReadLogicStateKeys:cf,MaiCliServerToolFileWriteLogicStateKeys:df,MaiCliServerToolGlobLogicStateKeys:rf,MaiCliServerToolGrepLogicStateKeys:sf,MaiCliServerToolListMcpResourcesLogicStateKeys:tf,MaiCliServerToolListPeersLogicStateKeys:$J,MaiCliServerToolLoopCancelLogicStateKeys:OJ,MaiCliServerToolLspLogicStateKeys:XJ,MaiCliServerToolMcpAuthLogicStateKeys:JJ,MaiCliServerToolMcpLogicStateKeys:GJ,MaiCliServerToolMonitorLogicStateKeys:BJ,MaiCliServerToolNotebookEditLogicStateKeys:jJ,MaiCliServerToolOverflowTestLogicStateKeys:UJ,MaiCliServerToolPowerShellLogicStateKeys:HJ,MaiCliServerToolPushNotificationLogicStateKeys:wJ,MaiCliServerToolReadMcpResourceLogicStateKeys:DJ,MaiCliServerToolRemoteTriggerLogicStateKeys:IJ,MaiCliServerToolReplLogicStateKeys:_J,MaiCliServerToolReviewArtifactLogicStateKeys:qJ,MaiCliServerToolScheduleCronLogicStateKeys:TJ,MaiCliServerToolSendMessageLogicStateKeys:AJ,MaiCliServerToolSendUserFileLogicStateKeys:xJ,MaiCliServerToolSkillLogicStateKeys:uJ,MaiCliServerToolSleepLogicStateKeys:CJ,MaiCliServerToolSnipLogicStateKeys:MJ,MaiCliServerToolSubscribePrLogicStateKeys:gJ,MaiCliServerToolSuggestBackgroundPrLogicStateKeys:mJ,MaiCliServerToolSyntheticOutputLogicStateKeys:lJ,MaiCliServerToolTaskCreateLogicStateKeys:nJ,MaiCliServerToolTaskGetLogicStateKeys:iJ,MaiCliServerToolTaskListLogicStateKeys:sJ,MaiCliServerToolTaskOutputLogicStateKeys:tJ,MaiCliServerToolTaskStopLogicStateKeys:$Q,MaiCliServerToolTaskUpdateLogicStateKeys:OQ,MaiCliServerToolTeamCreateLogicStateKeys:XQ,MaiCliServerToolTeamDeleteLogicStateKeys:JQ,MaiCliServerToolTerminalCaptureLogicStateKeys:GQ,MaiCliServerToolTodoWriteLogicStateKeys:BQ,MaiCliServerToolToolSearchLogicStateKeys:jQ,MaiCliServerToolTungstenLogicStateKeys:UQ,MaiCliServerToolVerifyPlanExecutionLogicStateKeys:HQ,MaiCliServerToolWebBrowserLogicStateKeys:wQ,MaiCliServerToolWebFetchLogicStateKeys:DQ,MaiCliServerToolWebSearchLogicStateKeys:PQ,MaiCliServerToolWorkflowLogicStateKeys:KQ};class TQ extends q{}TQ.SHELL_DOCTOR_SCREEN_RESULT="shell_doctor_screen_result",Q([I(!0,"shell_doctor_screen_result","MscCliShellDoctorScreenLogicActionModel"),z("design:type",Object)],TQ,"SHELL_DOCTOR_SCREEN_RESULT",void 0),TQ=Q([P()],TQ);class ru extends K{ok;data;error}class RQ extends A{}RQ.SHELL_DOCTOR_SCREEN_INVOKE="shell_doctor_screen_invoke",Q([D(!0,!0,"shell_doctor_screen_invoke"),z("design:type",Object)],RQ,"SHELL_DOCTOR_SCREEN_INVOKE",void 0),RQ=Q([R()],RQ);class oH extends N{onAttach(){super.onAttach()}onInstall(){super.onInstall()}onDetach(){super.onDetach()}handleStateEvent($){switch($.getMessage()){case RQ.SHELL_DOCTOR_SCREEN_INVOKE:this.handleInvoke($.getModel(),$.getSender());break;default:super.handleStateEvent($);break}}handleInvoke($,Z){let O=new ru;O.ok=!0,this.sendActionEvent(TQ.SHELL_DOCTOR_SCREEN_RESULT,O,Z)}}oH=Q([_(!0,TQ),T(!0,RQ),y()],oH);class AQ extends q{}AQ.SHELL_RESUME_SCREEN_RESULT="shell_resume_screen_result",Q([I(!0,"shell_resume_screen_result","MscCliShellResumeScreenLogicActionModel"),z("design:type",Object)],AQ,"SHELL_RESUME_SCREEN_RESULT",void 0),AQ=Q([P()],AQ);class iu extends K{ok;data;error}class kQ extends A{}kQ.SHELL_RESUME_SCREEN_INVOKE="shell_resume_screen_invoke",Q([D(!0,!0,"shell_resume_screen_invoke"),z("design:type",Object)],kQ,"SHELL_RESUME_SCREEN_INVOKE",void 0),kQ=Q([R()],kQ);class sH extends N{onAttach(){super.onAttach()}onInstall(){super.onInstall()}onDetach(){super.onDetach()}handleStateEvent($){switch($.getMessage()){case kQ.SHELL_RESUME_SCREEN_INVOKE:this.handleInvoke($.getModel(),$.getSender());break;default:super.handleStateEvent($);break}}handleInvoke($,Z){let O=new iu;O.ok=!0,this.sendActionEvent(AQ.SHELL_RESUME_SCREEN_RESULT,O,Z)}}sH=Q([_(!0,AQ),T(!0,kQ),y()],sH);class ou extends w${handleActionEvent($){super.handleActionEvent($)}}class su extends w${handleActionEvent($){switch($.getSender()){default:super.handleActionEvent($);break}}}class au extends w${handleActionEvent($){switch($.getSender()){default:super.handleActionEvent($);break}}}class tu extends w${handleActionEvent($){switch($.getSender()){default:super.handleActionEvent($);break}}}class eu extends w${handleActionEvent($){switch($.getSender()){default:super.handleActionEvent($);break}}}class $h extends w${handleActionEvent($){switch($.getSender()){default:super.handleActionEvent($);break}}}class Zh extends w${handleActionEvent($){switch($.getSender()){default:super.handleActionEvent($);break}}}class Oh extends w${handleActionEvent($){switch($.getSender()){default:super.handleActionEvent($);break}}}class Yh extends w${handleActionEvent($){switch($.getSender()){default:super.handleActionEvent($);break}}}class Xh extends w${handleActionEvent($){switch($.getSender()){default:super.handleActionEvent($);break}}}class fh{_dsl={mai_cli_server_dsl:Oc,cli_doctor_screen_dsl:Yc,cli_resume_screen_dsl:Xc};_view={};_logic={...i70,...m60,...nf0,...B70,...Z70,...$O0,...r60,...VO0,...y60,MscCliShellDoctorScreenLogic:oH,MscCliShellResumeScreenLogic:sH};_workflow={MaiCliServerRouterWorkflow:ou,MaiCliServerCoreWorkflow:su,MaiCliServerToolWorkflow:au,MaiCliServerServiceWorkflow:tu,MaiCliServerCommandWorkflow:eu,MaiCliServerRemoteWorkflow:$h,MaiCliServerSwarmWorkflow:Zh,MaiCliServerExtensionWorkflow:Oh,CliDoctorScreenWorkflow:Yh,CliResumeScreenWorkflow:Xh};_actionKeys={...o70,...c60,...rf0,...z70,...O70,...ZO0,...i60,...BO0,..._60,MscCliShellDoctorScreenLogicActionKeys:TQ,MscCliShellResumeScreenLogicActionKeys:AQ};_stateKeys={...s70,...l60,...if0,...j70,...Y70,...OO0,...o60,...zO0,...P60,MscCliShellDoctorScreenLogicStateKeys:RQ,MscCliShellResumeScreenLogicStateKeys:kQ};_sidecar={};appId(){return"stem"}view($){return this._view[$]}logic($){return this._logic[$]}workflow($){return this._workflow[$]}dsl($){return this._dsl[$]}actionKeys($){return this._actionKeys[$]}stateKeys($){return this._stateKeys[$]}sidecar($){return this._sidecar[$]}}var Jh=process.env.NEXT_PUBLIC_MSC_LOG_OPEN==="true";function VS0($){if($===null||$===void 0)return null;if(typeof $==="string")return $;try{return JSON.stringify($)}catch{return null}}function Qh($){if($==="???")console.warn("[MscLog] tag is missing, caller stack:",Error().stack)}function Gh($,Z,O){let Y=VS0(O);if(Y!==null)return`${$} ${Z}
|
|
1439
1439
|
${Y}`;return`${$} ${Z}`}function BS0($,Z,O="???"){if(Jh)Qh(O),console.log(Gh(`[MscInfo | ${O}]`,$,Z))}function zS0($,Z,O="???"){if(Jh)Qh(O),console.warn(Gh(`[MscWarn | ${O}]`,$,Z))}function jS0($,Z,O="???"){if(Jh)Qh(O),console.error(Gh(`[MscError | ${O}]`,$,Z))}var QN={infoLog:BS0,warnLog:zS0,errorLog:jS0};function WS0($,Z,O){QN.infoLog(Z,O,$)}function US0($,Z,O){QN.warnLog(Z,O,$)}function bS0($,Z,O){QN.errorLog(Z,O,$)}var n4={trackInfo:WS0,trackWarn:US0,trackError:bS0};class Vh{dsl;debug;mscInstance;requestCount=0;constructor($,Z){if(this.debug=Z,!p1.isRegistryMscEnv())p1.registryMscEnv(new fh);this.handleContainerDsl($)}handleContainerDsl($){let Z=p1.MscEnv().dsl($);if(Z)Z(),this.dsl=$}handlerCreateContainer($){if(!this.mscInstance&&this.dsl)this.mscInstance=new Rm(this.debug).dls(this.dsl).observer({handleActionEvent(Z){$.onActionEvent(Z)},handleStateEvent(Z){$.onStateEvent(Z)},handleLifecycleEvent(Z){$.onLifecycleEvent(Z)},handleErrorEvent(Z){$.onErrorEvent(Z)}}).build(),this.mscInstance.install()}handleDestroyContainer(){try{if(this.mscInstance)this.mscInstance.uninstall(),this.mscInstance=null}catch($){n4.trackError("MscCliContainer",`handleDestroyContainer error: ${$}`)}}handleContainerStateEvent($){if(this.requestCount++,this.requestCount%1000===0){let Z=process.memoryUsage();n4.trackInfo("MscCliContainer",`[MemProbe] dsl=${this.dsl} req#${this.requestCount} heapUsed=${(Z.heapUsed/1024/1024).toFixed(1)}MB heapTotal=${(Z.heapTotal/1024/1024).toFixed(1)}MB external=${(Z.external/1024/1024).toFixed(1)}MB`)}if(this.mscInstance)this.mscInstance.sendState($)}}class Bh{listeners=new Set;addListener($){this.listeners.add($)}removeListener($){this.listeners.delete($)}onActionEvent($){this.listeners.forEach((Z)=>Z.onActionEvent($))}onStateEvent($){this.listeners.forEach((Z)=>Z.onStateEvent($))}onLifecycleEvent($){this.listeners.forEach((Z)=>Z.onLifecycleEvent($))}onErrorEvent($){this.listeners.forEach((Z)=>Z.onErrorEvent($))}}var HS0=600000;class V5{static _instanceKey=Symbol.for("MscCliManager");static getInstance(){let $=globalThis;if(!$[V5._instanceKey])$[V5._instanceKey]=new V5;return $[V5._instanceKey]}constructor(){}entries=new Map;reuseCount=new Map;getServerContainer($){let Z=this.entries.get($);if(Z){let O=(this.reuseCount.get($)??0)+1;if(this.reuseCount.set($,O),O%1000===0)n4.trackInfo("MscCliManager",`MscCliContainer Reuse #${O} for dsl: ${$}, tag: ${Z.tag}`)}else{let O=Date.now().toString();n4.trackInfo("MscCliManager",`MscCliContainer Create for dsl: ${$}, tag: ${O}`);let Y=new Vh($),X=new Bh,f=new Map,J={onActionEvent(G){let V=f.get(G.getReceiver());if(V){V.timing.t3=Date.now(),clearTimeout(V.timer),f.delete(G.getReceiver());let B=G.getModel();V.resolve({receiver:G.getReceiver(),model:B,tag:O,timing:V.timing})}},onErrorEvent(G){let V=f.get(G.getReceiver());if(V)V.timing.t3=Date.now(),clearTimeout(V.timer),f.delete(G.getReceiver()),V.reject({receiver:G.getReceiver(),error:G.getMessage(),tag:O,timing:V.timing})},onLifecycleEvent(G){},onStateEvent(G){}};X.addListener(J),Y.handlerCreateContainer(X),Z={container:Y,listener:X,pendingRequests:f,tag:O},this.entries.set($,Z)}return Z}warmupContainer($){this.getServerContainer($)}handleContainerEvent($,Z,O=HS0){let Y=Date.now(),{container:X,pendingRequests:f}=this.getServerContainer($),J=Date.now();if(f.has(Z.sender))return Promise.reject({error:`request ${Z.sender} is already in progress`});return new Promise((G,V)=>{let B=setTimeout(()=>{f.delete(Z.sender),V({error:`request ${Z.sender} timed out after ${O}ms`})},O),j={t0:Y,t1:J,t2:0,t3:0},W=Date.now();j.t2=W,f.set(Z.sender,{resolve:G,reject:V,timer:B,timing:j}),X.handleContainerStateEvent(Z)})}bumpRequestTimer($,Z,O){let Y=this.entries.get($);if(!Y)return!1;let X=Y.pendingRequests.get(Z);if(!X)return!1;return clearTimeout(X.timer),X.timer=setTimeout(()=>{Y.pendingRequests.delete(Z),X.reject({error:`request ${Z} idle for ${O}ms`})},O),!0}handleContainerDestroy($){let Z=this.entries.get($);if(Z){for(let[,O]of Z.pendingRequests)clearTimeout(O.timer),O.reject({error:`container destroyed for dsl: ${$}`});Z.pendingRequests.clear(),Z.container.handleDestroyContainer(),this.entries.delete($)}}}O$();O$();import{mkdirSync as ES0}from"node:fs";import{join as of0}from"node:path";function sf0($=process.env.CALLER_DIR||process.cwd()){if(!WE())return;let Z=[a1($),of0(w1(),"projects"),uQ(of0($,"logs")),...Object.keys(x_).map((O)=>u_(O,$))];for(let O of Z)try{ES0(O,{recursive:!0})}catch{}}var af0="mai_cli_server_dsl";function FS0(){let $=new Map;for(let Z of ow()){let O=Z.name.replace(/^MaiCliServerTool/,"").replace(/Logic$/,"").replace(/([a-z0-9])([A-Z])/g,"$1_$2").toLowerCase(),Y=`tool_${O}`,X={logicName:Z.name,stateKey:`${Y}_invoke`,toolName:Y};$.set(Y,X),$.set(O,X)}return $}function DS0($){return{name:$.toolName,description:w("mcp.toolDescription",{logicName:$.logicName}),inputSchema:{type:"object",additionalProperties:!0}}}function tf0($){if(typeof $==="string")return $;return JSON.stringify($??null,null,2)}async function NS0(){let{locale:$}=V_(process.argv.slice(2));if(jc($),process.env.STEM_TENANT_INVALID!==void 0)process.stderr.write((process.env.STEM_TENANT_INVALID_NPM?w("errors.invalidTenantNpmForm"):w("errors.invalidTenant",{code:process.env.STEM_TENANT_INVALID,rule:String(IN)}))+`
|
|
1440
|
-
`),process.exit(1);sf0();let Z=FS0(),O=V5.getInstance();O.warmupContainer(af0);let Y=new fy({name:"stem/msc",version:{VERSION:"0.0.
|
|
1440
|
+
`),process.exit(1);sf0();let Z=FS0(),O=V5.getInstance();O.warmupContainer(af0);let Y=new fy({name:"stem/msc",version:{VERSION:"0.0.4",PACKAGE_URL:"@mortiseai/stem",NATIVE_PACKAGE_URL:"@mortiseai/stem",BUILD_TIME:"2026-07-28T13:26:13.277Z",FEEDBACK_CHANNEL:"npm",MSC_ENGINE_VERSION:"0.0.3"}.VERSION},{capabilities:{tools:{}}});Y.setRequestHandler(nN,async()=>({tools:[...new Map([...Z.values()].map((X)=>[X.toolName,X])).values()].map(DS0)})),Y.setRequestHandler(JB,async({params:X})=>{let f=Z.get(X.name);if(!f)return{isError:!0,content:[{type:"text",text:w("mcp.unknownTool",{name:X.name})}]};try{let J=await O.handleContainerEvent(af0,{sender:wS0(),receiver:f.logicName,message:f.stateKey,model:{payload:X.arguments??{}}});return{content:[{type:"text",text:tf0(J.model)}]}}catch(J){return{isError:!0,content:[{type:"text",text:J instanceof Error?J.message:tf0(J)}]}}}),await Y.connect(new Jy)}await NS0();export{NS0 as startMcpServer};
|