@hoox-sh/hoox-shared 1.2.1 → 1.3.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/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +223 -59
- package/dist/path-utils.d.ts +35 -4
- package/dist/path-utils.d.ts.map +1 -1
- package/dist/path-utils.js +72 -5
- package/dist/session.js +69 -5
- package/dist/stores/config-store.d.ts +2 -0
- package/dist/stores/config-store.d.ts.map +1 -1
- package/dist/stores/config-store.js +267 -16
- package/dist/stores/service-store.d.ts +12 -0
- package/dist/stores/service-store.d.ts.map +1 -1
- package/dist/stores/service-store.js +100 -39
- package/dist/stores/ui-store.d.ts +14 -0
- package/dist/stores/ui-store.d.ts.map +1 -1
- package/dist/stores/ui-store.js +8 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -55,8 +55,8 @@ export { restoreSession, saveSession } from "./session";
|
|
|
55
55
|
export type { SessionState } from "./session";
|
|
56
56
|
export { formatRelativeTime as formatRelativeTimeFromTime } from "./format-time";
|
|
57
57
|
export type { ViewId, ModalState, WorkerStatus, WorkerInfo, TradeSide, Trade, AlertSeverity, Alert, LogLevel, LogEntry, SystemMetrics, ConnectionStatus, LogFilter, NotificationPreferences, CliErrorType, CliErrorDetails, } from "./types";
|
|
58
|
-
export { getHooxHome, resolveHooxPath, isWithinHooxHome, getRelativeHooxPath, getHooxRepoPath, getHooxConfigDir, getHooxDataDir, getHooxWranglerPath, getHooxStatePath, isHooxSetupRoot, findHooxSetupRoot, resolveHooxRuntimeRoot, getTuiEntryCandidates, } from "./path-utils";
|
|
59
|
-
export type { HooxPath, RuntimeRootSource, RuntimeRootResult, } from "./path-utils";
|
|
58
|
+
export { getHooxHome, resolveHooxPath, isWithinHooxHome, getRelativeHooxPath, getHooxRepoPath, getHooxConfigDir, getHooxDataDir, getHooxWranglerPath, getHooxStatePath, isHooxSetupRoot, findHooxSetupRoot, resolveHooxRuntimeRoot, getTuiEntryCandidates, getRememberedMonorepoPath, getRememberedMonorepoRoot, rememberMonorepoRoot, } from "./path-utils";
|
|
59
|
+
export type { HooxPath, RuntimeRootSource, RuntimeRootResult, RememberedMonorepo, } from "./path-utils";
|
|
60
60
|
export { DASHBOARD_WORKER_PREFIX, DASHBOARD_SECTION_PREFIX, DASHBOARD_FIELD_KV_OVERRIDES, DASHBOARD_SECTIONS_NOT_FLAT_KV, DASHBOARD_SECTIONS_UI_SKIP, DASHBOARD_WORKER_IDS, buildDashboardKvKey, isDashboardSectionFlatKv, isDashboardSectionEditable, stripJsonc, parseDashboardManifest, dashboardWorkerDir, kvManifestFromDashboardManifests, loadDashboardKvManifestFromRoot, loadDashboardManifestsFromRoot, } from "./dashboard-manifest";
|
|
61
61
|
export type { DashboardFieldType, DashboardFieldKind, DashboardFieldOption, DashboardSettingField, DashboardSection, WorkerDashboardManifest, DashboardWorkerId, DashboardKvManifestKey, DashboardKvManifest, } from "./dashboard-manifest";
|
|
62
62
|
export { AGENT_CONFIG_KV_KEY, AGENT_CONFIG_EMBEDDED_FIELDS, DASHBOARD_SECTIONS_AGENT_CONFIG, isAgentConfigEmbeddedField, isAgentConfigSection, parseAgentConfigJson, serializeAgentConfigForKv, getAgentConfigEmbeddedValue, setAgentConfigEmbeddedValue, expandAgentConfigToFieldMap, applyAgentConfigFieldUpdates, } from "./agent-config-fields";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;GAUG;AAIH,OAAO,EACL,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAIjB,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,OAAO,EACP,MAAM,GACP,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,cAAc,EACd,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,WAAW,GACZ,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,sBAAsB,EACtB,eAAe,EACf,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,OAAO,EACP,MAAM,EACN,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EACV,YAAY,EACZ,cAAc,EACd,WAAW,EACX,aAAa,EACb,QAAQ,EACR,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5D,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EACL,YAAY,EACZ,yBAAyB,EACzB,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,6BAA6B,EAC7B,0BAA0B,EAC1B,8BAA8B,EAC9B,8BAA8B,EAC9B,iCAAiC,EACjC,uCAAuC,EACvC,wCAAwC,EACxC,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,YAAY,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC;AAIpB,cAAc,cAAc,CAAC;AAI7B,OAAO,EACL,MAAM,EACN,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,QAAQ,EACR,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,cAAc,EACd,YAAY,EACZ,SAAS,GACV,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,cAAc,EACd,UAAU,EACV,eAAe,EACf,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,gCAAgC,EAChC,4BAA4B,EAC5B,6BAA6B,EAC7B,aAAa,EACb,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,OAAO,CAAC;AACf,OAAO,EACL,+BAA+B,EAC/B,wBAAwB,EACxB,4BAA4B,EAC5B,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,iBAAiB,EACjB,wBAAwB,EACxB,oBAAoB,EACpB,+BAA+B,GAChC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxD,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,IAAI,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAGjF,YAAY,EACV,MAAM,EACN,UAAU,EACV,YAAY,EACZ,UAAU,EACV,SAAS,EACT,KAAK,EACL,aAAa,EACb,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,uBAAuB,EACvB,YAAY,EACZ,eAAe,GAChB,MAAM,SAAS,CAAC;AAIjB,OAAO,EACL,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;GAUG;AAIH,OAAO,EACL,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAIjB,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,OAAO,EACP,MAAM,GACP,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,cAAc,EACd,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,WAAW,GACZ,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,sBAAsB,EACtB,eAAe,EACf,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,OAAO,EACP,MAAM,EACN,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EACV,YAAY,EACZ,cAAc,EACd,WAAW,EACX,aAAa,EACb,QAAQ,EACR,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5D,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EACL,YAAY,EACZ,yBAAyB,EACzB,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,6BAA6B,EAC7B,0BAA0B,EAC1B,8BAA8B,EAC9B,8BAA8B,EAC9B,iCAAiC,EACjC,uCAAuC,EACvC,wCAAwC,EACxC,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,YAAY,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC;AAIpB,cAAc,cAAc,CAAC;AAI7B,OAAO,EACL,MAAM,EACN,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,QAAQ,EACR,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,cAAc,EACd,YAAY,EACZ,SAAS,GACV,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,cAAc,EACd,UAAU,EACV,eAAe,EACf,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,gCAAgC,EAChC,4BAA4B,EAC5B,6BAA6B,EAC7B,aAAa,EACb,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,OAAO,CAAC;AACf,OAAO,EACL,+BAA+B,EAC/B,wBAAwB,EACxB,4BAA4B,EAC5B,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,iBAAiB,EACjB,wBAAwB,EACxB,oBAAoB,EACpB,+BAA+B,GAChC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxD,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,IAAI,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAGjF,YAAY,EACV,MAAM,EACN,UAAU,EACV,YAAY,EACZ,UAAU,EACV,SAAS,EACT,KAAK,EACL,aAAa,EACb,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,uBAAuB,EACvB,YAAY,EACZ,eAAe,GAChB,MAAM,SAAS,CAAC;AAIjB,OAAO,EACL,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAItB,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,4BAA4B,EAC5B,8BAA8B,EAC9B,0BAA0B,EAC1B,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAC1B,UAAU,EACV,sBAAsB,EACtB,kBAAkB,EAClB,gCAAgC,EAChC,+BAA+B,EAC/B,8BAA8B,GAC/B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EACL,mBAAmB,EACnB,4BAA4B,EAC5B,+BAA+B,EAC/B,0BAA0B,EAC1B,oBAAoB,EACpB,oBAAoB,EACpB,yBAAyB,EACzB,2BAA2B,EAC3B,2BAA2B,EAC3B,2BAA2B,EAC3B,4BAA4B,GAC7B,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAIlE,YAAY,EACV,MAAM,EACN,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,WAAW,EACX,cAAc,GACf,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,OAAO,EACP,mBAAmB,EACnB,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAIlB,cAAc,oBAAoB,CAAC;AAGnC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2236,7 +2236,13 @@ function createMockEnv(overrides) {
|
|
|
2236
2236
|
}
|
|
2237
2237
|
|
|
2238
2238
|
// src/path-utils.ts
|
|
2239
|
-
import {
|
|
2239
|
+
import {
|
|
2240
|
+
existsSync as existsSync3,
|
|
2241
|
+
mkdirSync as mkdirSync2,
|
|
2242
|
+
readFileSync as readFileSync3,
|
|
2243
|
+
writeFileSync as writeFileSync2,
|
|
2244
|
+
chmodSync as chmodSync2
|
|
2245
|
+
} from "fs";
|
|
2240
2246
|
import { homedir as homedir2 } from "os";
|
|
2241
2247
|
import { dirname, join as join3, resolve } from "path";
|
|
2242
2248
|
function createHooxPath(path) {
|
|
@@ -2262,7 +2268,55 @@ function isHooxSetupRoot(dir) {
|
|
|
2262
2268
|
return false;
|
|
2263
2269
|
try {
|
|
2264
2270
|
const root = resolve(dir);
|
|
2265
|
-
|
|
2271
|
+
if (!existsSync3(join3(root, "packages", "cli", "package.json"))) {
|
|
2272
|
+
return false;
|
|
2273
|
+
}
|
|
2274
|
+
return existsSync3(join3(root, "wrangler.jsonc")) || existsSync3(join3(root, "wrangler.jsonc.example")) || existsSync3(join3(root, "workers")) || existsSync3(join3(root, ".gitmodules"));
|
|
2275
|
+
} catch {
|
|
2276
|
+
return false;
|
|
2277
|
+
}
|
|
2278
|
+
}
|
|
2279
|
+
function getRememberedMonorepoPath() {
|
|
2280
|
+
return resolveHooxPath("config/monorepo.json");
|
|
2281
|
+
}
|
|
2282
|
+
function getRememberedMonorepoRoot() {
|
|
2283
|
+
try {
|
|
2284
|
+
const path = getRememberedMonorepoPath();
|
|
2285
|
+
if (!existsSync3(path))
|
|
2286
|
+
return null;
|
|
2287
|
+
const raw = readFileSync3(path, "utf-8");
|
|
2288
|
+
const data = JSON.parse(raw);
|
|
2289
|
+
if (!data.root || typeof data.root !== "string")
|
|
2290
|
+
return null;
|
|
2291
|
+
const resolved = resolve(data.root);
|
|
2292
|
+
return isHooxSetupRoot(resolved) ? resolved : null;
|
|
2293
|
+
} catch {
|
|
2294
|
+
return null;
|
|
2295
|
+
}
|
|
2296
|
+
}
|
|
2297
|
+
function rememberMonorepoRoot(root) {
|
|
2298
|
+
try {
|
|
2299
|
+
const resolved = resolve(root);
|
|
2300
|
+
if (!isHooxSetupRoot(resolved))
|
|
2301
|
+
return false;
|
|
2302
|
+
const configDir = getHooxConfigDir();
|
|
2303
|
+
mkdirSync2(configDir, { recursive: true, mode: 448 });
|
|
2304
|
+
try {
|
|
2305
|
+
chmodSync2(configDir, 448);
|
|
2306
|
+
} catch {}
|
|
2307
|
+
const payload = {
|
|
2308
|
+
root: resolved,
|
|
2309
|
+
updatedAt: new Date().toISOString()
|
|
2310
|
+
};
|
|
2311
|
+
const path = getRememberedMonorepoPath();
|
|
2312
|
+
writeFileSync2(path, JSON.stringify(payload, null, 2) + `
|
|
2313
|
+
`, {
|
|
2314
|
+
mode: 384
|
|
2315
|
+
});
|
|
2316
|
+
try {
|
|
2317
|
+
chmodSync2(path, 384);
|
|
2318
|
+
} catch {}
|
|
2319
|
+
return true;
|
|
2266
2320
|
} catch {
|
|
2267
2321
|
return false;
|
|
2268
2322
|
}
|
|
@@ -2282,6 +2336,7 @@ function resolveHooxRuntimeRoot(options) {
|
|
|
2282
2336
|
const env = options?.env ?? process.env;
|
|
2283
2337
|
const cwd = resolve(options?.cwd ?? process.cwd());
|
|
2284
2338
|
const globalRepo = getHooxRepoPath();
|
|
2339
|
+
const remembered = options?.skipRemembered ? null : getRememberedMonorepoRoot();
|
|
2285
2340
|
const envRepo = env.HOOX_REPO?.trim();
|
|
2286
2341
|
if (envRepo) {
|
|
2287
2342
|
const resolved = resolve(envRepo);
|
|
@@ -2292,6 +2347,7 @@ function resolveHooxRuntimeRoot(options) {
|
|
|
2292
2347
|
checked: {
|
|
2293
2348
|
env: resolved,
|
|
2294
2349
|
cwd: findHooxSetupRoot(cwd),
|
|
2350
|
+
remembered,
|
|
2295
2351
|
global: globalRepo
|
|
2296
2352
|
}
|
|
2297
2353
|
};
|
|
@@ -2302,6 +2358,7 @@ function resolveHooxRuntimeRoot(options) {
|
|
|
2302
2358
|
checked: {
|
|
2303
2359
|
env: resolved,
|
|
2304
2360
|
cwd: findHooxSetupRoot(cwd),
|
|
2361
|
+
remembered,
|
|
2305
2362
|
global: globalRepo
|
|
2306
2363
|
}
|
|
2307
2364
|
};
|
|
@@ -2311,20 +2368,27 @@ function resolveHooxRuntimeRoot(options) {
|
|
|
2311
2368
|
return {
|
|
2312
2369
|
root: local,
|
|
2313
2370
|
source: "cwd",
|
|
2314
|
-
checked: { cwd: local, global: globalRepo }
|
|
2371
|
+
checked: { cwd: local, remembered, global: globalRepo }
|
|
2372
|
+
};
|
|
2373
|
+
}
|
|
2374
|
+
if (remembered) {
|
|
2375
|
+
return {
|
|
2376
|
+
root: remembered,
|
|
2377
|
+
source: "remembered",
|
|
2378
|
+
checked: { cwd: null, remembered, global: globalRepo }
|
|
2315
2379
|
};
|
|
2316
2380
|
}
|
|
2317
2381
|
if (isHooxSetupRoot(globalRepo)) {
|
|
2318
2382
|
return {
|
|
2319
2383
|
root: globalRepo,
|
|
2320
2384
|
source: "global",
|
|
2321
|
-
checked: { cwd: null, global: globalRepo }
|
|
2385
|
+
checked: { cwd: null, remembered: null, global: globalRepo }
|
|
2322
2386
|
};
|
|
2323
2387
|
}
|
|
2324
2388
|
return {
|
|
2325
2389
|
root: null,
|
|
2326
2390
|
source: "none",
|
|
2327
|
-
checked: { cwd: null, global: globalRepo }
|
|
2391
|
+
checked: { cwd: null, remembered: null, global: globalRepo }
|
|
2328
2392
|
};
|
|
2329
2393
|
}
|
|
2330
2394
|
function getTuiEntryCandidates(runtimeRoot) {
|
|
@@ -3677,7 +3741,8 @@ var initialState = {
|
|
|
3677
3741
|
sidebarExpanded: true,
|
|
3678
3742
|
modal: null,
|
|
3679
3743
|
commandPaletteOpen: false,
|
|
3680
|
-
previousView: null
|
|
3744
|
+
previousView: null,
|
|
3745
|
+
statusErrorExpanded: false
|
|
3681
3746
|
};
|
|
3682
3747
|
var useUIStore = create()(immer((set) => ({
|
|
3683
3748
|
...initialState,
|
|
@@ -3708,6 +3773,12 @@ var useUIStore = create()(immer((set) => ({
|
|
|
3708
3773
|
state.activeView = state.previousView;
|
|
3709
3774
|
state.previousView = null;
|
|
3710
3775
|
}
|
|
3776
|
+
}),
|
|
3777
|
+
toggleStatusErrorExpanded: () => set((state) => {
|
|
3778
|
+
state.statusErrorExpanded = !state.statusErrorExpanded;
|
|
3779
|
+
}),
|
|
3780
|
+
setStatusErrorExpanded: (expanded) => set((state) => {
|
|
3781
|
+
state.statusErrorExpanded = expanded;
|
|
3711
3782
|
})
|
|
3712
3783
|
})));
|
|
3713
3784
|
|
|
@@ -3730,6 +3801,23 @@ function ringPush(arr, item, max) {
|
|
|
3730
3801
|
var tradeStreamAbort = null;
|
|
3731
3802
|
var logStreamAbort = null;
|
|
3732
3803
|
var fetchWorkersGeneration = 0;
|
|
3804
|
+
var reconnectTimer = null;
|
|
3805
|
+
function clearReconnectTimer() {
|
|
3806
|
+
if (reconnectTimer !== null) {
|
|
3807
|
+
clearTimeout(reconnectTimer);
|
|
3808
|
+
reconnectTimer = null;
|
|
3809
|
+
}
|
|
3810
|
+
}
|
|
3811
|
+
function scheduleReconnect(delayMs) {
|
|
3812
|
+
clearReconnectTimer();
|
|
3813
|
+
if (delayMs < 0)
|
|
3814
|
+
return;
|
|
3815
|
+
reconnectTimer = setTimeout(() => {
|
|
3816
|
+
reconnectTimer = null;
|
|
3817
|
+
scheduledReconnectTick();
|
|
3818
|
+
}, delayMs);
|
|
3819
|
+
}
|
|
3820
|
+
var scheduledReconnectTick = async () => {};
|
|
3733
3821
|
var MAX_TRADES = 500;
|
|
3734
3822
|
var MAX_ALERTS = 100;
|
|
3735
3823
|
var MAX_LOGS = 1000;
|
|
@@ -3764,6 +3852,7 @@ var useServiceStore = create2()(immer2((set, get) => ({
|
|
|
3764
3852
|
const data = await hooxFetch2("/v1/workers");
|
|
3765
3853
|
if (gen !== fetchWorkersGeneration)
|
|
3766
3854
|
return;
|
|
3855
|
+
clearReconnectTimer();
|
|
3767
3856
|
set((state) => {
|
|
3768
3857
|
state.workers = data;
|
|
3769
3858
|
state.lastUpdated = Date.now();
|
|
@@ -3789,6 +3878,7 @@ var useServiceStore = create2()(immer2((set, get) => ({
|
|
|
3789
3878
|
timestamp: Date.now(),
|
|
3790
3879
|
acknowledged: false
|
|
3791
3880
|
});
|
|
3881
|
+
let nextDelay = 0;
|
|
3792
3882
|
set((state) => {
|
|
3793
3883
|
state.lastError = msg;
|
|
3794
3884
|
state.disconnectedAt = state.disconnectedAt ?? Date.now();
|
|
@@ -3797,21 +3887,26 @@ var useServiceStore = create2()(immer2((set, get) => ({
|
|
|
3797
3887
|
state.retryCount = state.retryCount + 1;
|
|
3798
3888
|
if (state.retryCount >= MAX_RETRIES2) {
|
|
3799
3889
|
state.connectionStatus = "offline";
|
|
3800
|
-
state.lastError =
|
|
3890
|
+
state.lastError = `${msg} (gave up after ${MAX_RETRIES2} retries)`;
|
|
3891
|
+
state.reconnectDelay = 0;
|
|
3801
3892
|
} else {
|
|
3802
3893
|
state.reconnectDelay = getBackoffDelay(state.retryCount);
|
|
3894
|
+
nextDelay = state.reconnectDelay;
|
|
3803
3895
|
}
|
|
3804
3896
|
} else if (state.connectionStatus === "reconnecting") {
|
|
3805
3897
|
state.retryCount = state.retryCount + 1;
|
|
3806
3898
|
if (state.retryCount >= MAX_RETRIES2) {
|
|
3807
3899
|
state.connectionStatus = "offline";
|
|
3808
|
-
state.lastError =
|
|
3900
|
+
state.lastError = `${msg} (gave up after ${MAX_RETRIES2} retries)`;
|
|
3809
3901
|
state.reconnectDelay = 0;
|
|
3810
3902
|
} else {
|
|
3811
3903
|
state.reconnectDelay = getBackoffDelay(state.retryCount);
|
|
3904
|
+
nextDelay = state.reconnectDelay;
|
|
3812
3905
|
}
|
|
3813
3906
|
}
|
|
3814
3907
|
});
|
|
3908
|
+
if (nextDelay > 0)
|
|
3909
|
+
scheduleReconnect(nextDelay);
|
|
3815
3910
|
}
|
|
3816
3911
|
},
|
|
3817
3912
|
streamTrades: async () => {
|
|
@@ -3873,6 +3968,17 @@ var useServiceStore = create2()(immer2((set, get) => ({
|
|
|
3873
3968
|
const merged = [...state.alerts, ...alerts];
|
|
3874
3969
|
state.alerts = merged.length > MAX_ALERTS ? merged.slice(merged.length - MAX_ALERTS) : merged;
|
|
3875
3970
|
}),
|
|
3971
|
+
acknowledgeAlert: (id) => set((state) => {
|
|
3972
|
+
const hit = state.alerts.find((a) => a.id === id);
|
|
3973
|
+
if (hit)
|
|
3974
|
+
hit.acknowledged = true;
|
|
3975
|
+
}),
|
|
3976
|
+
dismissAlert: (id) => set((state) => {
|
|
3977
|
+
state.alerts = state.alerts.filter((a) => a.id !== id);
|
|
3978
|
+
}),
|
|
3979
|
+
clearLogs: () => set((state) => {
|
|
3980
|
+
state.logs = [];
|
|
3981
|
+
}),
|
|
3876
3982
|
setConnectionStatus: (status) => set((state) => {
|
|
3877
3983
|
if (status === "connected") {
|
|
3878
3984
|
state.retryCount = 0;
|
|
@@ -3903,49 +4009,69 @@ var useServiceStore = create2()(immer2((set, get) => ({
|
|
|
3903
4009
|
state.metrics = metrics;
|
|
3904
4010
|
state.lastUpdated = metrics.lastUpdated;
|
|
3905
4011
|
}),
|
|
3906
|
-
handleConnectionSuccess: () =>
|
|
3907
|
-
|
|
3908
|
-
state
|
|
3909
|
-
|
|
3910
|
-
|
|
3911
|
-
|
|
3912
|
-
|
|
3913
|
-
|
|
3914
|
-
|
|
3915
|
-
|
|
3916
|
-
|
|
3917
|
-
|
|
3918
|
-
|
|
3919
|
-
|
|
3920
|
-
|
|
3921
|
-
state.
|
|
3922
|
-
|
|
3923
|
-
state.
|
|
3924
|
-
|
|
3925
|
-
state.
|
|
3926
|
-
state.
|
|
3927
|
-
state.reconnectDelay
|
|
3928
|
-
} else {
|
|
3929
|
-
state.
|
|
4012
|
+
handleConnectionSuccess: () => {
|
|
4013
|
+
clearReconnectTimer();
|
|
4014
|
+
set((state) => {
|
|
4015
|
+
state.lastSuccessfulFetch = Date.now();
|
|
4016
|
+
state.retryCount = 0;
|
|
4017
|
+
state.lastError = null;
|
|
4018
|
+
state.lastErrorDetails = null;
|
|
4019
|
+
state.reconnectDelay = 0;
|
|
4020
|
+
state.disconnectedAt = null;
|
|
4021
|
+
state.connectionStatus = "connected";
|
|
4022
|
+
});
|
|
4023
|
+
},
|
|
4024
|
+
handleConnectionFailure: (errorMessage) => {
|
|
4025
|
+
let nextDelay = 0;
|
|
4026
|
+
set((state) => {
|
|
4027
|
+
state.lastError = errorMessage;
|
|
4028
|
+
state.disconnectedAt = state.disconnectedAt ?? Date.now();
|
|
4029
|
+
if (state.connectionStatus === "connected" || state.connectionStatus === "polling") {
|
|
4030
|
+
state.connectionStatus = "reconnecting";
|
|
4031
|
+
state.retryCount = 1;
|
|
4032
|
+
state.reconnectDelay = getBackoffDelay(1);
|
|
4033
|
+
nextDelay = state.reconnectDelay;
|
|
4034
|
+
} else if (state.connectionStatus === "reconnecting") {
|
|
4035
|
+
state.retryCount = state.retryCount + 1;
|
|
4036
|
+
if (state.retryCount >= MAX_RETRIES2) {
|
|
4037
|
+
state.connectionStatus = "offline";
|
|
4038
|
+
state.lastError = `${errorMessage} (gave up after ${MAX_RETRIES2} retries)`;
|
|
4039
|
+
state.reconnectDelay = 0;
|
|
4040
|
+
} else {
|
|
4041
|
+
state.reconnectDelay = getBackoffDelay(state.retryCount);
|
|
4042
|
+
nextDelay = state.reconnectDelay;
|
|
4043
|
+
}
|
|
3930
4044
|
}
|
|
3931
|
-
}
|
|
3932
|
-
|
|
3933
|
-
|
|
3934
|
-
|
|
3935
|
-
|
|
3936
|
-
|
|
3937
|
-
state
|
|
3938
|
-
state.disconnectedAt = null;
|
|
3939
|
-
}),
|
|
3940
|
-
forceRetry: () => set((state) => {
|
|
3941
|
-
if (state.connectionStatus === "offline") {
|
|
3942
|
-
state.connectionStatus = "polling";
|
|
4045
|
+
});
|
|
4046
|
+
if (nextDelay > 0)
|
|
4047
|
+
scheduleReconnect(nextDelay);
|
|
4048
|
+
},
|
|
4049
|
+
resetRetries: () => {
|
|
4050
|
+
clearReconnectTimer();
|
|
4051
|
+
set((state) => {
|
|
3943
4052
|
state.retryCount = 0;
|
|
3944
4053
|
state.lastError = null;
|
|
3945
4054
|
state.lastErrorDetails = null;
|
|
3946
4055
|
state.reconnectDelay = 0;
|
|
4056
|
+
state.disconnectedAt = null;
|
|
4057
|
+
});
|
|
4058
|
+
},
|
|
4059
|
+
forceRetry: () => {
|
|
4060
|
+
clearReconnectTimer();
|
|
4061
|
+
const wasOffline = get().connectionStatus === "offline";
|
|
4062
|
+
set((state) => {
|
|
4063
|
+
if (state.connectionStatus === "offline") {
|
|
4064
|
+
state.connectionStatus = "polling";
|
|
4065
|
+
state.retryCount = 0;
|
|
4066
|
+
state.lastError = null;
|
|
4067
|
+
state.lastErrorDetails = null;
|
|
4068
|
+
state.reconnectDelay = 0;
|
|
4069
|
+
}
|
|
4070
|
+
});
|
|
4071
|
+
if (wasOffline) {
|
|
4072
|
+
scheduleReconnect(0);
|
|
3947
4073
|
}
|
|
3948
|
-
}
|
|
4074
|
+
},
|
|
3949
4075
|
setLastErrorDetails: (details) => set((state) => {
|
|
3950
4076
|
state.lastErrorDetails = details;
|
|
3951
4077
|
state.lastError = details === null ? null : summarizeCliError(details);
|
|
@@ -3968,38 +4094,73 @@ var useServiceStore = create2()(immer2((set, get) => ({
|
|
|
3968
4094
|
}, MAX_ALERTS);
|
|
3969
4095
|
})
|
|
3970
4096
|
})));
|
|
4097
|
+
scheduledReconnectTick = async () => {
|
|
4098
|
+
const status = useServiceStore.getState().connectionStatus;
|
|
4099
|
+
if (status === "reconnecting" || status === "polling") {
|
|
4100
|
+
await useServiceStore.getState().fetchWorkers();
|
|
4101
|
+
}
|
|
4102
|
+
};
|
|
3971
4103
|
|
|
3972
4104
|
// src/stores/config-store.ts
|
|
3973
4105
|
import { create as create3 } from "zustand";
|
|
3974
4106
|
import { immer as immer3 } from "zustand/middleware/immer";
|
|
3975
4107
|
import { persist, createJSONStorage } from "zustand/middleware";
|
|
3976
|
-
import { chmodSync as
|
|
3977
|
-
import { homedir as homedir3 } from "os";
|
|
4108
|
+
import { chmodSync as chmodSync3, mkdirSync as mkdirSync3, existsSync as existsSync4, readFileSync as readFileSync4 } from "fs";
|
|
3978
4109
|
import { join as join4 } from "path";
|
|
4110
|
+
function getTuiPreferencesPath() {
|
|
4111
|
+
return join4(getHooxHome(), ".tui-state", "preferences.json");
|
|
4112
|
+
}
|
|
4113
|
+
function getLegacyConfigJsonPath() {
|
|
4114
|
+
return join4(getHooxHome(), "config.json");
|
|
4115
|
+
}
|
|
4116
|
+
function extractZustandPrefsPayload(raw) {
|
|
4117
|
+
try {
|
|
4118
|
+
const parsed = JSON.parse(raw);
|
|
4119
|
+
if (parsed && typeof parsed === "object" && parsed.state && typeof parsed.state === "object" && !Array.isArray(parsed.state) && (("theme" in parsed.state) || ("refreshIntervalMs" in parsed.state)) && !("apiToken" in parsed)) {
|
|
4120
|
+
return raw;
|
|
4121
|
+
}
|
|
4122
|
+
} catch {}
|
|
4123
|
+
return null;
|
|
4124
|
+
}
|
|
3979
4125
|
var bunConfigStorage = {
|
|
3980
4126
|
getItem: async (_name) => {
|
|
3981
4127
|
try {
|
|
3982
|
-
const
|
|
3983
|
-
const
|
|
3984
|
-
if (
|
|
3985
|
-
return
|
|
3986
|
-
|
|
4128
|
+
const prefsPath = getTuiPreferencesPath();
|
|
4129
|
+
const prefsFile = Bun.file(prefsPath);
|
|
4130
|
+
if (await prefsFile.exists()) {
|
|
4131
|
+
return await prefsFile.text();
|
|
4132
|
+
}
|
|
4133
|
+
const legacyPath = getLegacyConfigJsonPath();
|
|
4134
|
+
if (existsSync4(legacyPath)) {
|
|
4135
|
+
const legacyRaw = readFileSync4(legacyPath, "utf-8");
|
|
4136
|
+
const envelope = extractZustandPrefsPayload(legacyRaw);
|
|
4137
|
+
if (envelope) {
|
|
4138
|
+
await bunConfigStorage.setItem(_name, envelope);
|
|
4139
|
+
return envelope;
|
|
4140
|
+
}
|
|
4141
|
+
}
|
|
4142
|
+
return null;
|
|
3987
4143
|
} catch {
|
|
3988
4144
|
return null;
|
|
3989
4145
|
}
|
|
3990
4146
|
},
|
|
3991
4147
|
setItem: async (_name, value) => {
|
|
3992
|
-
const
|
|
3993
|
-
|
|
3994
|
-
|
|
4148
|
+
const home = getHooxHome();
|
|
4149
|
+
const stateDir = join4(home, ".tui-state");
|
|
4150
|
+
if (!existsSync4(home)) {
|
|
4151
|
+
mkdirSync3(home, { recursive: true, mode: HOOX_DIR_MODE });
|
|
4152
|
+
}
|
|
4153
|
+
if (!existsSync4(stateDir)) {
|
|
4154
|
+
mkdirSync3(stateDir, { recursive: true, mode: HOOX_DIR_MODE });
|
|
3995
4155
|
}
|
|
3996
4156
|
try {
|
|
3997
|
-
|
|
4157
|
+
chmodSync3(home, HOOX_DIR_MODE);
|
|
4158
|
+
chmodSync3(stateDir, HOOX_DIR_MODE);
|
|
3998
4159
|
} catch {}
|
|
3999
|
-
const filePath =
|
|
4160
|
+
const filePath = getTuiPreferencesPath();
|
|
4000
4161
|
await Bun.write(filePath, value);
|
|
4001
4162
|
try {
|
|
4002
|
-
|
|
4163
|
+
chmodSync3(filePath, HOOX_CONFIG_FILE_MODE);
|
|
4003
4164
|
} catch {}
|
|
4004
4165
|
},
|
|
4005
4166
|
removeItem: async (_name) => {}
|
|
@@ -4071,7 +4232,7 @@ var useConfigStore = create3()(persist(immer3((set) => ({
|
|
|
4071
4232
|
state.notifications[channel] = !state.notifications[channel];
|
|
4072
4233
|
})
|
|
4073
4234
|
})), {
|
|
4074
|
-
name: "hoox-
|
|
4235
|
+
name: "hoox-tui-prefs",
|
|
4075
4236
|
storage: createJSONStorage(() => bunConfigStorage),
|
|
4076
4237
|
partialize: (state) => ({
|
|
4077
4238
|
theme: state.theme,
|
|
@@ -4120,6 +4281,7 @@ export {
|
|
|
4120
4281
|
resolveHooxRuntimeRoot,
|
|
4121
4282
|
resolveHooxPath,
|
|
4122
4283
|
resolveDependencies,
|
|
4284
|
+
rememberMonorepoRoot,
|
|
4123
4285
|
readConfigSync,
|
|
4124
4286
|
readConfig,
|
|
4125
4287
|
parseDashboardManifest,
|
|
@@ -4144,6 +4306,8 @@ export {
|
|
|
4144
4306
|
headersToObject,
|
|
4145
4307
|
hasOperatorClientCredentials,
|
|
4146
4308
|
getTuiEntryCandidates,
|
|
4309
|
+
getRememberedMonorepoRoot,
|
|
4310
|
+
getRememberedMonorepoPath,
|
|
4147
4311
|
getRelativeHooxPath,
|
|
4148
4312
|
getHooxWranglerPath,
|
|
4149
4313
|
getHooxStatePath,
|
package/dist/path-utils.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export type HooxPath = string & {
|
|
|
10
10
|
readonly __brand: "HooxPath";
|
|
11
11
|
};
|
|
12
12
|
/** Where resolveHooxRuntimeRoot found (or failed to find) a setup monorepo. */
|
|
13
|
-
export type RuntimeRootSource = "env" | "cwd" | "global" | "none";
|
|
13
|
+
export type RuntimeRootSource = "env" | "cwd" | "remembered" | "global" | "none";
|
|
14
14
|
/** Result of resolveHooxRuntimeRoot(). */
|
|
15
15
|
export interface RuntimeRootResult {
|
|
16
16
|
/** Absolute monorepo root, or null if none found. */
|
|
@@ -21,9 +21,17 @@ export interface RuntimeRootResult {
|
|
|
21
21
|
checked: {
|
|
22
22
|
env?: string;
|
|
23
23
|
cwd: string | null;
|
|
24
|
+
remembered?: string | null;
|
|
24
25
|
global: string;
|
|
25
26
|
};
|
|
26
27
|
}
|
|
28
|
+
/** Persisted monorepo pointer written when the CLI discovers a checkout. */
|
|
29
|
+
export interface RememberedMonorepo {
|
|
30
|
+
/** Absolute path to monorepo root. */
|
|
31
|
+
root: string;
|
|
32
|
+
/** ISO timestamp of last successful remember. */
|
|
33
|
+
updatedAt: string;
|
|
34
|
+
}
|
|
27
35
|
/**
|
|
28
36
|
* Gets the Hoox home directory location: $HOME/.hoox
|
|
29
37
|
*
|
|
@@ -48,9 +56,29 @@ export declare function getHooxHome(): HooxPath;
|
|
|
48
56
|
/**
|
|
49
57
|
* True when `dir` looks like a hoox monorepo root.
|
|
50
58
|
*
|
|
51
|
-
*
|
|
59
|
+
* Aligns with CLI `verifyRepoRoot`:
|
|
60
|
+
* - Required: `packages/cli/package.json`
|
|
61
|
+
* - Plus one of: `wrangler.jsonc`, `wrangler.jsonc.example`, `workers/`, `.gitmodules`
|
|
62
|
+
*
|
|
63
|
+
* (`wrangler.jsonc` is gitignored and created by init — fresh clones only
|
|
64
|
+
* ship `wrangler.jsonc.example`.)
|
|
52
65
|
*/
|
|
53
66
|
export declare function isHooxSetupRoot(dir: string): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Path to the remembered monorepo pointer file.
|
|
69
|
+
* `$HOOX_HOME/config/monorepo.json` (default `~/.hoox/config/monorepo.json`).
|
|
70
|
+
*/
|
|
71
|
+
export declare function getRememberedMonorepoPath(): HooxPath;
|
|
72
|
+
/**
|
|
73
|
+
* Read the last monorepo path the CLI discovered (if still valid).
|
|
74
|
+
* Returns null when missing, unreadable, or no longer a setup root.
|
|
75
|
+
*/
|
|
76
|
+
export declare function getRememberedMonorepoRoot(): string | null;
|
|
77
|
+
/**
|
|
78
|
+
* Persist a monorepo root for future CLI invocations from any cwd.
|
|
79
|
+
* No-op when path is not a valid setup root.
|
|
80
|
+
*/
|
|
81
|
+
export declare function rememberMonorepoRoot(root: string): boolean;
|
|
54
82
|
/**
|
|
55
83
|
* Walk up from `startDir` looking for a hoox monorepo root.
|
|
56
84
|
*
|
|
@@ -63,14 +91,17 @@ export declare function findHooxSetupRoot(startDir?: string): string | null;
|
|
|
63
91
|
* Order:
|
|
64
92
|
* 1. HOOX_REPO — must pass isHooxSetupRoot or result is source "env" with root null
|
|
65
93
|
* 2. Walk up from cwd
|
|
66
|
-
* 3.
|
|
94
|
+
* 3. Remembered monorepo (~/.hoox/config/monorepo.json) — last discovered checkout
|
|
95
|
+
* 4. getHooxRepoPath() ($HOME/.hoox/repo or $HOOX_HOME/repo)
|
|
67
96
|
*
|
|
68
97
|
* Project cwd and tool root are intentionally separate: a random project
|
|
69
|
-
* directory can still use
|
|
98
|
+
* directory can still use a remembered or global monorepo for CLI ops.
|
|
70
99
|
*/
|
|
71
100
|
export declare function resolveHooxRuntimeRoot(options?: {
|
|
72
101
|
cwd?: string;
|
|
73
102
|
env?: NodeJS.ProcessEnv;
|
|
103
|
+
/** Skip reading remembered path (tests). Default false. */
|
|
104
|
+
skipRemembered?: boolean;
|
|
74
105
|
}): RuntimeRootResult;
|
|
75
106
|
/**
|
|
76
107
|
* Candidate TUI entry files under a monorepo root (source first, then dist).
|
package/dist/path-utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../src/path-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../src/path-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkCH;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC;AAEjE,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GACzB,KAAK,GACL,KAAK,GACL,YAAY,GACZ,QAAQ,GACR,MAAM,CAAC;AAEX,0CAA0C;AAC1C,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,iDAAiD;IACjD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,qDAAqD;IACrD,OAAO,EAAE;QACP,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,4EAA4E;AAC5E,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAgBtC;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgBpD;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,QAAQ,CAEpD;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,GAAG,IAAI,CAYzD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA4B1D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,GAAE,MAAsB,GAC/B,MAAM,GAAG,IAAI,CAQf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,iBAAiB,CAiEpB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAOnE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,QAAQ,CAiC9D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAStD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBvE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,IAAI,QAAQ,CAE1C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,IAAI,QAAQ,CAE3C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,IAAI,QAAQ,CAEzC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,IAAI,QAAQ,CAE9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,IAAI,QAAQ,CAE3C"}
|