openpond 0.0.69 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{app-layer-EXXOWJ5H.js → app-layer-XEYHFJHI.js} +2 -2
- package/dist/chunks/{app-server-runtime-7FBQBE3C.js → app-server-runtime-Y6MW4XCG.js} +7 -6
- package/dist/chunks/{apps-RZSDOFAG.js → apps-GSXUDK6V.js} +2 -2
- package/dist/chunks/{chunk-SFMNGWNO.js → chunk-2JABRRNR.js} +1 -1
- package/dist/chunks/{chunk-MMRJNSWY.js → chunk-6G6MDZLM.js} +1096 -120
- package/dist/chunks/{chunk-NPNIL6SQ.js → chunk-AN2EYCN3.js} +1 -1
- package/dist/chunks/{chunk-F36ZVO6U.js → chunk-CNTM26OW.js} +1 -1
- package/dist/chunks/{chunk-FEOLMLYU.js → chunk-EFET7LB7.js} +21 -2
- package/dist/chunks/{training-5CPTZRVC.js → chunk-J7PYGDRY.js} +251 -16
- package/dist/chunks/{chunk-Y57RTLVV.js → chunk-N3TGCM7J.js} +93 -35
- package/dist/chunks/{chunk-BLFIIAWZ.js → chunk-NTK22KJD.js} +68 -21
- package/dist/chunks/{chunk-QTN6HXOR.js → chunk-P6JLLWMI.js} +2 -2
- package/dist/chunks/chunk-R3C3MNSI.js +140 -0
- package/dist/chunks/{chunk-7C4OIFOC.js → chunk-TGM5IPYO.js} +31 -3
- package/dist/chunks/{chunk-OOM2PHBE.js → chunk-TZWAUV2L.js} +1130 -226
- package/dist/chunks/{cli-HIXVXM72.js → cli-L5VPOV6I.js} +6 -5
- package/dist/chunks/continual-FYDKLCO7.js +803 -0
- package/dist/chunks/{core-commands-34SVH6ZQ.js → core-commands-MAN3CSJQ.js} +3 -3
- package/dist/chunks/{desktop-test-66DPBNJX.js → desktop-test-OE5SST2W.js} +2 -2
- package/dist/chunks/{extension-ZMRHCDO3.js → extension-J3CIEDP4.js} +968 -19
- package/dist/chunks/{help-COHCZEP2.js → help-JNGJJFU5.js} +1 -1
- package/dist/chunks/{opchat-2PGW2GNN.js → opchat-6HEQJFLL.js} +2 -2
- package/dist/chunks/{organizations-NZ4OY56V.js → organizations-MWAPNOCK.js} +5 -4
- package/dist/chunks/{profile-GEMTRPUG.js → profile-P7HMONTZ.js} +2 -2
- package/dist/chunks/{project-agent-NX6YBGWC.js → project-agent-2RAK7GAZ.js} +2 -2
- package/dist/chunks/{sandbox-command-UEY53OJO.js → sandbox-command-G22CPFNK.js} +2 -2
- package/dist/chunks/{sandbox-template-YKYRB645.js → sandbox-template-S4WRUWJ6.js} +3 -3
- package/dist/chunks/{src-IXYDKOBI.js → src-A6O6ZGIL.js} +15899 -8010
- package/dist/chunks/{src-LKJBD5AM.js → src-BKBZ7WLO.js} +4 -3
- package/dist/chunks/taskset-BMI7KOWP.js +66 -0
- package/dist/chunks/{teams-bot-K6KZHZJV.js → teams-bot-5VBYEN7M.js} +2 -2
- package/dist/chunks/training-UPVSGDTB.js +17 -0
- package/dist/chunks/{workspaces-WXM72UZF.js → workspaces-XM5BY3MO.js} +4 -2
- package/dist/cli.js +13 -13
- package/dist/web/assets/App-DfiCmBv6.js +173 -0
- package/dist/web/assets/{AppDialog-DX-xs3KA.js → AppDialog-CSXu5wRu.js} +1 -1
- package/dist/web/assets/{AppTerminalPanel-CYVj_ITT.js → AppTerminalPanel-y2bVL2RV.js} +2 -2
- package/dist/web/assets/{AppsView-ByjyGog7.js → AppsView-Bs9pwD2H.js} +1 -1
- package/dist/web/assets/{BrowserSidebar-BDwtMAZl.js → BrowserSidebar-CUgT5V1m.js} +1 -1
- package/dist/web/assets/{CartesianChart-Dv6jJfPR.js → CartesianChart-DA85hfrP.js} +1 -1
- package/dist/web/assets/{CollaborationTabs-CC5AIhMh.js → CollaborationTabs-B8mlPhM3.js} +1 -1
- package/dist/web/assets/{CommandMenu-Ct0Sx7yP.js → CommandMenu-EwUGCeC_.js} +1 -1
- package/dist/web/assets/{CommunityView-C_zVE0jg.js → CommunityView-IHNq-YJz.js} +1 -1
- package/dist/web/assets/{ComposerCreateImproveStrip-CNn4OywM.js → ComposerCreateImproveStrip-qOL2zA26.js} +1 -1
- package/dist/web/assets/{GetStartedView-DRFpHDLd.js → GetStartedView-C2ypO0v7.js} +1 -1
- package/dist/web/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/web/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/web/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/web/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/web/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/web/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/web/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/web/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/web/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/web/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/web/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/web/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/web/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/web/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/web/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/web/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/web/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/web/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/web/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/web/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/web/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/web/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/web/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/web/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/web/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/web/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/web/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/web/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/web/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/web/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/web/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/web/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/web/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/web/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/web/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/web/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/web/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/web/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/web/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/web/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/web/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/web/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/web/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/web/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/web/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/web/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/web/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/web/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/web/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/web/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/web/assets/LabModelVersionDetailPage-BK0eoUlW.js +1 -0
- package/dist/web/assets/{LabSkillSidebar-B9jY4AgE.js → LabSkillSidebar-CRPb4qBn.js} +1 -1
- package/dist/web/assets/LabsRoute-Bw-HD6QC.js +2 -0
- package/dist/web/assets/LabsRoute-CGFgymTX.css +1 -0
- package/dist/web/assets/MainChatThread-Cu6_UnNE.js +2 -0
- package/dist/web/assets/MainPane-k1iII9e9.js +8 -0
- package/dist/web/assets/MarkdownText-N60tvLug.js +268 -0
- package/dist/web/assets/Messages-CYQFLElK.js +10 -0
- package/dist/web/assets/{NativeSkillSidebar-DjebFRoi.js → NativeSkillSidebar-zbx7WmOk.js} +1 -1
- package/dist/web/assets/{NewExperienceSwitcher-C-bJxHxY.js → NewExperienceSwitcher-B0zev5Sx.js} +1 -1
- package/dist/web/assets/{NewProjectDialog-Cx8QcZm7.js → NewProjectDialog-lZlzrp-R.js} +1 -1
- package/dist/web/assets/{OutputsPage-Y9HM-SHX.js → OutputsPage-B4zYYUT5.js} +1 -1
- package/dist/web/assets/{ProjectsPage-BBr58yKT.js → ProjectsPage-97wgc84s.js} +1 -1
- package/dist/web/assets/RightChatPanelStack-I2znDCc7.js +1 -0
- package/dist/web/assets/{RightSidebarHomePanel-Dx-1elSI.js → RightSidebarHomePanel-BUcWVJi-.js} +1 -1
- package/dist/web/assets/ScheduledWorkPage-Bp-t0eVj.js +1 -0
- package/dist/web/assets/SettingsView-C1xyn1Y4.js +6 -0
- package/dist/web/assets/{TeamChatView-Bkyhu40R.js → TeamChatView-Fj5_yjVE.js} +2 -2
- package/dist/web/assets/{TerminalOverlay-CaCkZDzO.js → TerminalOverlay-D2WBeJvp.js} +1 -1
- package/dist/web/assets/{TrainingCreationPanel-Vvi41WNT.js → TrainingCreationPanel-dYW_dh3M.js} +1 -1
- package/dist/web/assets/{TrainingDraftPanel-C2C3hffI.js → TrainingDraftPanel-zeJWmmW6.js} +1 -1
- package/dist/web/assets/{UsageSettingsSection-DpPBd-ra.js → UsageSettingsSection-B6SBqYuB.js} +2 -2
- package/dist/web/assets/WorkSidebarPanel-BwbWKpOZ.js +1 -0
- package/dist/web/assets/{WorkspaceDiffPanel-D_zKOW4K.js → WorkspaceDiffPanel-D9Kp0vFw.js} +6 -6
- package/dist/web/assets/WorkspaceEnvironmentMenu-D-3YGp06.js +32 -0
- package/dist/web/assets/WorkspaceGitDialogs-BUbzUN4m.js +1 -0
- package/dist/web/assets/{WorkspaceMonacoEditor--GOVrHFp.js → WorkspaceMonacoEditor-CXPY7bBI.js} +3 -3
- package/dist/web/assets/{arrow-up-right-BRZWXpqJ.js → arrow-up-right-C7VWgGQP.js} +1 -1
- package/dist/web/assets/{chat-file-links-CgFHK89C.js → chat-file-links-CqfMdhHQ.js} +1 -1
- package/dist/web/assets/chevron-up-DD9Tei-Q.js +1 -0
- package/dist/web/assets/{clipboard-dPd_3lpG.js → clipboard-B-8k7mlT.js} +1 -1
- package/dist/web/assets/{cloud-upload-DOwvN4hp.js → cloud-upload-CUVFzURz.js} +1 -1
- package/dist/web/assets/{cssMode-BM4j9M0D.js → cssMode-DYvfmqoL.js} +1 -1
- package/dist/web/assets/{folder-open-DavjPCw4.js → folder-open-CnbcQIy8.js} +1 -1
- package/dist/web/assets/{folder-plus-Dyqast6G.js → folder-plus-BOaLAKy4.js} +1 -1
- package/dist/web/assets/{git-commit-horizontal-s3X0cQlz.js → git-commit-horizontal-DQeHsooT.js} +1 -1
- package/dist/web/assets/{htmlMode-Nlx7ckXa.js → htmlMode-BXEI-BVY.js} +1 -1
- package/dist/web/assets/index-CGMb_VXm.css +1 -0
- package/dist/web/assets/{index-5-B6FIuE.js → index-D-VK8mST.js} +1 -1
- package/dist/web/assets/index-D-WCyNdJ.js +1 -0
- package/dist/web/assets/{info-CVvrNOHr.js → info-DtzDuGLn.js} +1 -1
- package/dist/web/assets/{jsonMode-B7monA6g.js → jsonMode-Dosjh_hK.js} +1 -1
- package/dist/web/assets/{lspLanguageFeatures-CcJ9GDtK.js → lspLanguageFeatures-BNe-6FJA.js} +1 -1
- package/dist/web/assets/{minimize-2-O1DnznGK.js → minimize-2-DnxKN5oK.js} +1 -1
- package/dist/web/assets/{monaco.contribution-QOOCizYq.js → monaco.contribution-CfF-ajhi.js} +2 -2
- package/dist/web/assets/{monaco.contribution-2PozfA9g.js → monaco.contribution-CnkROzNv.js} +2 -2
- package/dist/web/assets/{monaco.contribution-BSJ2jQTi.js → monaco.contribution-Dyns81H2.js} +2 -2
- package/dist/web/assets/{monaco.contribution-BMAF2bmO.js → monaco.contribution-ytyanGyj.js} +2 -2
- package/dist/web/assets/{play-BpCc5ZbR.js → play-B3o6IAQd.js} +1 -1
- package/dist/web/assets/{python-BK41iew-.js → python-B7zZ_9Z_.js} +1 -1
- package/dist/web/assets/{refresh-cw-Csoy1ev1.js → refresh-cw-DSJZXa8S.js} +1 -1
- package/dist/web/assets/{save-Dbztj0W7.js → save-iC-AXHN6.js} +1 -1
- package/dist/web/assets/square-B2roZTxf.js +1 -0
- package/dist/web/assets/{toggleHighContrast-DrmwDpyz.js → toggleHighContrast-CjlV4YHK.js} +1 -1
- package/dist/web/assets/{training-daZlCtKV.css → training-eg6uFi3M.css} +1 -1
- package/dist/web/assets/{tsMode-CFgCMr7d.js → tsMode-XmKmSq0B.js} +1 -1
- package/dist/web/assets/{upload-C5nhiSMq.js → upload-BgHXNjfJ.js} +1 -1
- package/dist/web/assets/{useLocalAgentSchedules-LAsobERb.js → useLocalAgentSchedules-CVJz0AMr.js} +1 -1
- package/dist/web/assets/{wifi-off-BHxh2UbA.js → wifi-off-CneL8bDZ.js} +1 -1
- package/dist/web/assets/{workers-FKb-NyBI.js → workers-CT7VYBR5.js} +1 -1
- package/dist/web/assets/{yaml-C5DbF9S6.js → yaml-CF8jchCz.js} +1 -1
- package/dist/web/index.html +2 -2
- package/docs/command-reference.md +58 -2
- package/package.json +3 -1
- package/dist/web/assets/App-BF9L0JUv.js +0 -171
- package/dist/web/assets/LabModelVersionDetailPage-BzF-IVXQ.js +0 -1
- package/dist/web/assets/LabsRoute-CS_orT9s.css +0 -1
- package/dist/web/assets/LabsRoute-Di1Zs4gZ.js +0 -2
- package/dist/web/assets/MainChatThread-8VzlD8Hi.js +0 -2
- package/dist/web/assets/MainPane-StAOFINE.js +0 -6
- package/dist/web/assets/MarkdownText-B8D_ftSJ.js +0 -9
- package/dist/web/assets/Messages-TY62tiDp.js +0 -10
- package/dist/web/assets/RightChatPanelStack-DzUbDKwp.js +0 -1
- package/dist/web/assets/ScheduledWorkPage-BuXw_W8b.js +0 -1
- package/dist/web/assets/SettingsView-DB_zPHYY.js +0 -6
- package/dist/web/assets/WorkSidebarPanel-CeWGboTh.js +0 -1
- package/dist/web/assets/WorkspaceEnvironmentMenu-BTz9FISP.js +0 -32
- package/dist/web/assets/WorkspaceGitDialogs-BnBRUYpS.js +0 -1
- package/dist/web/assets/activity-DA5DNQwD.js +0 -1
- package/dist/web/assets/chevron-up-DSv2auz_.js +0 -1
- package/dist/web/assets/git-branch-zKnZdQiX.js +0 -1
- package/dist/web/assets/index-CQ3CPVHZ.css +0 -1
- package/dist/web/assets/index-CuoGlf-W.js +0 -1
- package/dist/web/assets/square-ju7fWa0W.js +0 -1
|
@@ -3,7 +3,7 @@ import { createRequire as __openpondCreateRequire } from "node:module"; var requ
|
|
|
3
3
|
// ../server/src/constants.ts
|
|
4
4
|
var DEFAULT_HOST = "127.0.0.1";
|
|
5
5
|
var DEFAULT_PORT = 17874;
|
|
6
|
-
var VERSION = "0.0
|
|
6
|
+
var VERSION = "0.1.0";
|
|
7
7
|
var HOSTED_CHAT_SYSTEM_PROMPT = "You are OpenPond Chat. Respond in the user's language. If the user's latest message is language-neutral, ambiguous, or only a short test, respond in English. Be concise and directly answer the latest request. Do not use emojis. Use Markdown when it improves scanability. If you emit reasoning or thinking content, keep it sparse and user-readable: at most one short sentence for major progress, decisions, or blockers. Omit reasoning for routine searches, reads, tool calls, and obvious next steps. Do not restate the user request, narrate every action, or include code blocks, code excerpts, diffs, raw tool payloads, or markdown examples in reasoning. Put necessary code or exact snippets only in the final assistant answer. When the user asks to show or preview an image that is available as a workspace path or signed image URL, use Markdown image syntax like  instead of a bare path or raw HTML. For workspace-backed answers, use a Codex-style shape: brief outcome first, then Changed Files if files changed, then Verification if checks ran. End with a concise final answer that summarizes the result and verification when relevant. Do not mention raw tool JSON, internal repo paths, or origin/remote URLs unless the user explicitly asks for them or they are necessary to explain a git/deploy failure.";
|
|
8
8
|
var APP_PREFERENCES_CACHE_TYPE = "app_preferences";
|
|
9
9
|
var APP_PREFERENCES_CACHE_KEY = "global";
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
saveConfig,
|
|
13
13
|
saveProfileApiKey,
|
|
14
14
|
setActiveProfile
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-6G6MDZLM.js";
|
|
16
16
|
import {
|
|
17
17
|
DEFAULT_OPENPOND_API_BASE_URL,
|
|
18
18
|
DEFAULT_OPENPOND_WEB_BASE_URL
|
|
@@ -177,8 +177,9 @@ function findActiveAccount(config, requestedHandle, requestedBaseUrl) {
|
|
|
177
177
|
if (exact)
|
|
178
178
|
return exact;
|
|
179
179
|
const sameHandle = accounts.filter((account) => handleEquals(account.handle, requestedProfile.handle));
|
|
180
|
-
if (
|
|
180
|
+
if (sameHandle.length === 1)
|
|
181
181
|
return sameHandle[0] ?? null;
|
|
182
|
+
return null;
|
|
182
183
|
}
|
|
183
184
|
if (accounts[0])
|
|
184
185
|
return accounts[0];
|
|
@@ -1186,6 +1187,23 @@ async function removeOpenPondAccount(input) {
|
|
|
1186
1187
|
return loadOpenPondAccountContext();
|
|
1187
1188
|
}
|
|
1188
1189
|
|
|
1190
|
+
// ../../packages/runtime/dist/sign-out-account.js
|
|
1191
|
+
async function signOutOpenPondAccount() {
|
|
1192
|
+
const config = await loadGlobalConfig();
|
|
1193
|
+
const activeProfile = normalizeActiveProfile(config.activeProfile);
|
|
1194
|
+
const accounts = (config.accounts ?? []).map((account) => ({ ...account }));
|
|
1195
|
+
const activeIndex = activeProfile ? accounts.findIndex((account) => accountMatchesSelector(account, activeProfile)) : 0;
|
|
1196
|
+
if (activeIndex < 0 || !accounts[activeIndex]) {
|
|
1197
|
+
throw new Error("No active OpenPond account to log out.");
|
|
1198
|
+
}
|
|
1199
|
+
const signedOutAccount = { ...accounts[activeIndex] };
|
|
1200
|
+
delete signedOutAccount.apiKey;
|
|
1201
|
+
delete signedOutAccount.session;
|
|
1202
|
+
accounts[activeIndex] = signedOutAccount;
|
|
1203
|
+
await saveConfig({ ...config, accounts });
|
|
1204
|
+
return loadOpenPondAccountContext(signedOutAccount.handle, signedOutAccount.baseUrl);
|
|
1205
|
+
}
|
|
1206
|
+
|
|
1189
1207
|
// ../../packages/runtime/dist/update-account-config.js
|
|
1190
1208
|
function findAccountIndex2(accounts, handle, currentBaseUrl) {
|
|
1191
1209
|
const normalizedCurrentBaseUrl = normalizeBaseUrl(currentBaseUrl);
|
|
@@ -1304,6 +1322,7 @@ export {
|
|
|
1304
1322
|
streamOpenPondHostedChatTurn,
|
|
1305
1323
|
saveOpenPondAccount,
|
|
1306
1324
|
removeOpenPondAccount,
|
|
1325
|
+
signOutOpenPondAccount,
|
|
1307
1326
|
updateOpenPondAccountConfig,
|
|
1308
1327
|
getOpenPondAppEnvironment,
|
|
1309
1328
|
getBundledRuntimeVersion,
|
|
@@ -2,18 +2,17 @@ import { createRequire as __openpondCreateRequire } from "node:module"; var requ
|
|
|
2
2
|
import {
|
|
3
3
|
resolveApiBaseUrlOption
|
|
4
4
|
} from "./chunk-SMNFI2FU.js";
|
|
5
|
-
import "./chunk-KSRWKXRB.js";
|
|
6
5
|
import {
|
|
7
6
|
optionString,
|
|
8
7
|
parseBooleanOption,
|
|
9
8
|
parseIntegerOption,
|
|
10
9
|
parseNumberOption
|
|
11
10
|
} from "./chunk-MUMPWI4O.js";
|
|
12
|
-
import "./chunk-UACZUFIA.js";
|
|
13
11
|
|
|
14
12
|
// src/cli/training.ts
|
|
15
13
|
import { readFile } from "node:fs/promises";
|
|
16
14
|
import { request as requestHttp } from "node:http";
|
|
15
|
+
import { randomUUID } from "node:crypto";
|
|
17
16
|
import os from "node:os";
|
|
18
17
|
import path from "node:path";
|
|
19
18
|
import { createInterface } from "node:readline/promises";
|
|
@@ -35,12 +34,13 @@ async function runTrainingCommand(options, rest, dependencies = {}) {
|
|
|
35
34
|
"cancel",
|
|
36
35
|
"resume",
|
|
37
36
|
"artifacts",
|
|
38
|
-
"benchmark"
|
|
37
|
+
"benchmark",
|
|
38
|
+
"create-project"
|
|
39
39
|
].includes(
|
|
40
40
|
subcommand
|
|
41
41
|
) || !id) {
|
|
42
42
|
throw new Error(
|
|
43
|
-
"usage: training <start|status|watch|logs|cancel|resume|artifacts|benchmark> <model-run-id|run-id|model-id>"
|
|
43
|
+
"usage: training <create-project|start|status|watch|logs|cancel|resume|artifacts|benchmark> <taskset-id|model-run-id|run-id|model-id>"
|
|
44
44
|
);
|
|
45
45
|
}
|
|
46
46
|
if (rest.length > 2) {
|
|
@@ -52,6 +52,15 @@ async function runTrainingCommand(options, rest, dependencies = {}) {
|
|
|
52
52
|
request: dependencies.request ?? await createLocalAuthenticatedRequest(baseUrl)
|
|
53
53
|
});
|
|
54
54
|
const json = parseBooleanOption(options.json);
|
|
55
|
+
if (subcommand === "create-project") {
|
|
56
|
+
const project = await createManagedModelProject({
|
|
57
|
+
client,
|
|
58
|
+
options,
|
|
59
|
+
tasksetId: id
|
|
60
|
+
});
|
|
61
|
+
printResult(project, json);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
55
64
|
if (subcommand === "benchmark") {
|
|
56
65
|
await startHarnessRefinerBenchmark({
|
|
57
66
|
client,
|
|
@@ -193,6 +202,20 @@ var TrainingApiClient = class {
|
|
|
193
202
|
body
|
|
194
203
|
);
|
|
195
204
|
}
|
|
205
|
+
prepareModelProject(id, body) {
|
|
206
|
+
return this.json(
|
|
207
|
+
`/v1/training/model-projects/${encodeURIComponent(id)}/training/prepare`,
|
|
208
|
+
"POST",
|
|
209
|
+
body
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
startModelProject(id, body) {
|
|
213
|
+
return this.json(
|
|
214
|
+
`/v1/training/model-projects/${encodeURIComponent(id)}/training/start`,
|
|
215
|
+
"POST",
|
|
216
|
+
body
|
|
217
|
+
);
|
|
218
|
+
}
|
|
196
219
|
trainingState() {
|
|
197
220
|
return this.json("/v1/training", "GET");
|
|
198
221
|
}
|
|
@@ -203,6 +226,28 @@ var TrainingApiClient = class {
|
|
|
203
226
|
body
|
|
204
227
|
);
|
|
205
228
|
}
|
|
229
|
+
importTasksetDraftPackage(body) {
|
|
230
|
+
return this.json("/v1/training/taskset-drafts/import", "POST", body);
|
|
231
|
+
}
|
|
232
|
+
publishTasksetDraft(draftId, modelId) {
|
|
233
|
+
return this.json(
|
|
234
|
+
`/v1/training/taskset-drafts/${encodeURIComponent(draftId)}/publish`,
|
|
235
|
+
"POST",
|
|
236
|
+
modelId ? { modelId } : {}
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
tasksetReadiness(tasksetId) {
|
|
240
|
+
return this.json("/v1/training/readiness", "POST", { tasksetId });
|
|
241
|
+
}
|
|
242
|
+
deleteTasksetDraft(draftId) {
|
|
243
|
+
return this.json(
|
|
244
|
+
`/v1/training/taskset-drafts/${encodeURIComponent(draftId)}`,
|
|
245
|
+
"DELETE"
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
saveModelProject(project) {
|
|
249
|
+
return this.json("/v1/training/models", "PUT", project);
|
|
250
|
+
}
|
|
206
251
|
async json(pathname, method, body) {
|
|
207
252
|
const response = await this.request(`${this.baseUrl}${pathname}`, {
|
|
208
253
|
method,
|
|
@@ -231,9 +276,9 @@ var TrainingApiClient = class {
|
|
|
231
276
|
async function startHarnessRefinerBenchmark(input) {
|
|
232
277
|
const state = await input.client.trainingState();
|
|
233
278
|
const project = modelProject(state, input.modelId);
|
|
234
|
-
const providerId = optionString(input.options, "provider")
|
|
235
|
-
const modelId = optionString(input.options, "model")
|
|
236
|
-
const effort = optionString(input.options, "reasoningEffort")
|
|
279
|
+
const providerId = optionString(input.options, "provider") || "openpond";
|
|
280
|
+
const modelId = optionString(input.options, "model") || "openpond-chat";
|
|
281
|
+
const effort = optionString(input.options, "reasoningEffort") || "high";
|
|
237
282
|
const maximumSpendUsd = parseNumberOption(input.options.maxSpend, "max-spend") ?? 10;
|
|
238
283
|
if (maximumSpendUsd <= 0) throw new Error("max-spend must be greater than zero");
|
|
239
284
|
if (parseBooleanOption(input.options.detach)) {
|
|
@@ -273,6 +318,188 @@ function objectString(value, key) {
|
|
|
273
318
|
const candidate = value[key];
|
|
274
319
|
return typeof candidate === "string" && candidate ? candidate : null;
|
|
275
320
|
}
|
|
321
|
+
async function createManagedModelProject(input) {
|
|
322
|
+
const recipePath = optionString(input.options, "recipe");
|
|
323
|
+
if (!recipePath) {
|
|
324
|
+
throw new Error("training create-project requires --recipe <versioned-recipe.json>");
|
|
325
|
+
}
|
|
326
|
+
const recipe = await readJsonObject(recipePath, "Training recipe");
|
|
327
|
+
const state = await input.client.trainingState();
|
|
328
|
+
const taskset = trainingStateRecord(state, "tasksets", input.tasksetId, "Taskset");
|
|
329
|
+
const profileId = optionString(input.options, "profile") || objectString(taskset, "profileId");
|
|
330
|
+
if (!profileId) {
|
|
331
|
+
throw new Error(
|
|
332
|
+
`The Taskset has no Profile id (received ${typeof taskset.profileId}: ${String(taskset.profileId)}).`
|
|
333
|
+
);
|
|
334
|
+
}
|
|
335
|
+
const tasksetProfileId = objectString(taskset, "profileId");
|
|
336
|
+
if (tasksetProfileId !== profileId) {
|
|
337
|
+
throw new Error(
|
|
338
|
+
`Taskset ${input.tasksetId} belongs to Profile ${tasksetProfileId ?? "unknown"}, not ${profileId}.`
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
const projectId = optionString(input.options, "projectId") || `model_${randomUUID()}`;
|
|
342
|
+
const projects = trainingStateRecords(state, "modelProjects");
|
|
343
|
+
const existingProject = projects.find(
|
|
344
|
+
(project) => objectString(project, "id") === projectId
|
|
345
|
+
);
|
|
346
|
+
const rolloutPlacement = enumOption(
|
|
347
|
+
input.options,
|
|
348
|
+
"rolloutPlacement",
|
|
349
|
+
["local", "remote"],
|
|
350
|
+
"local"
|
|
351
|
+
);
|
|
352
|
+
const gpuPlacementObjective = enumOption(
|
|
353
|
+
input.options,
|
|
354
|
+
"gpuPlacementObjective",
|
|
355
|
+
["fast", "balanced", "economical"],
|
|
356
|
+
"balanced"
|
|
357
|
+
);
|
|
358
|
+
const runPreset = enumOption(
|
|
359
|
+
input.options,
|
|
360
|
+
"runPreset",
|
|
361
|
+
["small", "standard", "custom", "small_experiment"],
|
|
362
|
+
"custom"
|
|
363
|
+
);
|
|
364
|
+
const maximumSpendUsd = parseNumberOption(input.options.maxSpend, "max-spend") ?? null;
|
|
365
|
+
if (maximumSpendUsd !== null && maximumSpendUsd < 0) {
|
|
366
|
+
throw new Error("max-spend must be non-negative");
|
|
367
|
+
}
|
|
368
|
+
const retentionDays = parseIntegerOption(
|
|
369
|
+
input.options.retentionDays,
|
|
370
|
+
"retention-days"
|
|
371
|
+
) ?? null;
|
|
372
|
+
if (retentionDays !== null && retentionDays < 0) {
|
|
373
|
+
throw new Error("retention-days must be non-negative");
|
|
374
|
+
}
|
|
375
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
376
|
+
const contentHash = objectString(taskset, "contentHash");
|
|
377
|
+
const revision = objectNumber(taskset, "revision");
|
|
378
|
+
if (!contentHash || !revision || revision < 1) {
|
|
379
|
+
throw new Error("The Taskset does not have an immutable published revision.");
|
|
380
|
+
}
|
|
381
|
+
const method = objectString(recipe, "method");
|
|
382
|
+
if (!method) throw new Error("Training recipe must declare its method.");
|
|
383
|
+
const baseModel = managedBasePreferenceFromRecipe(recipe);
|
|
384
|
+
if (existingProject) {
|
|
385
|
+
const existingSetup = objectRecord(existingProject, "trainingSetup");
|
|
386
|
+
const existingTasksetRef = objectRecord(existingSetup, "tasksetRef");
|
|
387
|
+
if (objectString(existingTasksetRef, "id") !== input.tasksetId || objectString(existingProject, "profileId") !== profileId) {
|
|
388
|
+
throw new Error(
|
|
389
|
+
`Model Project ${projectId} already exists for a different Profile or Taskset.`
|
|
390
|
+
);
|
|
391
|
+
}
|
|
392
|
+
if (objectRecord(existingSetup, "baseModel")) {
|
|
393
|
+
throw new Error(`Model Project ${projectId} already exists.`);
|
|
394
|
+
}
|
|
395
|
+
return input.client.saveModelProject({
|
|
396
|
+
...existingProject,
|
|
397
|
+
revision: objectNumber(existingProject, "revision") ?? 1,
|
|
398
|
+
defaultBaseModel: baseModel,
|
|
399
|
+
trainingSetup: {
|
|
400
|
+
...existingSetup,
|
|
401
|
+
baseModel,
|
|
402
|
+
recipe
|
|
403
|
+
},
|
|
404
|
+
updatedAt: timestamp
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
return input.client.saveModelProject({
|
|
408
|
+
schemaVersion: "openpond.modelProject.v2",
|
|
409
|
+
id: projectId,
|
|
410
|
+
profileId,
|
|
411
|
+
revision: 1,
|
|
412
|
+
name: optionString(input.options, "name") || objectString(taskset, "name") || "Managed Model",
|
|
413
|
+
objective: optionString(input.options, "objective") || objectString(taskset, "objective"),
|
|
414
|
+
defaultBaseModel: baseModel,
|
|
415
|
+
defaultDestinationId: optionString(input.options, "destination") || "openpond_managed",
|
|
416
|
+
trainingSetup: {
|
|
417
|
+
tasksetRef: { id: input.tasksetId, revision, contentHash },
|
|
418
|
+
tasksetRelease: null,
|
|
419
|
+
harnessRelease: null,
|
|
420
|
+
baseModel,
|
|
421
|
+
method,
|
|
422
|
+
destinationId: optionString(input.options, "destination") || "openpond_managed",
|
|
423
|
+
managedRolloutPlacement: rolloutPlacement,
|
|
424
|
+
managedGpuPlacementObjective: gpuPlacementObjective,
|
|
425
|
+
managedGpuRequirement: "any",
|
|
426
|
+
runPreset,
|
|
427
|
+
recipe,
|
|
428
|
+
preferredMaximumSpendUsd: maximumSpendUsd,
|
|
429
|
+
preferredRetentionDays: retentionDays
|
|
430
|
+
},
|
|
431
|
+
hosted: null,
|
|
432
|
+
tasksetSyncs: [],
|
|
433
|
+
createdAt: timestamp,
|
|
434
|
+
updatedAt: timestamp
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
function managedBasePreferenceFromRecipe(recipe) {
|
|
438
|
+
const recipeBase = objectRecord(recipe, "baseModel");
|
|
439
|
+
const modelId = objectString(recipeBase, "id");
|
|
440
|
+
const revision = objectString(recipeBase, "revision");
|
|
441
|
+
const tokenizerRevision = objectString(recipeBase, "tokenizerRevision");
|
|
442
|
+
const chatTemplateHash = objectString(recipeBase, "chatTemplateHash");
|
|
443
|
+
if (!modelId || !revision || !tokenizerRevision || !chatTemplateHash) {
|
|
444
|
+
throw new Error(
|
|
445
|
+
"Managed GRPO recipe must pin baseModel id, revision, tokenizerRevision, and chatTemplateHash."
|
|
446
|
+
);
|
|
447
|
+
}
|
|
448
|
+
return {
|
|
449
|
+
schemaVersion: "openpond.baseModelPreference.v1",
|
|
450
|
+
modelId,
|
|
451
|
+
revision,
|
|
452
|
+
tokenizerRevision,
|
|
453
|
+
chatTemplateHash,
|
|
454
|
+
modelAssetId: null,
|
|
455
|
+
source: "managed"
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
function trainingStateRecord(state, key, id, label) {
|
|
459
|
+
const match = trainingStateRecords(state, key).find(
|
|
460
|
+
(candidate) => objectString(candidate, "id") === id
|
|
461
|
+
);
|
|
462
|
+
if (!match) throw new Error(`${label} ${id} was not found.`);
|
|
463
|
+
return match;
|
|
464
|
+
}
|
|
465
|
+
function trainingStateRecords(state, key) {
|
|
466
|
+
if (!state || typeof state !== "object" || !(key in state)) return [];
|
|
467
|
+
const value = state[key];
|
|
468
|
+
return Array.isArray(value) ? value.filter(
|
|
469
|
+
(candidate) => Boolean(candidate) && typeof candidate === "object" && !Array.isArray(candidate)
|
|
470
|
+
) : [];
|
|
471
|
+
}
|
|
472
|
+
function objectNumber(value, key) {
|
|
473
|
+
if (!value || typeof value !== "object" || !(key in value)) return null;
|
|
474
|
+
const candidate = value[key];
|
|
475
|
+
return typeof candidate === "number" && Number.isFinite(candidate) ? candidate : null;
|
|
476
|
+
}
|
|
477
|
+
function objectRecord(value, key) {
|
|
478
|
+
if (!value || typeof value !== "object" || !(key in value)) return null;
|
|
479
|
+
const candidate = value[key];
|
|
480
|
+
return candidate && typeof candidate === "object" && !Array.isArray(candidate) ? candidate : null;
|
|
481
|
+
}
|
|
482
|
+
function enumOption(options, key, values, fallback) {
|
|
483
|
+
const value = optionString(options, key) || fallback;
|
|
484
|
+
if (!values.includes(value)) {
|
|
485
|
+
throw new Error(`${key} must be one of ${values.join(", ")}`);
|
|
486
|
+
}
|
|
487
|
+
return value;
|
|
488
|
+
}
|
|
489
|
+
async function readJsonObject(file, label) {
|
|
490
|
+
let parsed;
|
|
491
|
+
try {
|
|
492
|
+
parsed = JSON.parse(await readFile(file, "utf8"));
|
|
493
|
+
} catch (error) {
|
|
494
|
+
throw new Error(
|
|
495
|
+
`Could not read ${label} ${file}: ${error instanceof Error ? error.message : String(error)}`
|
|
496
|
+
);
|
|
497
|
+
}
|
|
498
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
499
|
+
throw new Error(`${label} must be a JSON object.`);
|
|
500
|
+
}
|
|
501
|
+
return parsed;
|
|
502
|
+
}
|
|
276
503
|
async function startTraining(input) {
|
|
277
504
|
const maximumSpendUsd = parseNumberOption(
|
|
278
505
|
input.options.maxSpend,
|
|
@@ -287,11 +514,13 @@ async function startTraining(input) {
|
|
|
287
514
|
}
|
|
288
515
|
const manifestPath = optionString(input.options, "manifest");
|
|
289
516
|
const manifest = manifestPath ? await readManifest(manifestPath) : void 0;
|
|
517
|
+
const comparisonSeriesEntryId = optionString(
|
|
518
|
+
input.options,
|
|
519
|
+
"comparisonSeriesEntry"
|
|
520
|
+
) || null;
|
|
290
521
|
const controls = { maximumSpendUsd, retentionDays };
|
|
291
|
-
const preparation = await input.client.
|
|
522
|
+
const preparation = await input.client.prepareModelProject(
|
|
292
523
|
input.modelRunId,
|
|
293
|
-
"prepare",
|
|
294
|
-
"POST",
|
|
295
524
|
controls
|
|
296
525
|
);
|
|
297
526
|
if (!input.json) {
|
|
@@ -302,11 +531,14 @@ async function startTraining(input) {
|
|
|
302
531
|
if (!confirmed) {
|
|
303
532
|
throw new Error("Training start cancelled.");
|
|
304
533
|
}
|
|
305
|
-
const result = await input.client.
|
|
534
|
+
const result = await input.client.startModelProject(
|
|
306
535
|
input.modelRunId,
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
536
|
+
{
|
|
537
|
+
...controls,
|
|
538
|
+
exportApproved: parseBooleanOption(input.options.exportApproved),
|
|
539
|
+
manifest,
|
|
540
|
+
comparisonSeriesEntryId
|
|
541
|
+
}
|
|
310
542
|
);
|
|
311
543
|
printResult(result, input.json);
|
|
312
544
|
if (parseBooleanOption(input.options.detach)) return;
|
|
@@ -393,7 +625,10 @@ function printResult(value, json) {
|
|
|
393
625
|
}
|
|
394
626
|
console.log(JSON.stringify(value, null, 2));
|
|
395
627
|
}
|
|
628
|
+
|
|
396
629
|
export {
|
|
397
|
-
|
|
398
|
-
runTrainingCommand
|
|
630
|
+
DEFAULT_LOCAL_TRAINING_API_URL,
|
|
631
|
+
runTrainingCommand,
|
|
632
|
+
createLocalAuthenticatedRequest,
|
|
633
|
+
TrainingApiClient
|
|
399
634
|
};
|