@markus-global/cli 0.9.3 → 0.9.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/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +4 -0
- package/dist/commands/start.js.map +1 -1
- package/dist/markus.mjs +310 -109
- package/dist/web-ui/assets/{CommentInput-BaiGciCW.js → CommentInput-C4c__bEq.js} +1 -1
- package/dist/web-ui/assets/{ContentRenderer-BHP-QQl1.js → ContentRenderer-C3AbrVxu.js} +2 -2
- package/dist/web-ui/assets/{Deliverables-CxmSjC62.js → Deliverables-CaVRG9uL.js} +1 -1
- package/dist/web-ui/assets/{Notifications-DN71_xBe.js → Notifications-Dhiofjhs.js} +1 -1
- package/dist/web-ui/assets/{Search-BehRlzl9.js → Search-D3CaLHxp.js} +1 -1
- package/dist/web-ui/assets/{Settings-DACkioN7.js → Settings-DIgsyjyV.js} +1 -1
- package/dist/web-ui/assets/{Store-vbX7udKk.js → Store-CI404nno.js} +1 -1
- package/dist/web-ui/assets/{Team-fYRACN64.js → Team-Cl0ifhel.js} +4 -4
- package/dist/web-ui/assets/{Work-CsRMLGyO.js → Work-fzTyK5Bb.js} +1 -1
- package/dist/web-ui/assets/{arc-CkYEFYhN.js → arc-WeT_hy0W.js} +1 -1
- package/dist/web-ui/assets/{architectureDiagram-3BPJPVTR-DidH7EEL.js → architectureDiagram-3BPJPVTR-BCVvz19o.js} +1 -1
- package/dist/web-ui/assets/{blockDiagram-GPEHLZMM-Dfyl794X.js → blockDiagram-GPEHLZMM-Bu6Xf8R8.js} +1 -1
- package/dist/web-ui/assets/{c4Diagram-AAUBKEIU-DJ8uivTJ.js → c4Diagram-AAUBKEIU-CNXRbDz0.js} +1 -1
- package/dist/web-ui/assets/channel-CgQ1452y.js +1 -0
- package/dist/web-ui/assets/{chunk-2J33WTMH-r6qd3avZ.js → chunk-2J33WTMH-zowauCer.js} +1 -1
- package/dist/web-ui/assets/{chunk-4BX2VUAB-JGVVxl3S.js → chunk-4BX2VUAB-CtdE-N9t.js} +1 -1
- package/dist/web-ui/assets/{chunk-55IACEB6-DrqEO6pb.js → chunk-55IACEB6-CtcDguaE.js} +1 -1
- package/dist/web-ui/assets/{chunk-727SXJPM-BEvPkInC.js → chunk-727SXJPM-vkstXMAh.js} +1 -1
- package/dist/web-ui/assets/{chunk-AQP2D5EJ-nY9-IZSQ.js → chunk-AQP2D5EJ-CGQQxJGx.js} +1 -1
- package/dist/web-ui/assets/{chunk-FMBD7UC4-B2X9_WVL.js → chunk-FMBD7UC4-P_DVWxcv.js} +1 -1
- package/dist/web-ui/assets/{chunk-ND2GUHAM-hAHQCUDr.js → chunk-ND2GUHAM-BoDcRFNz.js} +1 -1
- package/dist/web-ui/assets/{chunk-QZHKN3VN-BpSI5bvk.js → chunk-QZHKN3VN-UpP-oGbp.js} +1 -1
- package/dist/web-ui/assets/classDiagram-4FO5ZUOK-cyuFA4TK.js +1 -0
- package/dist/web-ui/assets/classDiagram-v2-Q7XG4LA2-cyuFA4TK.js +1 -0
- package/dist/web-ui/assets/{cose-bilkent-S5V4N54A-CisI94Jk.js → cose-bilkent-S5V4N54A-CoxnfYwV.js} +1 -1
- package/dist/web-ui/assets/{dagre-BM42HDAG-CzXJLJs_.js → dagre-BM42HDAG-C-_qqM-2.js} +1 -1
- package/dist/web-ui/assets/{diagram-2AECGRRQ-HbWovRxT.js → diagram-2AECGRRQ-Dq4gNWvg.js} +1 -1
- package/dist/web-ui/assets/{diagram-5GNKFQAL-Wh4LwHDk.js → diagram-5GNKFQAL-Di6LUbag.js} +1 -1
- package/dist/web-ui/assets/{diagram-KO2AKTUF-bVFH4Uh0.js → diagram-KO2AKTUF-DJUoGsAO.js} +1 -1
- package/dist/web-ui/assets/{diagram-LMA3HP47-D-y5-DUp.js → diagram-LMA3HP47-DocVuWYa.js} +1 -1
- package/dist/web-ui/assets/{diagram-OG6HWLK6-DQn31vSY.js → diagram-OG6HWLK6-YteSCE_B.js} +1 -1
- package/dist/web-ui/assets/{erDiagram-TEJ5UH35-B2tUGLya.js → erDiagram-TEJ5UH35-BBusZqGh.js} +1 -1
- package/dist/web-ui/assets/{flowDiagram-I6XJVG4X-aljCbWZ3.js → flowDiagram-I6XJVG4X-BvvWdmCF.js} +1 -1
- package/dist/web-ui/assets/{ganttDiagram-6RSMTGT7-C5nFi9-r.js → ganttDiagram-6RSMTGT7-D7n83rg1.js} +1 -1
- package/dist/web-ui/assets/{gitGraphDiagram-PVQCEYII-_thR_kyI.js → gitGraphDiagram-PVQCEYII-Br__nsx4.js} +1 -1
- package/dist/web-ui/assets/{index-DipPqBFp.js → index-CDGrYm4a.js} +7 -7
- package/dist/web-ui/assets/{infoDiagram-5YYISTIA-CVAuHVqP.js → infoDiagram-5YYISTIA-Bug574VW.js} +1 -1
- package/dist/web-ui/assets/{ishikawaDiagram-YF4QCWOH-zFca2XEY.js → ishikawaDiagram-YF4QCWOH-BQRJpWeM.js} +1 -1
- package/dist/web-ui/assets/{journeyDiagram-JHISSGLW-DlmhvDWu.js → journeyDiagram-JHISSGLW-BcuTNZHZ.js} +1 -1
- package/dist/web-ui/assets/{kanban-definition-UN3LZRKU-qgul2AZY.js → kanban-definition-UN3LZRKU-CmfyD4gt.js} +1 -1
- package/dist/web-ui/assets/{mermaid.core-Bz8NDw6F.js → mermaid.core-DCGJ6Yif.js} +5 -5
- package/dist/web-ui/assets/{mindmap-definition-RKZ34NQL-C8lzYJ-U.js → mindmap-definition-RKZ34NQL-Dc732LSM.js} +1 -1
- package/dist/web-ui/assets/{pieDiagram-4H26LBE5-CNefdc8U.js → pieDiagram-4H26LBE5-B5QXo63M.js} +1 -1
- package/dist/web-ui/assets/{quadrantDiagram-W4KKPZXB-hy2G_8sj.js → quadrantDiagram-W4KKPZXB-dltvEmWO.js} +1 -1
- package/dist/web-ui/assets/{requirementDiagram-4Y6WPE33-D_Yf2oYz.js → requirementDiagram-4Y6WPE33-hquMkJIg.js} +1 -1
- package/dist/web-ui/assets/{sankeyDiagram-5OEKKPKP-D9LXC3WW.js → sankeyDiagram-5OEKKPKP-BxAGluXl.js} +1 -1
- package/dist/web-ui/assets/{sequenceDiagram-3UESZ5HK-B2MTe0br.js → sequenceDiagram-3UESZ5HK-B4MF-94i.js} +1 -1
- package/dist/web-ui/assets/{stateDiagram-AJRCARHV-C3vkopIl.js → stateDiagram-AJRCARHV-C1bLRYZl.js} +1 -1
- package/dist/web-ui/assets/stateDiagram-v2-BHNVJYJU-DAoY1cQp.js +1 -0
- package/dist/web-ui/assets/{timeline-definition-PNZ67QCA-C3Pm0-dr.js → timeline-definition-PNZ67QCA-BWIogZck.js} +1 -1
- package/dist/web-ui/assets/{vennDiagram-CIIHVFJN-BqMHe4cb.js → vennDiagram-CIIHVFJN-D1dMEYNI.js} +1 -1
- package/dist/web-ui/assets/{wardley-L42UT6IY-WX37pf9e.js → wardley-L42UT6IY-B7PrCpui.js} +1 -1
- package/dist/web-ui/assets/{wardleyDiagram-YWT4CUSO-BXaXNc3h.js → wardleyDiagram-YWT4CUSO-BnepdOhb.js} +1 -1
- package/dist/web-ui/assets/{xychartDiagram-2RQKCTM6-QNJQqpdG.js → xychartDiagram-2RQKCTM6-DC6jHTfT.js} +1 -1
- package/dist/web-ui/index.html +1 -1
- package/package.json +1 -1
- package/dist/web-ui/assets/channel-Dis64XIP.js +0 -1
- package/dist/web-ui/assets/classDiagram-4FO5ZUOK-uL-MmcmF.js +0 -1
- package/dist/web-ui/assets/classDiagram-v2-Q7XG4LA2-uL-MmcmF.js +0 -1
- package/dist/web-ui/assets/stateDiagram-v2-BHNVJYJU-CpqVKXYT.js +0 -1
package/dist/markus.mjs
CHANGED
|
@@ -5074,7 +5074,7 @@ function clampHeartbeatIntervalMs(ms) {
|
|
|
5074
5074
|
return DEFAULT_HEARTBEAT_INTERVAL_MS;
|
|
5075
5075
|
return Math.max(MIN_HEARTBEAT_INTERVAL_MS, Math.min(MAX_HEARTBEAT_INTERVAL_MS, Math.round(ms)));
|
|
5076
5076
|
}
|
|
5077
|
-
var TASK_GET_NOTES_DEFAULT, TASK_GET_DELIVERABLES_DEFAULT, TASK_GET_STATUS_HISTORY_DEFAULT, REQUIREMENT_LIST_DEFAULT, ENTITY_COMMENTS_DEFAULT, PROMPT_TASK_NOTES_MAX, PROMPT_TASK_NOTE_CHARS, PROMPT_DEP_NOTES_MAX, PROMPT_DEP_NOTE_CHARS, PROMPT_DEP_DESC_CHARS, PROMPT_EXECUTION_ROUNDS_MAX, PROMPT_LOG_ENTRY_CHARS, PROMPT_RECENT_ERRORS_MAX, PROMPT_HUMAN_COMMENTS_MAX, REVIEWER_NOTES_MAX, SYSTEM_MY_TASKS_MAX, SYSTEM_TEAM_TASKS_MAX, SYSTEM_TASK_DESC_CHARS, PROMPT_PROJECT_DESC_CHARS, PROMPT_REQUIREMENT_DESC_CHARS, REVIEWER_FILE_LIST_MAX, DELIVERABLE_TITLE_CHARS, REVISION_REASON_CHARS, TASK_MAX_RETRIES, MAILBOX_ITEM_MAX_RETRIES, COMPLETION_MARKER, COMPLETION_MARKER_INSTRUCTION, COMPLETION_MARKER_LEAK_RE, TASK_MAX_NO_SUBMIT_RETRIES, TASK_RETRY_DELAYS_MS, PREEMPT_REQUEUE_DELAY_MS, SYSTEM_KNOWLEDGE_CHARS, SYSTEM_SOPS_CHARS, SYSTEM_LONGTERM_MEMORY_CHARS, MEMORY_MD_SECTION_MAX_CHARS, MEMORY_MD_TOTAL_MAX_CHARS, SYSTEM_LESSON_ENTRIES_MAX, SYSTEM_BEST_PRACTICE_ENTRIES_MAX, SYSTEM_DELIVERABLES_CHARS, SYSTEM_DAILY_LOG_CHARS, SYSTEM_DAILY_LOG_DAYS, SYSTEM_USER_PROFILE_CHARS, SYSTEM_CHAT_SESSIONS_MAX, HEARTBEAT_DAILY_LOG_CHARS, SYSTEM_PROJECT_DESC_CHARS, SYSTEM_DELIVERABLE_PREVIEW_CHARS, SYSTEM_MAILBOX_MERGED_CHARS, SYSTEM_MAILBOX_ITEM_PREVIEW_CHARS, TASK_LIST_PAGE_SIZE, TASK_LIST_PAGE_MAX, ARCHIVE_COMPLETED_AFTER_DAYS, ARCHIVE_TERMINAL_AFTER_DAYS, ARCHIVE_REQUIREMENT_AFTER_DAYS, ARCHIVE_SCAN_INTERVAL_MS, CHANNEL_CONTEXT_MESSAGES, MAILBOX_QUEUED_TTL_MS, MAILBOX_COALESCE_WINDOW_MS, MAILBOX_PROCESSING_TIMEOUT_MS, SSE_DISCONNECT_FORCE_STOP_MS, WATCHDOG_INTERVAL_MS, WATCHDOG_DRIFT_THRESHOLD_MS, TRIAGE_BACKLOG_THRESHOLD, TRIAGE_PROMPT_MAX_ITEMS, TRIAGE_MAX_TOKENS, TRIAGE_TEMPERATURE, TRIAGE_CONTEXT_MESSAGES_MAX, TRIAGE_CONTEXT_MSG_CHARS, TRIAGE_ITEM_CONTENT_CHARS, TRIAGE_STALE_INFO_TTL_MS, TRIAGE_STALE_DROP_TYPES, TRIAGE_MAX_TOOL_ITERATIONS, TRIAGE_ALLOWED_TOOLS, DELIBERATION_ALLOWED_TOOLS, DEFAULT_HEARTBEAT_INTERVAL_MS, MIN_HEARTBEAT_INTERVAL_MS, MAX_HEARTBEAT_INTERVAL_MS, NOTEBOOK_MAX_AGENT_ENTRIES, NOTEBOOK_MAX_CHARS_PER_ENTRY, WORKING_MEMORY_MAX_ENTRIES, WORKING_MEMORY_MAX_CHARS, SUBAGENT_TASK_PREVIEW_CHARS, SUBAGENT_THINKING_PREVIEW_CHARS, SUBAGENT_RESULT_PREVIEW_CHARS, SUBAGENT_LOG_ENTRY_CHARS, SUBAGENT_ERROR_PREVIEW_CHARS, SUBAGENT_MAX_PARALLEL, SUBAGENT_MAX_AGGREGATE_ITERATIONS, SUBAGENT_MAX_LLM_RETRIES, SUBAGENT_RETRY_BASE_MS, SHELL_TIMEOUT_DEFAULT_MS, SHELL_TIMEOUT_MAX_MS, SHELL_MAX_SESSIONS_PER_AGENT, SHELL_SESSION_IDLE_TIMEOUT_MS, SHELL_SESSION_MAX_OUTPUT_BYTES, APPROVAL_WAIT_TIMEOUT_MS, HEARTBEAT_MIN_INITIAL_DELAY_MS, HEARTBEAT_STARTUP_JITTER_MS, LLM_CIRCUIT_RESET_RATE_LIMIT_MS, SESSION_STORAGE_COMPACT_TRIGGER, SESSION_STORAGE_COMPACT_KEEP, SESSION_STORAGE_TOOL_SHRINK_CHARS, CONTEXT_ABSURD_MESSAGE_CHARS, CONTEXT_PROACTIVE_COMPACT_RATIO, SESSION_RESTORE_MAX_MESSAGES, SESSION_RESTORE_MAX_MESSAGE_TOKENS, TOOL_RESULT_OFFLOAD_CHARS, SYSTEM_COLLEAGUES_MAX, SYSTEM_OTHER_TEAMS_MAX, SYSTEM_OTHER_TEAM_MEMBERS_MAX, SYSTEM_HUMANS_MAX, PROMPT_AFFORD_OUTPUT_RESERVE, TOOL_DEF_BUDGET_REFLEX, TOOL_DEF_BUDGET_CONVERSE, TOOL_DEF_BUDGET_EXECUTE, TOOL_DEF_BUDGET_GOVERN, ROLE_PROMPT_MAX_TOKENS, KNOWLEDGE_PROMPT_MAX_TOKENS, KNOWLEDGE_PROMPT_MAX_TOKENS_REFLEX, STATE_PROMPT_MAX_LINES_REFLEX, STATE_TTL_DAYS, COLD_CONVERSE_FIXED_MAX, COLD_REFLEX_FIXED_MAX, SYSTEM_PROMPT_BUDGET_CONVERSE, DEFERRED_CATALOG_MAX_CHARS, MAX_TOKENS_AFFORD_SAFETY, MAX_TOKENS_REMAINING_MARGIN, MAX_TOKENS_CLAMP_FLOOR, DEEP_SLEEP_IDLE_HEARTBEATS, SUBTASK_SOFT_CAP, PROMPT_AFFORD_SAFETY_MARGIN, LLM_MAX_CONCURRENT_PER_PROVIDER, LLM_CONCURRENCY_JITTER_BASE_MS;
|
|
5077
|
+
var TASK_GET_NOTES_DEFAULT, TASK_GET_DELIVERABLES_DEFAULT, TASK_GET_STATUS_HISTORY_DEFAULT, REQUIREMENT_LIST_DEFAULT, ENTITY_COMMENTS_DEFAULT, PROMPT_TASK_NOTES_MAX, PROMPT_TASK_NOTE_CHARS, PROMPT_DEP_NOTES_MAX, PROMPT_DEP_NOTE_CHARS, PROMPT_DEP_DESC_CHARS, PROMPT_EXECUTION_ROUNDS_MAX, PROMPT_LOG_ENTRY_CHARS, PROMPT_RECENT_ERRORS_MAX, PROMPT_HUMAN_COMMENTS_MAX, REVIEWER_NOTES_MAX, SYSTEM_MY_TASKS_MAX, SYSTEM_TEAM_TASKS_MAX, SYSTEM_TASK_DESC_CHARS, PROMPT_PROJECT_DESC_CHARS, PROMPT_REQUIREMENT_DESC_CHARS, REVIEWER_FILE_LIST_MAX, DELIVERABLE_TITLE_CHARS, REVISION_REASON_CHARS, TASK_MAX_RETRIES, MAILBOX_ITEM_MAX_RETRIES, COMPLETION_MARKER, COMPLETION_MARKER_INSTRUCTION, COMPLETION_MARKER_LEAK_RE, TASK_MAX_NO_SUBMIT_RETRIES, TASK_RETRY_DELAYS_MS, PREEMPT_REQUEUE_DELAY_MS, SYSTEM_KNOWLEDGE_CHARS, SYSTEM_SOPS_CHARS, SYSTEM_LONGTERM_MEMORY_CHARS, MEMORY_MD_SECTION_MAX_CHARS, MEMORY_MD_TOTAL_MAX_CHARS, SYSTEM_LESSON_ENTRIES_MAX, SYSTEM_BEST_PRACTICE_ENTRIES_MAX, SYSTEM_DELIVERABLES_CHARS, SYSTEM_DAILY_LOG_CHARS, SYSTEM_DAILY_LOG_DAYS, SYSTEM_USER_PROFILE_CHARS, SYSTEM_CHAT_SESSIONS_MAX, HEARTBEAT_DAILY_LOG_CHARS, SYSTEM_PROJECT_DESC_CHARS, SYSTEM_DELIVERABLE_PREVIEW_CHARS, SYSTEM_MAILBOX_MERGED_CHARS, SYSTEM_MAILBOX_ITEM_PREVIEW_CHARS, TASK_LIST_PAGE_SIZE, TASK_LIST_PAGE_MAX, ARCHIVE_COMPLETED_AFTER_DAYS, ARCHIVE_TERMINAL_AFTER_DAYS, ARCHIVE_REQUIREMENT_AFTER_DAYS, ARCHIVE_SCAN_INTERVAL_MS, CHANNEL_CONTEXT_MESSAGES, MAILBOX_QUEUED_TTL_MS, MAILBOX_COALESCE_WINDOW_MS, MAILBOX_PROCESSING_TIMEOUT_MS, SSE_DISCONNECT_FORCE_STOP_MS, WATCHDOG_INTERVAL_MS, WATCHDOG_DRIFT_THRESHOLD_MS, TRIAGE_BACKLOG_THRESHOLD, TRIAGE_PROMPT_MAX_ITEMS, TRIAGE_MAX_TOKENS, TRIAGE_TEMPERATURE, TRIAGE_CONTEXT_MESSAGES_MAX, TRIAGE_CONTEXT_MSG_CHARS, TRIAGE_ITEM_CONTENT_CHARS, TRIAGE_STALE_INFO_TTL_MS, TRIAGE_STALE_DROP_TYPES, TRIAGE_MAX_TOOL_ITERATIONS, TRIAGE_ALLOWED_TOOLS, DELIBERATION_ALLOWED_TOOLS, DEFAULT_HEARTBEAT_INTERVAL_MS, MIN_HEARTBEAT_INTERVAL_MS, MAX_HEARTBEAT_INTERVAL_MS, NOTEBOOK_MAX_AGENT_ENTRIES, NOTEBOOK_MAX_CHARS_PER_ENTRY, WORKING_MEMORY_MAX_ENTRIES, WORKING_MEMORY_MAX_CHARS, SUBAGENT_TASK_PREVIEW_CHARS, SUBAGENT_THINKING_PREVIEW_CHARS, SUBAGENT_RESULT_PREVIEW_CHARS, SUBAGENT_LOG_ENTRY_CHARS, SUBAGENT_ERROR_PREVIEW_CHARS, SUBAGENT_MAX_PARALLEL, SUBAGENT_MAX_AGGREGATE_ITERATIONS, SUBAGENT_MAX_LLM_RETRIES, SUBAGENT_RETRY_BASE_MS, SHELL_TIMEOUT_DEFAULT_MS, SHELL_TIMEOUT_MAX_MS, SHELL_MAX_SESSIONS_PER_AGENT, SHELL_SESSION_IDLE_TIMEOUT_MS, SHELL_SESSION_MAX_OUTPUT_BYTES, APPROVAL_WAIT_TIMEOUT_MS, HEARTBEAT_MIN_INITIAL_DELAY_MS, HEARTBEAT_STARTUP_JITTER_MS, LLM_CIRCUIT_RESET_RATE_LIMIT_MS, SESSION_STORAGE_COMPACT_TRIGGER, SESSION_STORAGE_COMPACT_KEEP, SESSION_STORAGE_TOOL_SHRINK_CHARS, CONTEXT_ABSURD_MESSAGE_CHARS, CONTEXT_PROACTIVE_COMPACT_RATIO, SESSION_RESTORE_MAX_MESSAGES, SESSION_RESTORE_MAX_MESSAGE_TOKENS, TOOL_RESULT_OFFLOAD_CHARS, SYSTEM_COLLEAGUES_MAX, SYSTEM_OTHER_TEAMS_MAX, SYSTEM_OTHER_TEAM_MEMBERS_MAX, SYSTEM_HUMANS_MAX, PROMPT_AFFORD_OUTPUT_RESERVE, TOOL_DEF_BUDGET_REFLEX, TOOL_DEF_BUDGET_CONVERSE, TOOL_DEF_BUDGET_EXECUTE, TOOL_DEF_BUDGET_GOVERN, ROLE_PROMPT_MAX_TOKENS, KNOWLEDGE_PROMPT_MAX_TOKENS, KNOWLEDGE_PROMPT_MAX_TOKENS_CONVERSE, KNOWLEDGE_PROMPT_MAX_TOKENS_REFLEX, STATE_PROMPT_MAX_LINES_REFLEX, STATE_TTL_DAYS, COLD_CONVERSE_FIXED_MAX, COLD_REFLEX_FIXED_MAX, SYSTEM_PROMPT_BUDGET_CONVERSE, SYSTEM_ANNOUNCEMENTS_CHARS_CONVERSE, SYSTEM_NORMS_CHARS_CONVERSE, SYSTEM_ANNOUNCEMENTS_CHARS, SYSTEM_NORMS_CHARS, SYSTEM_WORKFLOWS_MAX_CONVERSE, SYSTEM_WORKFLOW_DESC_CHARS_CONVERSE, SYSTEM_DYNAMIC_CONTEXT_CHARS_CONVERSE, DEFERRED_CATALOG_MAX_CHARS, MAX_TOKENS_AFFORD_SAFETY, MAX_TOKENS_REMAINING_MARGIN, MAX_TOKENS_CLAMP_FLOOR, DEEP_SLEEP_IDLE_HEARTBEATS, SUBTASK_SOFT_CAP, PROMPT_AFFORD_SAFETY_MARGIN, LLM_MAX_CONCURRENT_PER_PROVIDER, LLM_CONCURRENCY_JITTER_BASE_MS;
|
|
5078
5078
|
var init_limits = __esm({
|
|
5079
5079
|
"../shared/dist/limits.js"() {
|
|
5080
5080
|
"use strict";
|
|
@@ -5247,12 +5247,20 @@ var init_limits = __esm({
|
|
|
5247
5247
|
TOOL_DEF_BUDGET_GOVERN = 8e3;
|
|
5248
5248
|
ROLE_PROMPT_MAX_TOKENS = 2500;
|
|
5249
5249
|
KNOWLEDGE_PROMPT_MAX_TOKENS = 1500;
|
|
5250
|
+
KNOWLEDGE_PROMPT_MAX_TOKENS_CONVERSE = 1e3;
|
|
5250
5251
|
KNOWLEDGE_PROMPT_MAX_TOKENS_REFLEX = 0;
|
|
5251
5252
|
STATE_PROMPT_MAX_LINES_REFLEX = 5;
|
|
5252
5253
|
STATE_TTL_DAYS = 7;
|
|
5253
5254
|
COLD_CONVERSE_FIXED_MAX = 12e3;
|
|
5254
5255
|
COLD_REFLEX_FIXED_MAX = 8e3;
|
|
5255
5256
|
SYSTEM_PROMPT_BUDGET_CONVERSE = 8e3;
|
|
5257
|
+
SYSTEM_ANNOUNCEMENTS_CHARS_CONVERSE = 400;
|
|
5258
|
+
SYSTEM_NORMS_CHARS_CONVERSE = 400;
|
|
5259
|
+
SYSTEM_ANNOUNCEMENTS_CHARS = 2e3;
|
|
5260
|
+
SYSTEM_NORMS_CHARS = 2e3;
|
|
5261
|
+
SYSTEM_WORKFLOWS_MAX_CONVERSE = 3;
|
|
5262
|
+
SYSTEM_WORKFLOW_DESC_CHARS_CONVERSE = 80;
|
|
5263
|
+
SYSTEM_DYNAMIC_CONTEXT_CHARS_CONVERSE = 800;
|
|
5256
5264
|
DEFERRED_CATALOG_MAX_CHARS = 1500;
|
|
5257
5265
|
MAX_TOKENS_AFFORD_SAFETY = 64;
|
|
5258
5266
|
MAX_TOKENS_REMAINING_MARGIN = 500;
|
|
@@ -5379,6 +5387,7 @@ __export(dist_exports, {
|
|
|
5379
5387
|
HEARTBEAT_MIN_INITIAL_DELAY_MS: () => HEARTBEAT_MIN_INITIAL_DELAY_MS,
|
|
5380
5388
|
HEARTBEAT_STARTUP_JITTER_MS: () => HEARTBEAT_STARTUP_JITTER_MS,
|
|
5381
5389
|
KNOWLEDGE_PROMPT_MAX_TOKENS: () => KNOWLEDGE_PROMPT_MAX_TOKENS,
|
|
5390
|
+
KNOWLEDGE_PROMPT_MAX_TOKENS_CONVERSE: () => KNOWLEDGE_PROMPT_MAX_TOKENS_CONVERSE,
|
|
5382
5391
|
KNOWLEDGE_PROMPT_MAX_TOKENS_REFLEX: () => KNOWLEDGE_PROMPT_MAX_TOKENS_REFLEX,
|
|
5383
5392
|
LLM_CIRCUIT_RESET_RATE_LIMIT_MS: () => LLM_CIRCUIT_RESET_RATE_LIMIT_MS,
|
|
5384
5393
|
LLM_CONCURRENCY_JITTER_BASE_MS: () => LLM_CONCURRENCY_JITTER_BASE_MS,
|
|
@@ -5447,6 +5456,8 @@ __export(dist_exports, {
|
|
|
5447
5456
|
SUBAGENT_TASK_PREVIEW_CHARS: () => SUBAGENT_TASK_PREVIEW_CHARS,
|
|
5448
5457
|
SUBAGENT_THINKING_PREVIEW_CHARS: () => SUBAGENT_THINKING_PREVIEW_CHARS,
|
|
5449
5458
|
SUBTASK_SOFT_CAP: () => SUBTASK_SOFT_CAP,
|
|
5459
|
+
SYSTEM_ANNOUNCEMENTS_CHARS: () => SYSTEM_ANNOUNCEMENTS_CHARS,
|
|
5460
|
+
SYSTEM_ANNOUNCEMENTS_CHARS_CONVERSE: () => SYSTEM_ANNOUNCEMENTS_CHARS_CONVERSE,
|
|
5450
5461
|
SYSTEM_BEST_PRACTICE_ENTRIES_MAX: () => SYSTEM_BEST_PRACTICE_ENTRIES_MAX,
|
|
5451
5462
|
SYSTEM_CHAT_SESSIONS_MAX: () => SYSTEM_CHAT_SESSIONS_MAX,
|
|
5452
5463
|
SYSTEM_COLLEAGUES_MAX: () => SYSTEM_COLLEAGUES_MAX,
|
|
@@ -5454,6 +5465,7 @@ __export(dist_exports, {
|
|
|
5454
5465
|
SYSTEM_DAILY_LOG_DAYS: () => SYSTEM_DAILY_LOG_DAYS,
|
|
5455
5466
|
SYSTEM_DELIVERABLES_CHARS: () => SYSTEM_DELIVERABLES_CHARS,
|
|
5456
5467
|
SYSTEM_DELIVERABLE_PREVIEW_CHARS: () => SYSTEM_DELIVERABLE_PREVIEW_CHARS,
|
|
5468
|
+
SYSTEM_DYNAMIC_CONTEXT_CHARS_CONVERSE: () => SYSTEM_DYNAMIC_CONTEXT_CHARS_CONVERSE,
|
|
5457
5469
|
SYSTEM_HUMANS_MAX: () => SYSTEM_HUMANS_MAX,
|
|
5458
5470
|
SYSTEM_KNOWLEDGE_CHARS: () => SYSTEM_KNOWLEDGE_CHARS,
|
|
5459
5471
|
SYSTEM_LESSON_ENTRIES_MAX: () => SYSTEM_LESSON_ENTRIES_MAX,
|
|
@@ -5461,6 +5473,8 @@ __export(dist_exports, {
|
|
|
5461
5473
|
SYSTEM_MAILBOX_ITEM_PREVIEW_CHARS: () => SYSTEM_MAILBOX_ITEM_PREVIEW_CHARS,
|
|
5462
5474
|
SYSTEM_MAILBOX_MERGED_CHARS: () => SYSTEM_MAILBOX_MERGED_CHARS,
|
|
5463
5475
|
SYSTEM_MY_TASKS_MAX: () => SYSTEM_MY_TASKS_MAX,
|
|
5476
|
+
SYSTEM_NORMS_CHARS: () => SYSTEM_NORMS_CHARS,
|
|
5477
|
+
SYSTEM_NORMS_CHARS_CONVERSE: () => SYSTEM_NORMS_CHARS_CONVERSE,
|
|
5464
5478
|
SYSTEM_OTHER_TEAMS_MAX: () => SYSTEM_OTHER_TEAMS_MAX,
|
|
5465
5479
|
SYSTEM_OTHER_TEAM_MEMBERS_MAX: () => SYSTEM_OTHER_TEAM_MEMBERS_MAX,
|
|
5466
5480
|
SYSTEM_PROJECT_DESC_CHARS: () => SYSTEM_PROJECT_DESC_CHARS,
|
|
@@ -5469,6 +5483,8 @@ __export(dist_exports, {
|
|
|
5469
5483
|
SYSTEM_TASK_DESC_CHARS: () => SYSTEM_TASK_DESC_CHARS,
|
|
5470
5484
|
SYSTEM_TEAM_TASKS_MAX: () => SYSTEM_TEAM_TASKS_MAX,
|
|
5471
5485
|
SYSTEM_USER_PROFILE_CHARS: () => SYSTEM_USER_PROFILE_CHARS,
|
|
5486
|
+
SYSTEM_WORKFLOWS_MAX_CONVERSE: () => SYSTEM_WORKFLOWS_MAX_CONVERSE,
|
|
5487
|
+
SYSTEM_WORKFLOW_DESC_CHARS_CONVERSE: () => SYSTEM_WORKFLOW_DESC_CHARS_CONVERSE,
|
|
5472
5488
|
TASK_GET_DELIVERABLES_DEFAULT: () => TASK_GET_DELIVERABLES_DEFAULT,
|
|
5473
5489
|
TASK_GET_NOTES_DEFAULT: () => TASK_GET_NOTES_DEFAULT,
|
|
5474
5490
|
TASK_GET_STATUS_HISTORY_DEFAULT: () => TASK_GET_STATUS_HISTORY_DEFAULT,
|
|
@@ -8401,6 +8417,8 @@ var init_context_engine = __esm({
|
|
|
8401
8417
|
const isDream = opts.scenario === "memory_consolidation";
|
|
8402
8418
|
const promptProfile = opts.promptProfile ?? packToPromptProfile(scenarioToPack(opts.scenario));
|
|
8403
8419
|
const isReflex = promptProfile === "reflex";
|
|
8420
|
+
const isConverse = promptProfile === "converse";
|
|
8421
|
+
const isExecuteLike = promptProfile === "execute" || promptProfile === "govern";
|
|
8404
8422
|
const stable = [];
|
|
8405
8423
|
{
|
|
8406
8424
|
const roleText = opts.role.systemPrompt ?? "";
|
|
@@ -8422,23 +8440,29 @@ _[ROLE truncated to ${ROLE_PROMPT_MAX_TOKENS} tok budget]_` : roleText);
|
|
|
8422
8440
|
stable.push("\n## Tool Usage Rules");
|
|
8423
8441
|
stable.push("**File editing discipline**: You MUST use `file_write` and `file_edit` for all file creation and modification. NEVER use `shell_execute` with `cat`, `echo`, `printf`, `tee`, pipes (`|`), output redirection (`>`, `>>`), heredocs (`<<`), or `sed`/`awk` to write or modify files \u2014 these bypass file access controls. `shell_execute` is for running commands (build, test, git, etc.), not for writing files.");
|
|
8424
8442
|
stable.push("**Large file writing**: NEVER write a document >200 lines in a single `file_write` call. Write section by section: `file_write` the first section, then `file_edit` to append each subsequent section.");
|
|
8425
|
-
|
|
8443
|
+
if (isExecuteLike) {
|
|
8444
|
+
stable.push("**Subagent delegation**: For heavy subtasks needing many tool calls or lots of file reading, delegate to `spawn_subagent` to keep your context lean. Use `spawn_subagents` to run independent subtasks in parallel.");
|
|
8445
|
+
}
|
|
8426
8446
|
stable.push("**Built-in tools over CLI**: ALWAYS use built-in tools (`task_create`, `task_assign`, `package_install`, `agent_send_message`, `memory_save`, etc.) \u2014 NEVER run `markus` CLI commands via `shell_execute`. The CLI is strictly for human operators (server start, emergency stop, initial setup). Agents must use their native tool interface for all operations.");
|
|
8427
8447
|
stable.push('**No auto-install/deploy (agents/teams)**: NEVER automatically hire/deploy agents or teams via `package_install` or `hub_install` unless explicitly requested by a human (e.g., "install", "deploy", "hire", "start"). Creating builder-artifacts is separate from deploying. **Skills** follow Learning Habits impact rules below (low-impact may install directly).');
|
|
8428
8448
|
stable.push("");
|
|
8429
8449
|
stable.push("\n## Search & Exploration Strategy");
|
|
8430
|
-
|
|
8431
|
-
|
|
8432
|
-
|
|
8433
|
-
|
|
8434
|
-
|
|
8435
|
-
|
|
8436
|
-
|
|
8437
|
-
|
|
8450
|
+
if (isExecuteLike) {
|
|
8451
|
+
stable.push("When you need to understand code or find information, use a layered approach \u2014 each layer is a fallback for the previous:");
|
|
8452
|
+
stable.push("1. **Semantic search** (`memory_search`, `deliverable_search`): Start with conceptual queries to find relevant knowledge and existing outputs.");
|
|
8453
|
+
stable.push("2. **Pattern search** (`grep_search`): Use for exact symbol names, error messages, configuration keys, or specific strings.");
|
|
8454
|
+
stable.push("3. **File browsing** (`file_read`, `list_directory`): Navigate directory structure and read specific files when you know the likely location.");
|
|
8455
|
+
stable.push("4. **External research** (`web_search`, `web_fetch`): Use for unfamiliar libraries, APIs, error codes, or best practices not found in the codebase.");
|
|
8456
|
+
const hasBrowserSkill = opts.availableSkills?.some((s2) => s2.name === "chrome-devtools");
|
|
8457
|
+
if (hasBrowserSkill) {
|
|
8458
|
+
stable.push("5. **Browser tools** (`browser_navigate`, `browser_snapshot`, `browser_click`): when `web_search`/`web_fetch` fails (network error, JS-rendered page, rate-limiting), access the page interactively \u2014 handles JS rendering, auth flows, and complex navigation `web_fetch` cannot.");
|
|
8459
|
+
} else {
|
|
8460
|
+
stable.push("If `web_search`/`web_fetch` fails, try alternative queries or URLs, or `web_fetch` a search-engine URL directly (e.g. `https://www.google.com/search?q=YOUR_QUERY`). The `chrome-devtools` skill adds browser tools for JS-rendered/interactive sites.");
|
|
8461
|
+
}
|
|
8462
|
+
stable.push("Always check existing patterns in the codebase before introducing new conventions. When exploring unfamiliar code, start from entry points and trace data flow.");
|
|
8438
8463
|
} else {
|
|
8439
|
-
stable.push("
|
|
8464
|
+
stable.push("Layered lookup: semantic (`memory_search` / `deliverable_search`) \u2192 exact (`grep_search`) \u2192 files (`file_read` / `list_directory`) \u2192 web (`web_search` / `web_fetch`). Prefer existing codebase patterns. Activate `chrome-devtools` via `discover_tools` when pages need a real browser.");
|
|
8440
8465
|
}
|
|
8441
|
-
stable.push("Always check existing patterns in the codebase before introducing new conventions. When exploring unfamiliar code, start from entry points and trace data flow.");
|
|
8442
8466
|
stable.push("");
|
|
8443
8467
|
stable.push("\n## Learning Habits");
|
|
8444
8468
|
stable.push("Get smarter over time. Prefer the lightest store that changes future behavior.");
|
|
@@ -8498,10 +8522,20 @@ _[ROLE truncated to ${ROLE_PROMPT_MAX_TOKENS} tok budget]_` : roleText);
|
|
|
8498
8522
|
if (orgCtx)
|
|
8499
8523
|
semiStable.push(orgCtx);
|
|
8500
8524
|
if (opts.teamAnnouncements?.trim()) {
|
|
8501
|
-
|
|
8525
|
+
const raw = opts.teamAnnouncements.trim();
|
|
8526
|
+
const cap = isConverse ? SYSTEM_ANNOUNCEMENTS_CHARS_CONVERSE : SYSTEM_ANNOUNCEMENTS_CHARS;
|
|
8527
|
+
const body = raw.length > cap ? `${raw.slice(0, cap)}
|
|
8528
|
+
|
|
8529
|
+
_[announcements truncated \u2014 read \`${opts.teamDataDir ?? "team"}/ANNOUNCEMENT.md\` for full text]_` : raw;
|
|
8530
|
+
semiStable.push("\n## Team Announcements\n" + body);
|
|
8502
8531
|
}
|
|
8503
8532
|
if (opts.teamNorms?.trim()) {
|
|
8504
|
-
|
|
8533
|
+
const raw = opts.teamNorms.trim();
|
|
8534
|
+
const cap = isConverse ? SYSTEM_NORMS_CHARS_CONVERSE : SYSTEM_NORMS_CHARS;
|
|
8535
|
+
const body = raw.length > cap ? `${raw.slice(0, cap)}
|
|
8536
|
+
|
|
8537
|
+
_[norms truncated \u2014 read \`${opts.teamDataDir ?? "team"}/NORMS.md\` for full text]_` : raw;
|
|
8538
|
+
semiStable.push("\n## Team Working Norms\n" + body);
|
|
8505
8539
|
}
|
|
8506
8540
|
if (opts.teamDataDir) {
|
|
8507
8541
|
const lines = ["\n## Team Data Directory", `Path: \`${opts.teamDataDir}\``, "Files:", "- `ANNOUNCEMENT.md` \u2014 team announcements", "- `NORMS.md` \u2014 team working norms"];
|
|
@@ -8576,7 +8610,7 @@ _[ROLE truncated to ${ROLE_PROMPT_MAX_TOKENS} tok budget]_` : roleText);
|
|
|
8576
8610
|
if (opts.environment) {
|
|
8577
8611
|
semiStable.push(this.buildEnvironmentSection(opts.environment));
|
|
8578
8612
|
}
|
|
8579
|
-
const knowledgeTokCap = isReflex ? KNOWLEDGE_PROMPT_MAX_TOKENS_REFLEX : KNOWLEDGE_PROMPT_MAX_TOKENS;
|
|
8613
|
+
const knowledgeTokCap = isReflex ? KNOWLEDGE_PROMPT_MAX_TOKENS_REFLEX : isConverse ? KNOWLEDGE_PROMPT_MAX_TOKENS_CONVERSE : KNOWLEDGE_PROMPT_MAX_TOKENS;
|
|
8580
8614
|
if (knowledgeTokCap > 0) {
|
|
8581
8615
|
const longTermMem = opts.memory.getLongTermMemory();
|
|
8582
8616
|
if (longTermMem) {
|
|
@@ -8598,9 +8632,11 @@ _[ROLE truncated to ${ROLE_PROMPT_MAX_TOKENS} tok budget]_` : roleText);
|
|
|
8598
8632
|
}
|
|
8599
8633
|
const scenario = opts.scenario ?? "chat";
|
|
8600
8634
|
semiStable.push(this.buildScenarioSection(scenario, { a2aWaitForReply: opts.a2aWaitForReply, isManager: opts.isTeamManager, channelKey: opts.channelKey }));
|
|
8601
|
-
|
|
8602
|
-
|
|
8603
|
-
|
|
8635
|
+
if (isExecuteLike) {
|
|
8636
|
+
const scenarioPolicies = this.buildScenarioPolicyBlocks(scenario);
|
|
8637
|
+
if (scenarioPolicies)
|
|
8638
|
+
semiStable.push(scenarioPolicies);
|
|
8639
|
+
}
|
|
8604
8640
|
const dynamic = [];
|
|
8605
8641
|
if (opts.projectContext) {
|
|
8606
8642
|
const { project, repositories, governanceRules, teamRole } = opts.projectContext;
|
|
@@ -8680,7 +8716,7 @@ _[ROLE truncated to ${ROLE_PROMPT_MAX_TOKENS} tok budget]_` : roleText);
|
|
|
8680
8716
|
dynamic.push(`_(${otherDone.length} other completed/closed tasks)_`);
|
|
8681
8717
|
}
|
|
8682
8718
|
}
|
|
8683
|
-
} else {
|
|
8719
|
+
} else if (isExecuteLike) {
|
|
8684
8720
|
dynamic.push("\n## Task Board");
|
|
8685
8721
|
dynamic.push("No tasks on the board.");
|
|
8686
8722
|
}
|
|
@@ -8696,14 +8732,26 @@ _[ROLE truncated to ${ROLE_PROMPT_MAX_TOKENS} tok budget]_` : roleText);
|
|
|
8696
8732
|
}
|
|
8697
8733
|
if (wc.availableWorkflows.length > 0) {
|
|
8698
8734
|
dynamic.push("\n## Available Workflows");
|
|
8699
|
-
|
|
8700
|
-
|
|
8735
|
+
const list = isConverse ? wc.availableWorkflows.slice(0, SYSTEM_WORKFLOWS_MAX_CONVERSE) : wc.availableWorkflows;
|
|
8736
|
+
for (const w of list) {
|
|
8737
|
+
const desc = isConverse ? w.description.slice(0, SYSTEM_WORKFLOW_DESC_CHARS_CONVERSE) : w.description;
|
|
8738
|
+
dynamic.push(`- **${w.name}** (${w.stepCount} steps): ${desc}`);
|
|
8739
|
+
}
|
|
8740
|
+
if (isConverse && wc.availableWorkflows.length > SYSTEM_WORKFLOWS_MAX_CONVERSE) {
|
|
8741
|
+
dynamic.push(`_(${wc.availableWorkflows.length - SYSTEM_WORKFLOWS_MAX_CONVERSE} more \u2014 use \`workflow_list\`)_`);
|
|
8701
8742
|
}
|
|
8702
8743
|
dynamic.push("Use `workflow_list` for details or `workflow_run` to start a workflow.");
|
|
8703
8744
|
}
|
|
8704
8745
|
}
|
|
8705
8746
|
if (opts.dynamicContext) {
|
|
8706
|
-
|
|
8747
|
+
const raw = opts.dynamicContext;
|
|
8748
|
+
if (isConverse && raw.length > SYSTEM_DYNAMIC_CONTEXT_CHARS_CONVERSE) {
|
|
8749
|
+
dynamic.push(`${raw.slice(0, SYSTEM_DYNAMIC_CONTEXT_CHARS_CONVERSE)}
|
|
8750
|
+
|
|
8751
|
+
_[dynamic context truncated]_`);
|
|
8752
|
+
} else {
|
|
8753
|
+
dynamic.push(raw);
|
|
8754
|
+
}
|
|
8707
8755
|
}
|
|
8708
8756
|
const alreadyShownIds = /* @__PURE__ */ new Set();
|
|
8709
8757
|
const cpp = opts.cognitiveContext;
|
|
@@ -8843,14 +8891,35 @@ Current date and time: ${localStr} (${tz}${offsetLabel ? `, ${offsetLabel}` : ""
|
|
|
8843
8891
|
};
|
|
8844
8892
|
}
|
|
8845
8893
|
/**
|
|
8846
|
-
*
|
|
8847
|
-
*
|
|
8848
|
-
*
|
|
8894
|
+
* Tier-3 tail entries that MUST survive converse budget trim.
|
|
8895
|
+
* Date/locale are small (~50–150 tok) but critical for time-aware replies;
|
|
8896
|
+
* last-resort `dynamic.pop()` previously deleted them first because they
|
|
8897
|
+
* sit at the end of the dynamic array (PROMPT-ENGINEERING §2 Tier 3).
|
|
8898
|
+
*/
|
|
8899
|
+
isProtectedDynamicTail(entry) {
|
|
8900
|
+
return entry.includes("Current date and time:") || entry.startsWith("User locale:") || entry.startsWith("User language:");
|
|
8901
|
+
}
|
|
8902
|
+
/** Keep Interaction Mode so the agent knows which scenario it is in. */
|
|
8903
|
+
isProtectedSemiStableTail(entry) {
|
|
8904
|
+
return entry.includes("## Current Interaction Mode");
|
|
8905
|
+
}
|
|
8906
|
+
/**
|
|
8907
|
+
* Failsafe only (Afford.S3): drop lower-priority converse sections until
|
|
8908
|
+
* system ≤ budgetTokens. Normal packing MUST stay under budget via profile
|
|
8909
|
+
* gates and injection caps — if this method runs, log a warning so upstream
|
|
8910
|
+
* bloat can be fixed. Never drops Current date/time, user locale/language,
|
|
8911
|
+
* or Interaction Mode.
|
|
8849
8912
|
*/
|
|
8850
8913
|
trimConverseSystemBudget(stable, semiStable, dynamic, budgetTokens) {
|
|
8851
8914
|
const totalTokens = () => estimateTokens([stable.join("\n"), semiStable.join("\n"), dynamic.join("\n")].join("\n"), this.tokenCounter);
|
|
8852
|
-
|
|
8915
|
+
const before2 = totalTokens();
|
|
8916
|
+
if (before2 <= budgetTokens)
|
|
8853
8917
|
return;
|
|
8918
|
+
log8.warn("Converse system over budget after assemble \u2014 failsafe trim engaged", {
|
|
8919
|
+
systemTokens: before2,
|
|
8920
|
+
budgetTokens,
|
|
8921
|
+
hint: "Fix upstream injection caps / profile gates; trim must stay rare"
|
|
8922
|
+
});
|
|
8854
8923
|
const dropHeadingBlock = (arr, heading) => {
|
|
8855
8924
|
const start = arr.findIndex((s2) => s2.includes(heading));
|
|
8856
8925
|
if (start < 0)
|
|
@@ -8865,64 +8934,87 @@ Current date and time: ${localStr} (${tz}${offsetLabel ? `, ${offsetLabel}` : ""
|
|
|
8865
8934
|
arr.splice(start, end - start);
|
|
8866
8935
|
return true;
|
|
8867
8936
|
};
|
|
8868
|
-
|
|
8869
|
-
|
|
8870
|
-
|
|
8871
|
-
dropHeadingBlock(semiStable, "## Team Working Norms");
|
|
8872
|
-
if (totalTokens() <= budgetTokens)
|
|
8873
|
-
return;
|
|
8874
|
-
dropHeadingBlock(stable, "## Search & Exploration Strategy");
|
|
8875
|
-
if (totalTokens() <= budgetTokens)
|
|
8876
|
-
return;
|
|
8877
|
-
dropHeadingBlock(semiStable, "### Colleagues");
|
|
8878
|
-
dropHeadingBlock(semiStable, "### Your Team");
|
|
8879
|
-
dropHeadingBlock(dynamic, "### Colleagues");
|
|
8880
|
-
dropHeadingBlock(dynamic, "## Colleague Status");
|
|
8881
|
-
if (totalTokens() <= budgetTokens)
|
|
8882
|
-
return;
|
|
8883
|
-
const dynamicDropOrder = [
|
|
8884
|
-
"## Channel Context",
|
|
8885
|
-
"## Active Workflows",
|
|
8886
|
-
"## Mailbox",
|
|
8887
|
-
"## Current Project",
|
|
8888
|
-
"## Shared Deliverables",
|
|
8889
|
-
"## Task Board"
|
|
8890
|
-
];
|
|
8891
|
-
for (const h of dynamicDropOrder) {
|
|
8892
|
-
if (totalTokens() <= budgetTokens)
|
|
8893
|
-
return;
|
|
8894
|
-
dropHeadingBlock(dynamic, h);
|
|
8895
|
-
}
|
|
8896
|
-
while (totalTokens() > budgetTokens && dynamic.length > 0) {
|
|
8897
|
-
dynamic.pop();
|
|
8898
|
-
}
|
|
8899
|
-
while (totalTokens() > budgetTokens && semiStable.length > 1) {
|
|
8900
|
-
semiStable.pop();
|
|
8937
|
+
const protectedDynamic = [];
|
|
8938
|
+
while (dynamic.length > 0 && this.isProtectedDynamicTail(dynamic[dynamic.length - 1])) {
|
|
8939
|
+
protectedDynamic.unshift(dynamic.pop());
|
|
8901
8940
|
}
|
|
8902
|
-
|
|
8903
|
-
|
|
8904
|
-
|
|
8905
|
-
|
|
8906
|
-
|
|
8907
|
-
|
|
8908
|
-
|
|
8909
|
-
|
|
8941
|
+
const protectedTok = protectedDynamic.length ? estimateTokens(protectedDynamic.join("\n"), this.tokenCounter) : 0;
|
|
8942
|
+
const workingBudget = Math.max(1e3, budgetTokens - protectedTok);
|
|
8943
|
+
try {
|
|
8944
|
+
dropHeadingBlock(semiStable, "## Team Announcements");
|
|
8945
|
+
if (totalTokens() <= workingBudget)
|
|
8946
|
+
return;
|
|
8947
|
+
dropHeadingBlock(semiStable, "## Team Working Norms");
|
|
8948
|
+
if (totalTokens() <= workingBudget)
|
|
8949
|
+
return;
|
|
8950
|
+
dropHeadingBlock(stable, "## Search & Exploration Strategy");
|
|
8951
|
+
if (totalTokens() <= workingBudget)
|
|
8952
|
+
return;
|
|
8953
|
+
dropHeadingBlock(semiStable, "### Colleagues");
|
|
8954
|
+
dropHeadingBlock(semiStable, "### Your Team");
|
|
8955
|
+
dropHeadingBlock(dynamic, "### Colleagues");
|
|
8956
|
+
dropHeadingBlock(dynamic, "## Colleague Status");
|
|
8957
|
+
if (totalTokens() <= workingBudget)
|
|
8958
|
+
return;
|
|
8959
|
+
const dynamicDropOrder = [
|
|
8960
|
+
"## Channel Context",
|
|
8961
|
+
"## Channel History",
|
|
8962
|
+
"## Available Workflows",
|
|
8963
|
+
"## Active Workflows",
|
|
8964
|
+
"## Mailbox",
|
|
8965
|
+
"## Current Project",
|
|
8966
|
+
"## Shared Deliverables",
|
|
8967
|
+
"## Task Board",
|
|
8968
|
+
"## Team Status"
|
|
8969
|
+
];
|
|
8970
|
+
for (const h of dynamicDropOrder) {
|
|
8971
|
+
if (totalTokens() <= workingBudget)
|
|
8972
|
+
return;
|
|
8973
|
+
dropHeadingBlock(dynamic, h);
|
|
8974
|
+
}
|
|
8975
|
+
while (totalTokens() > workingBudget && dynamic.length > 0) {
|
|
8976
|
+
dynamic.pop();
|
|
8977
|
+
}
|
|
8978
|
+
while (totalTokens() > workingBudget && semiStable.length > 1) {
|
|
8979
|
+
const last = semiStable[semiStable.length - 1];
|
|
8980
|
+
if (this.isProtectedSemiStableTail(last)) {
|
|
8981
|
+
let idx = semiStable.length - 2;
|
|
8982
|
+
while (idx >= 1 && this.isProtectedSemiStableTail(semiStable[idx]))
|
|
8983
|
+
idx--;
|
|
8984
|
+
if (idx < 1)
|
|
8985
|
+
break;
|
|
8986
|
+
semiStable.splice(idx, 1);
|
|
8987
|
+
continue;
|
|
8988
|
+
}
|
|
8989
|
+
semiStable.pop();
|
|
8990
|
+
}
|
|
8991
|
+
if (totalTokens() > workingBudget) {
|
|
8992
|
+
const joined = stable.join("\n");
|
|
8993
|
+
let lo = 0;
|
|
8994
|
+
let hi = joined.length;
|
|
8995
|
+
let best = "";
|
|
8996
|
+
while (lo <= hi) {
|
|
8997
|
+
const mid = Math.floor((lo + hi) / 2);
|
|
8998
|
+
const candidate = `${joined.slice(0, mid)}
|
|
8910
8999
|
|
|
8911
9000
|
_[system trimmed to ${budgetTokens} tok converse budget]_`;
|
|
8912
|
-
|
|
8913
|
-
|
|
9001
|
+
const other = [semiStable.join("\n"), dynamic.join("\n")].join("\n");
|
|
9002
|
+
const tok = estimateTokens(`${candidate}
|
|
8914
9003
|
${other}`, this.tokenCounter);
|
|
8915
|
-
|
|
8916
|
-
|
|
8917
|
-
|
|
8918
|
-
|
|
8919
|
-
|
|
9004
|
+
if (tok <= workingBudget) {
|
|
9005
|
+
best = candidate;
|
|
9006
|
+
lo = mid + 1;
|
|
9007
|
+
} else {
|
|
9008
|
+
hi = mid - 1;
|
|
9009
|
+
}
|
|
8920
9010
|
}
|
|
8921
|
-
|
|
8922
|
-
|
|
8923
|
-
stable.push(best || `${joined.slice(0, Math.max(0, budgetTokens * 2))}
|
|
9011
|
+
stable.length = 0;
|
|
9012
|
+
stable.push(best || `${joined.slice(0, Math.max(0, workingBudget * 2))}
|
|
8924
9013
|
|
|
8925
9014
|
_[system trimmed]_`);
|
|
9015
|
+
}
|
|
9016
|
+
} finally {
|
|
9017
|
+
dynamic.push(...protectedDynamic);
|
|
8926
9018
|
}
|
|
8927
9019
|
}
|
|
8928
9020
|
/** Human-readable language name for a BCP-47 locale (e.g. 'zh-CN' → 'Chinese (China)'). */
|
|
@@ -9034,11 +9126,12 @@ ${ctx.mergedContent.slice(0, SYSTEM_MAILBOX_MERGED_CHARS)}`);
|
|
|
9034
9126
|
return lines.join("\n");
|
|
9035
9127
|
}
|
|
9036
9128
|
/**
|
|
9037
|
-
* L3 scenario-triggered policy blocks — long checklists that
|
|
9038
|
-
* must not carry.
|
|
9129
|
+
* L3 scenario-triggered policy blocks — long checklists that converse/reflex
|
|
9130
|
+
* must not carry. Caller gates on execute/govern profile; this further
|
|
9131
|
+
* restricts to task/review/deliberation scenarios.
|
|
9039
9132
|
*/
|
|
9040
9133
|
buildScenarioPolicyBlocks(scenario) {
|
|
9041
|
-
const needsExecutionPolicies = scenario === "task_execution" || scenario === "review" || scenario === "deliberation"
|
|
9134
|
+
const needsExecutionPolicies = scenario === "task_execution" || scenario === "review" || scenario === "deliberation";
|
|
9042
9135
|
if (!needsExecutionPolicies)
|
|
9043
9136
|
return void 0;
|
|
9044
9137
|
const lines = [];
|
|
@@ -69365,7 +69458,7 @@ var init_openai = __esm({
|
|
|
69365
69458
|
this.baseUrl = config?.baseUrl ?? "https://api.openai.com";
|
|
69366
69459
|
this.maxTokens = config?.maxTokens ?? DEFAULT_REQUEST_MAX_TOKENS;
|
|
69367
69460
|
this.chatTimeoutMs = config?.timeoutMs ?? 9e4;
|
|
69368
|
-
this.streamTimeoutMs = config?.
|
|
69461
|
+
this.streamTimeoutMs = config?.streamTimeoutMs ?? 18e4;
|
|
69369
69462
|
this.tokenResolver = tokenResolver;
|
|
69370
69463
|
}
|
|
69371
69464
|
configure(config) {
|
|
@@ -69377,10 +69470,10 @@ var init_openai = __esm({
|
|
|
69377
69470
|
this.baseUrl = config.baseUrl;
|
|
69378
69471
|
if (config.maxTokens)
|
|
69379
69472
|
this.maxTokens = config.maxTokens;
|
|
69380
|
-
if (config.timeoutMs)
|
|
69473
|
+
if (config.timeoutMs)
|
|
69381
69474
|
this.chatTimeoutMs = config.timeoutMs;
|
|
69382
|
-
|
|
69383
|
-
|
|
69475
|
+
if (config.streamTimeoutMs)
|
|
69476
|
+
this.streamTimeoutMs = config.streamTimeoutMs;
|
|
69384
69477
|
}
|
|
69385
69478
|
setTokenResolver(resolver) {
|
|
69386
69479
|
this.tokenResolver = resolver;
|
|
@@ -69525,11 +69618,22 @@ var init_openai = __esm({
|
|
|
69525
69618
|
const endpoint = /\/v\d+$/.test(base) ? `${base}/chat/completions` : `${base}/v1/chat/completions`;
|
|
69526
69619
|
const controller = new AbortController();
|
|
69527
69620
|
const STREAM_HARD_TIMEOUT_MS2 = 15 * 6e4;
|
|
69528
|
-
let
|
|
69529
|
-
|
|
69621
|
+
let idleTimedOut = false;
|
|
69622
|
+
let hardTimedOut = false;
|
|
69623
|
+
let idleTimeout = setTimeout(() => {
|
|
69624
|
+
idleTimedOut = true;
|
|
69625
|
+
controller.abort();
|
|
69626
|
+
}, this.streamTimeoutMs);
|
|
69627
|
+
const hardTimeout = setTimeout(() => {
|
|
69628
|
+
hardTimedOut = true;
|
|
69629
|
+
controller.abort();
|
|
69630
|
+
}, STREAM_HARD_TIMEOUT_MS2);
|
|
69530
69631
|
const bumpIdleTimeout = () => {
|
|
69531
69632
|
clearTimeout(idleTimeout);
|
|
69532
|
-
idleTimeout = setTimeout(() =>
|
|
69633
|
+
idleTimeout = setTimeout(() => {
|
|
69634
|
+
idleTimedOut = true;
|
|
69635
|
+
controller.abort();
|
|
69636
|
+
}, this.streamTimeoutMs);
|
|
69533
69637
|
};
|
|
69534
69638
|
const clearStreamTimeouts = () => {
|
|
69535
69639
|
clearTimeout(idleTimeout);
|
|
@@ -69640,6 +69744,18 @@ var init_openai = __esm({
|
|
|
69640
69744
|
}
|
|
69641
69745
|
}
|
|
69642
69746
|
}
|
|
69747
|
+
} catch (err) {
|
|
69748
|
+
clearStreamTimeouts();
|
|
69749
|
+
const hasPartial = content.length > 0 || reasoningContent.length > 0 || toolCalls.size > 0;
|
|
69750
|
+
if (idleTimedOut && hasPartial) {
|
|
69751
|
+
toolCalls.clear();
|
|
69752
|
+
finishReason = "max_tokens";
|
|
69753
|
+
} else if (idleTimedOut || hardTimedOut) {
|
|
69754
|
+
const kind = hardTimedOut ? "hard" : "idle";
|
|
69755
|
+
throw new Error(`OpenAI stream ${kind} timeout after ${hardTimedOut ? STREAM_HARD_TIMEOUT_MS2 : this.streamTimeoutMs}ms`);
|
|
69756
|
+
} else {
|
|
69757
|
+
throw err;
|
|
69758
|
+
}
|
|
69643
69759
|
} finally {
|
|
69644
69760
|
clearStreamTimeouts();
|
|
69645
69761
|
}
|
|
@@ -71515,6 +71631,26 @@ function stripMarkusNamespace(modelId) {
|
|
|
71515
71631
|
const id = (modelId ?? "").trim();
|
|
71516
71632
|
return id.replace(/^markus\//i, "");
|
|
71517
71633
|
}
|
|
71634
|
+
function parseRetryAfterMs(res) {
|
|
71635
|
+
const raw = res.headers.get("retry-after");
|
|
71636
|
+
if (!raw)
|
|
71637
|
+
return null;
|
|
71638
|
+
const asSec = Number(raw);
|
|
71639
|
+
if (Number.isFinite(asSec) && asSec >= 0) {
|
|
71640
|
+
return Math.min(asSec * 1e3, MAX_RETRY_AFTER_MS);
|
|
71641
|
+
}
|
|
71642
|
+
const asDate = Date.parse(raw);
|
|
71643
|
+
if (Number.isFinite(asDate)) {
|
|
71644
|
+
return Math.min(Math.max(0, asDate - Date.now()), MAX_RETRY_AFTER_MS);
|
|
71645
|
+
}
|
|
71646
|
+
return null;
|
|
71647
|
+
}
|
|
71648
|
+
function retryDelayMs(res, attempt) {
|
|
71649
|
+
const fromHeader = res ? parseRetryAfterMs(res) : null;
|
|
71650
|
+
if (fromHeader !== null)
|
|
71651
|
+
return fromHeader;
|
|
71652
|
+
return RETRY_BASE_DELAY_MS * Math.pow(2, attempt);
|
|
71653
|
+
}
|
|
71518
71654
|
function fireCreditExhaustedEvent() {
|
|
71519
71655
|
const g = globalThis;
|
|
71520
71656
|
if (typeof g.dispatchEvent !== "function")
|
|
@@ -71598,7 +71734,7 @@ function detectAudioFormat(audio) {
|
|
|
71598
71734
|
}
|
|
71599
71735
|
return "wav";
|
|
71600
71736
|
}
|
|
71601
|
-
var log52, CUCache, DEFAULT_OR_BASE_URL, DEFAULT_MODEL, CLIENT_ID, CHAT_TIMEOUT_MS, STREAM_TIMEOUT_MS, STREAM_HARD_TIMEOUT_MS, MAX_RETRIES, RETRY_BASE_DELAY_MS, CREDIT_MUTE_KEY, _lastCreditNotifTs, cachedModelList, modelListExpiry, MODEL_LIST_TTL_MS, MarkusProvider, FALLBACK_MODELS;
|
|
71737
|
+
var log52, CUCache, DEFAULT_OR_BASE_URL, DEFAULT_MODEL, CLIENT_ID, CHAT_TIMEOUT_MS, STREAM_TIMEOUT_MS, STREAM_HARD_TIMEOUT_MS, MAX_RETRIES, RETRY_BASE_DELAY_MS, MAX_RETRY_AFTER_MS, CREDIT_MUTE_KEY, _lastCreditNotifTs, cachedModelList, modelListExpiry, MODEL_LIST_TTL_MS, MarkusProvider, FALLBACK_MODELS;
|
|
71602
71738
|
var init_markus_provider = __esm({
|
|
71603
71739
|
"../core/dist/llm/markus-provider.js"() {
|
|
71604
71740
|
"use strict";
|
|
@@ -71637,6 +71773,7 @@ var init_markus_provider = __esm({
|
|
|
71637
71773
|
STREAM_HARD_TIMEOUT_MS = 15 * 6e4;
|
|
71638
71774
|
MAX_RETRIES = 3;
|
|
71639
71775
|
RETRY_BASE_DELAY_MS = 500;
|
|
71776
|
+
MAX_RETRY_AFTER_MS = 6e4;
|
|
71640
71777
|
CREDIT_MUTE_KEY = "markus:credit-notif-muted";
|
|
71641
71778
|
_lastCreditNotifTs = 0;
|
|
71642
71779
|
cachedModelList = null;
|
|
@@ -71667,7 +71804,7 @@ var init_markus_provider = __esm({
|
|
|
71667
71804
|
this.baseUrl = config?.baseUrl ?? DEFAULT_OR_BASE_URL;
|
|
71668
71805
|
this.maxTokens = config?.maxTokens;
|
|
71669
71806
|
this.chatTimeoutMs = config?.timeoutMs ?? CHAT_TIMEOUT_MS;
|
|
71670
|
-
this.streamTimeoutMs = config?.
|
|
71807
|
+
this.streamTimeoutMs = config?.streamTimeoutMs ?? STREAM_TIMEOUT_MS;
|
|
71671
71808
|
this.modelsUrl = config?.modelsUrl ?? process.env["MARKUS_MODELS_URL"] ?? "";
|
|
71672
71809
|
this.hubUrl = config?.hubUrl ?? process.env["MARKUS_HUB_URL"] ?? "";
|
|
71673
71810
|
this.hubToken = config?.hubToken ?? process.env["MARKUS_HUB_TOKEN"] ?? "";
|
|
@@ -71691,10 +71828,10 @@ var init_markus_provider = __esm({
|
|
|
71691
71828
|
this.hubUrl = config.hubUrl;
|
|
71692
71829
|
if (config.hubToken !== void 0)
|
|
71693
71830
|
this.hubToken = config.hubToken;
|
|
71694
|
-
if (config.timeoutMs)
|
|
71831
|
+
if (config.timeoutMs)
|
|
71695
71832
|
this.chatTimeoutMs = config.timeoutMs;
|
|
71696
|
-
|
|
71697
|
-
|
|
71833
|
+
if (config.streamTimeoutMs)
|
|
71834
|
+
this.streamTimeoutMs = config.streamTimeoutMs;
|
|
71698
71835
|
}
|
|
71699
71836
|
/** Whether OpenRouter credentials are available. */
|
|
71700
71837
|
hasOpenRouterCreds() {
|
|
@@ -72160,6 +72297,7 @@ var init_markus_provider = __esm({
|
|
|
72160
72297
|
}
|
|
72161
72298
|
const decoder = new TextDecoder();
|
|
72162
72299
|
let buffer = "";
|
|
72300
|
+
let midStreamRateLimited = false;
|
|
72163
72301
|
try {
|
|
72164
72302
|
while (true) {
|
|
72165
72303
|
const { done, value } = await reader.read();
|
|
@@ -72169,6 +72307,7 @@ var init_markus_provider = __esm({
|
|
|
72169
72307
|
buffer += decoder.decode(value, { stream: true });
|
|
72170
72308
|
const lines = buffer.split("\n");
|
|
72171
72309
|
buffer = lines.pop() ?? "";
|
|
72310
|
+
let stopStream = false;
|
|
72172
72311
|
for (const line of lines) {
|
|
72173
72312
|
const trimmed = line.trim();
|
|
72174
72313
|
if (!trimmed || trimmed === "data: [DONE]")
|
|
@@ -72179,6 +72318,19 @@ var init_markus_provider = __esm({
|
|
|
72179
72318
|
const chunk = JSON.parse(trimmed.slice(6));
|
|
72180
72319
|
const choice = chunk.choices?.[0];
|
|
72181
72320
|
const delta = choice?.delta;
|
|
72321
|
+
const streamErr = chunk.error ?? null;
|
|
72322
|
+
const finishRaw = choice?.finish_reason !== null ? String(choice?.finish_reason ?? "") : "";
|
|
72323
|
+
if (streamErr || finishRaw === "error") {
|
|
72324
|
+
const code = Number(streamErr?.code ?? 0);
|
|
72325
|
+
const errMsg = String(streamErr?.message ?? "Rate limit exceeded");
|
|
72326
|
+
const isRateLimit = code === 429 || /rate.?limit/i.test(errMsg);
|
|
72327
|
+
if (isRateLimit) {
|
|
72328
|
+
midStreamRateLimited = true;
|
|
72329
|
+
stopStream = true;
|
|
72330
|
+
break;
|
|
72331
|
+
}
|
|
72332
|
+
throw new Error(`Markus stream error ${code || "unknown"}: ${errMsg}`);
|
|
72333
|
+
}
|
|
72182
72334
|
const deltaReasoning = extractDeltaReasoning(delta);
|
|
72183
72335
|
if (deltaReasoning) {
|
|
72184
72336
|
reasoningContent += deltaReasoning;
|
|
@@ -72225,18 +72377,47 @@ var init_markus_provider = __esm({
|
|
|
72225
72377
|
this.recordCostUsd(chunk.usage);
|
|
72226
72378
|
}
|
|
72227
72379
|
}
|
|
72228
|
-
} catch {
|
|
72380
|
+
} catch (parseOrStreamErr) {
|
|
72381
|
+
if (parseOrStreamErr instanceof Error && parseOrStreamErr.message.startsWith("Markus stream error")) {
|
|
72382
|
+
throw parseOrStreamErr;
|
|
72383
|
+
}
|
|
72229
72384
|
}
|
|
72230
72385
|
}
|
|
72386
|
+
if (stopStream)
|
|
72387
|
+
break;
|
|
72388
|
+
}
|
|
72389
|
+
if (midStreamRateLimited) {
|
|
72390
|
+
const hasPartial = content.length > 0 || reasoningContent.length > 0 || toolCallsAcc.size > 0;
|
|
72391
|
+
if (hasPartial) {
|
|
72392
|
+
log52.warn("OpenRouter mid-stream rate limit \u2014 returning partial for auto-continuation", {
|
|
72393
|
+
contentChars: content.length
|
|
72394
|
+
});
|
|
72395
|
+
toolCallsAcc.clear();
|
|
72396
|
+
finishReason = "max_tokens";
|
|
72397
|
+
} else {
|
|
72398
|
+
throw new Error("MARKUS_RATE_LIMITED: Rate limit exceeded (mid-stream)");
|
|
72399
|
+
}
|
|
72231
72400
|
}
|
|
72232
72401
|
} catch (err) {
|
|
72233
72402
|
clearStreamTimeouts();
|
|
72234
72403
|
const msg = err instanceof Error ? err.message : String(err);
|
|
72235
|
-
|
|
72404
|
+
const hasPartial = content.length > 0 || reasoningContent.length > 0 || toolCallsAcc.size > 0;
|
|
72405
|
+
if (idleTimedOut && hasPartial) {
|
|
72406
|
+
log52.warn("Markus stream idle timeout with partial content \u2014 returning for auto-continuation", {
|
|
72407
|
+
idleMs: this.streamTimeoutMs,
|
|
72408
|
+
contentChars: content.length,
|
|
72409
|
+
droppedToolCalls: toolCallsAcc.size
|
|
72410
|
+
});
|
|
72411
|
+
toolCallsAcc.clear();
|
|
72412
|
+
finishReason = "max_tokens";
|
|
72413
|
+
} else if (idleTimedOut || hardTimedOut) {
|
|
72236
72414
|
const kind = hardTimedOut ? "hard" : "idle";
|
|
72237
72415
|
throw new Error(`Markus stream ${kind} timeout after ${hardTimedOut ? STREAM_HARD_TIMEOUT_MS : this.streamTimeoutMs}ms`);
|
|
72416
|
+
} else if (signal?.aborted || /aborted/i.test(msg)) {
|
|
72417
|
+
throw err instanceof Error ? err : new Error(msg);
|
|
72418
|
+
} else {
|
|
72419
|
+
throw err;
|
|
72238
72420
|
}
|
|
72239
|
-
throw err;
|
|
72240
72421
|
} finally {
|
|
72241
72422
|
clearStreamTimeouts();
|
|
72242
72423
|
}
|
|
@@ -72347,32 +72528,48 @@ var init_markus_provider = __esm({
|
|
|
72347
72528
|
}
|
|
72348
72529
|
/**
|
|
72349
72530
|
* Fetch with exponential backoff retry.
|
|
72350
|
-
*
|
|
72351
|
-
*
|
|
72531
|
+
*
|
|
72532
|
+
* OpenRouter guidance (https://openrouter.ai/docs/api_reference/limits):
|
|
72533
|
+
* - 429 / 503 are transient — retry with exponential backoff; honor `Retry-After`
|
|
72534
|
+
* - Other 4xx (auth/billing) are not retried
|
|
72535
|
+
* - 5xx / network errors are retried (unless skipRetry — used after stream body
|
|
72536
|
+
* would already be in flight; 429/503 still retry because they fail before body)
|
|
72352
72537
|
*/
|
|
72353
72538
|
async fetchWithRetry(url, init, skipRetry = false, retries = MAX_RETRIES) {
|
|
72354
72539
|
let lastError;
|
|
72355
72540
|
for (let attempt = 0; attempt < retries; attempt++) {
|
|
72541
|
+
let res;
|
|
72356
72542
|
try {
|
|
72357
|
-
|
|
72358
|
-
if (res.status >= 400 && res.status < 500) {
|
|
72359
|
-
return res;
|
|
72360
|
-
}
|
|
72543
|
+
res = await fetch(url, init);
|
|
72361
72544
|
if (res.ok)
|
|
72362
72545
|
return res;
|
|
72363
|
-
|
|
72546
|
+
const retriableStatus = res.status === 429 || res.status === 503;
|
|
72547
|
+
if (res.status >= 400 && res.status < 500 && !retriableStatus) {
|
|
72548
|
+
return res;
|
|
72549
|
+
}
|
|
72550
|
+
log52.warn(`OpenRouter/Markus HTTP ${res.status} (attempt ${attempt + 1}/${retries})`, {
|
|
72551
|
+
retryAfter: res.headers.get("retry-after"),
|
|
72552
|
+
rateLimitRemaining: res.headers.get("x-ratelimit-remaining"),
|
|
72553
|
+
rateLimitReset: res.headers.get("x-ratelimit-reset")
|
|
72554
|
+
});
|
|
72364
72555
|
lastError = new Error(`Markus proxy error ${res.status}`);
|
|
72365
|
-
if (skipRetry)
|
|
72556
|
+
if (skipRetry && !retriableStatus)
|
|
72557
|
+
return res;
|
|
72558
|
+
if (attempt >= retries - 1)
|
|
72366
72559
|
return res;
|
|
72367
72560
|
const errText = await res.text().catch(() => "");
|
|
72368
72561
|
if (errText)
|
|
72369
72562
|
log52.warn("Response body", { body: errText.slice(0, 200) });
|
|
72563
|
+
const delay = retryDelayMs(res, attempt);
|
|
72564
|
+
log52.info(`Waiting ${delay}ms before retry (Retry-After / backoff)`);
|
|
72565
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
72566
|
+
continue;
|
|
72370
72567
|
} catch (err) {
|
|
72371
72568
|
lastError = err instanceof Error ? err : new Error(String(err));
|
|
72372
72569
|
log52.warn(`Markus proxy network error (attempt ${attempt + 1}/${retries})`, { error: lastError.message });
|
|
72373
|
-
|
|
72374
|
-
|
|
72375
|
-
const delay =
|
|
72570
|
+
if (skipRetry || attempt >= retries - 1)
|
|
72571
|
+
break;
|
|
72572
|
+
const delay = retryDelayMs(void 0, attempt);
|
|
72376
72573
|
await new Promise((r) => setTimeout(r, delay));
|
|
72377
72574
|
}
|
|
72378
72575
|
}
|
|
@@ -235912,6 +236109,7 @@ async function createServices(config) {
|
|
|
235912
236109
|
const providerConfigs = {};
|
|
235913
236110
|
let defaultProvider = config.llm.defaultProvider;
|
|
235914
236111
|
const llmTimeoutMs = Number(process.env["LLM_TIMEOUT_MS"]) || config.llm.timeoutMs || void 0;
|
|
236112
|
+
const llmStreamTimeoutMs = Number(process.env["LLM_STREAM_TIMEOUT_MS"]) || void 0;
|
|
235915
236113
|
const providerMeta = new Map(PROVIDERS.map((p) => [p.id, p]));
|
|
235916
236114
|
const envPrefix = (id) => id.toUpperCase().replace(/-/g, "_");
|
|
235917
236115
|
const markusCfg = config.llm.providers["markus"] ?? {};
|
|
@@ -235982,7 +236180,8 @@ async function createServices(config) {
|
|
|
235982
236180
|
...markusModelsUrl ? { modelsUrl: markusModelsUrl } : {},
|
|
235983
236181
|
hubUrl,
|
|
235984
236182
|
...hubToken ? { hubToken } : {},
|
|
235985
|
-
timeoutMs: llmTimeoutMs
|
|
236183
|
+
timeoutMs: llmTimeoutMs,
|
|
236184
|
+
...llmStreamTimeoutMs ? { streamTimeoutMs: llmStreamTimeoutMs } : {}
|
|
235986
236185
|
};
|
|
235987
236186
|
} else if (config.llm.defaultProvider === "markus") {
|
|
235988
236187
|
log103.warn(
|
|
@@ -236006,7 +236205,8 @@ async function createServices(config) {
|
|
|
236006
236205
|
provider: "ollama",
|
|
236007
236206
|
model: model2,
|
|
236008
236207
|
...baseUrl2 ? { baseUrl: baseUrl2 } : {},
|
|
236009
|
-
timeoutMs: llmTimeoutMs
|
|
236208
|
+
timeoutMs: llmTimeoutMs,
|
|
236209
|
+
...llmStreamTimeoutMs ? { streamTimeoutMs: llmStreamTimeoutMs } : {}
|
|
236010
236210
|
};
|
|
236011
236211
|
}
|
|
236012
236212
|
continue;
|
|
@@ -236021,7 +236221,8 @@ async function createServices(config) {
|
|
|
236021
236221
|
model,
|
|
236022
236222
|
apiKey,
|
|
236023
236223
|
...baseUrl ? { baseUrl } : {},
|
|
236024
|
-
timeoutMs: llmTimeoutMs
|
|
236224
|
+
timeoutMs: llmTimeoutMs,
|
|
236225
|
+
...llmStreamTimeoutMs ? { streamTimeoutMs: llmStreamTimeoutMs } : {}
|
|
236025
236226
|
};
|
|
236026
236227
|
}
|
|
236027
236228
|
if (!providerConfigs[defaultProvider]) {
|