@n24q02m/mcp-core 1.13.0-beta.2 → 1.13.0-beta.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/build/auth/credential-form.d.ts.map +1 -1
- package/build/auth/credential-form.js +10 -0
- package/build/auth/credential-form.js.map +1 -1
- package/build/index.d.ts +2 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +2 -2
- package/build/index.js.map +1 -1
- package/build/lifecycle/lock.d.ts +24 -80
- package/build/lifecycle/lock.d.ts.map +1 -1
- package/build/lifecycle/lock.js +42 -187
- package/build/lifecycle/lock.js.map +1 -1
- package/build/relay/tool-helpers.d.ts +24 -23
- package/build/relay/tool-helpers.d.ts.map +1 -1
- package/build/relay/tool-helpers.js +25 -32
- package/build/relay/tool-helpers.js.map +1 -1
- package/build/storage/config-file.d.ts +1 -1
- package/build/storage/config-file.js +1 -1
- package/build/transport/index.d.ts +1 -2
- package/build/transport/index.d.ts.map +1 -1
- package/build/transport/index.js +1 -2
- package/build/transport/index.js.map +1 -1
- package/build/transport/local-server.d.ts +3 -3
- package/build/transport/local-server.d.ts.map +1 -1
- package/build/transport/local-server.js +6 -10
- package/build/transport/local-server.js.map +1 -1
- package/package.json +1 -1
- package/build/transport/smart-stdio.d.ts +0 -90
- package/build/transport/smart-stdio.d.ts.map +0 -1
- package/build/transport/smart-stdio.js +0 -584
- package/build/transport/smart-stdio.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-form.d.ts","sourceRoot":"","sources":["../../src/auth/credential-form.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,EACjD,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAUT;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,cAAc,CAAC,EAAE,cAAc,EAAE,CAAA;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;AA8ED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"credential-form.d.ts","sourceRoot":"","sources":["../../src/auth/credential-form.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,EACjD,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAUT;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,cAAc,CAAC,EAAE,cAAc,EAAE,CAAA;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;AA8ED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CA8tB9F;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,KAAK,GAAG,OAAO,CAAA;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAE7D"}
|
|
@@ -673,6 +673,7 @@ export function renderCredentialForm(schema, options) {
|
|
|
673
673
|
form.addEventListener("input", function (event) {
|
|
674
674
|
if (event.target.classList.contains("field-input")) {
|
|
675
675
|
event.target.removeAttribute("aria-invalid");
|
|
676
|
+
event.target.removeAttribute("aria-errormessage");
|
|
676
677
|
statusBox.style.display = "none";
|
|
677
678
|
}
|
|
678
679
|
});
|
|
@@ -683,19 +684,28 @@ export function renderCredentialForm(schema, options) {
|
|
|
683
684
|
var inputs = form.querySelectorAll(".field-input");
|
|
684
685
|
var payload = {};
|
|
685
686
|
var valid = true;
|
|
687
|
+
var firstInvalid = null;
|
|
686
688
|
|
|
687
689
|
inputs.forEach(function (input) {
|
|
688
690
|
if (input.hasAttribute("required") && input.value.trim() === "") {
|
|
689
691
|
valid = false;
|
|
690
692
|
input.setAttribute("aria-invalid", "true");
|
|
693
|
+
input.setAttribute("aria-errormessage", "status-box");
|
|
694
|
+
if (!firstInvalid) {
|
|
695
|
+
firstInvalid = input;
|
|
696
|
+
}
|
|
691
697
|
} else {
|
|
692
698
|
input.removeAttribute("aria-invalid");
|
|
699
|
+
input.removeAttribute("aria-errormessage");
|
|
693
700
|
payload[input.name] = input.value;
|
|
694
701
|
}
|
|
695
702
|
});
|
|
696
703
|
|
|
697
704
|
if (!valid) {
|
|
698
705
|
showStatus("error", "Please fill in all required fields.");
|
|
706
|
+
if (firstInvalid) {
|
|
707
|
+
firstInvalid.focus();
|
|
708
|
+
}
|
|
699
709
|
return;
|
|
700
710
|
}
|
|
701
711
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-form.js","sourceRoot":"","sources":["../../src/auth/credential-form.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"credential-form.js","sourceRoot":"","sources":["../../src/auth/credential-form.ts"],"names":[],"mappings":"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"}
|
package/build/index.d.ts
CHANGED
|
@@ -5,11 +5,11 @@ export { InMemoryAuthCache, type IOAuthSessionCache, OAuthProvider, type OAuthPr
|
|
|
5
5
|
export { type IUserCredentialStore, SqliteUserStore } from './oauth/user-store.js';
|
|
6
6
|
export { tryOpenBrowser } from './relay/browser.js';
|
|
7
7
|
export { createSession, generatePassphrase, notifyComplete, pollForResponses, pollForResult, type RelaySession, sendMessage } from './relay/client.js';
|
|
8
|
-
export { buildOpenRelayHandler, type
|
|
8
|
+
export { buildOpenRelayHandler, type OpenRelayHandlerOptions, type OpenRelayResult, registerOpenRelayTool, type ToolRegistrar } from './relay/tool-helpers.js';
|
|
9
9
|
export type * from './schema/types.js';
|
|
10
10
|
export { deleteConfig, exportConfig, importConfig, listConfigs, readConfig, scheduleReloadExit, writeConfig } from './storage/config-file.js';
|
|
11
11
|
export { clearMode, getMode, type ServerMode, setLocalMode } from './storage/mode.js';
|
|
12
12
|
export * from './storage/resolver.js';
|
|
13
13
|
export { acquireSessionLock, releaseSessionLock, type SessionInfo, writeSessionLock } from './storage/session-lock.js';
|
|
14
|
-
export { type
|
|
14
|
+
export { type HttpServerHandle, type RunHttpServerOptions, runHttpServer } from './transport/local-server.js';
|
|
15
15
|
//# sourceMappingURL=index.d.ts.map
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,2BAA2B,EAC3B,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,QAAQ,EACb,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,yBAAyB,EACzB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,oBAAoB,EACpB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACzB,MAAM,iBAAiB,CAAA;AACxB,cAAc,mBAAmB,CAAA;AAEjC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EACL,iBAAiB,EACjB,KAAK,kBAAkB,EACvB,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,KAAK,oBAAoB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,KAAK,YAAY,EACjB,WAAW,EACZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,qBAAqB,EACrB,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,2BAA2B,EAC3B,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,QAAQ,EACb,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,yBAAyB,EACzB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,oBAAoB,EACpB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACzB,MAAM,iBAAiB,CAAA;AACxB,cAAc,mBAAmB,CAAA;AAEjC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EACL,iBAAiB,EACjB,KAAK,kBAAkB,EACvB,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,KAAK,oBAAoB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,KAAK,YAAY,EACjB,WAAW,EACZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,qBAAqB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,qBAAqB,EACrB,KAAK,aAAa,EACnB,MAAM,yBAAyB,CAAA;AAChC,mBAAmB,mBAAmB,CAAA;AACtC,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,WAAW,EACZ,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrF,cAAc,uBAAuB,CAAA;AACrC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,WAAW,EAChB,gBAAgB,EACjB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,aAAa,EACd,MAAM,6BAA6B,CAAA"}
|
package/build/index.js
CHANGED
|
@@ -13,6 +13,6 @@ export { deleteConfig, exportConfig, importConfig, listConfigs, readConfig, sche
|
|
|
13
13
|
export { clearMode, getMode, setLocalMode } from './storage/mode.js';
|
|
14
14
|
export * from './storage/resolver.js';
|
|
15
15
|
export { acquireSessionLock, releaseSessionLock, writeSessionLock } from './storage/session-lock.js';
|
|
16
|
-
//
|
|
17
|
-
export {
|
|
16
|
+
// HTTP MCP server entry point (OAuth AS + /mcp transport on 127.0.0.1)
|
|
17
|
+
export { runHttpServer } from './transport/local-server.js';
|
|
18
18
|
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,2EAA2E;AAC3E,OAAO,EACL,2BAA2B,EAI3B,uBAAuB,EACvB,mBAAmB,EAQnB,yBAAyB,EAGzB,oBAAoB,EAKrB,MAAM,iBAAiB,CAAA;AACxB,cAAc,mBAAmB,CAAA;AACjC,kDAAkD;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EACL,iBAAiB,EAEjB,aAAa,EAGd,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAA6B,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,aAAa,EAEb,WAAW,EACZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,qBAAqB,EAGrB,qBAAqB,EAEtB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,WAAW,EACZ,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAmB,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrF,cAAc,uBAAuB,CAAA;AACrC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAElB,gBAAgB,EACjB,MAAM,2BAA2B,CAAA;AAClC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,2EAA2E;AAC3E,OAAO,EACL,2BAA2B,EAI3B,uBAAuB,EACvB,mBAAmB,EAQnB,yBAAyB,EAGzB,oBAAoB,EAKrB,MAAM,iBAAiB,CAAA;AACxB,cAAc,mBAAmB,CAAA;AACjC,kDAAkD;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EACL,iBAAiB,EAEjB,aAAa,EAGd,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAA6B,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,aAAa,EAEb,WAAW,EACZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,qBAAqB,EAGrB,qBAAqB,EAEtB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,WAAW,EACZ,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAmB,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrF,cAAc,uBAAuB,CAAA;AACrC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAElB,gBAAgB,EACjB,MAAM,2BAA2B,CAAA;AAClC,uEAAuE;AACvE,OAAO,EAGL,aAAa,EACd,MAAM,6BAA6B,CAAA"}
|
|
@@ -1,122 +1,66 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Lock-file lifecycle helpers
|
|
2
|
+
* Lock-file lifecycle helpers for HTTP server mode.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* After the stdio-pure + http-multi-user split, lock files are used solely
|
|
5
|
+
* by `runHttpServer` to prevent two HTTP servers binding the same port for
|
|
6
|
+
* the same `serverName`. They are no longer used to discover or steer
|
|
7
|
+
* daemon-bridge processes; per-credState TTLs and PID liveness checks have
|
|
8
|
+
* been removed along with the daemon model.
|
|
9
|
+
*
|
|
10
|
+
* On-disk format (4 lines + trailing newline, padded to 512 bytes):
|
|
6
11
|
*
|
|
7
12
|
* ```
|
|
8
13
|
* {pid}
|
|
9
14
|
* {port}
|
|
10
15
|
* {token}
|
|
11
16
|
* {spawnedAt_iso8601_utc}
|
|
12
|
-
* {credState} # "configured" | "unconfigured" (D9)
|
|
13
|
-
* {lastActivityAt_iso8601_utc} # bumped by daemon refresh loop (D9)
|
|
14
17
|
* ```
|
|
15
18
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* - configured credState → 24h
|
|
20
|
-
* - unconfigured credState → 30 min
|
|
21
|
-
* - writing PID does not exist on this host
|
|
22
|
-
*
|
|
23
|
-
* Dead-PID locks are reaped immediately. Past-TTL idle setup daemons
|
|
24
|
-
* (unconfigured) are terminated; configured daemons past TTL get their
|
|
25
|
-
* lock unlinked but the process is left alone (parity with pre-D9 sweep
|
|
26
|
-
* behavior so a long-running daemon never gets SIGKILL'd by a sweep
|
|
27
|
-
* race).
|
|
19
|
+
* `sweepStaleLocks` removes lock files whose `spawnedAt` is older than the
|
|
20
|
+
* configured TTL. There is no daemon to terminate — the HTTP server owns
|
|
21
|
+
* its own lifecycle and exits when its parent process exits.
|
|
28
22
|
*
|
|
29
|
-
* TypeScript port of core-py's `mcp_core.lifecycle.lock`. Behaviour
|
|
30
|
-
*
|
|
23
|
+
* TypeScript port of core-py's `mcp_core.lifecycle.lock`. Behaviour kept
|
|
24
|
+
* identical for cross-language parity.
|
|
31
25
|
*/
|
|
32
26
|
export declare const DEFAULT_LOCK_TTL_HOURS = 24;
|
|
33
|
-
/**
|
|
34
|
-
export declare const LIFECYCLE_TTL_CONFIGURED_MS: number;
|
|
35
|
-
export declare const LIFECYCLE_TTL_UNCONFIGURED_MS: number;
|
|
36
|
-
export type CredState = 'configured' | 'unconfigured';
|
|
37
|
-
/**
|
|
38
|
-
* Parsed lock metadata. `createdAt` is preserved as a backward-compat
|
|
39
|
-
* alias for `spawnedAt` so pre-D9 callers (test_lock format suite,
|
|
40
|
-
* `refreshLockTimestamp`) continue to work without source changes.
|
|
41
|
-
*/
|
|
27
|
+
/** Parsed lock metadata — shared by sweep and refresh helpers. */
|
|
42
28
|
export interface LockMetadata {
|
|
43
29
|
pid: number;
|
|
44
30
|
port: number;
|
|
45
31
|
token: string;
|
|
46
32
|
spawnedAt: Date;
|
|
47
|
-
credState: CredState;
|
|
48
|
-
lastActivityAt: Date;
|
|
49
|
-
/** @deprecated Alias for `spawnedAt`. New code should read `spawnedAt`. */
|
|
50
|
-
createdAt: Date;
|
|
51
33
|
}
|
|
52
34
|
export declare function locksDir(root?: string): string;
|
|
53
35
|
/**
|
|
54
|
-
* No-arg lock-dir resolver —
|
|
36
|
+
* No-arg lock-dir resolver — sweep tests `vi.spyOn(lockModule, 'lockDir')`
|
|
55
37
|
* to redirect into a temp directory without threading a `root` arg.
|
|
56
38
|
*/
|
|
57
39
|
export declare function lockDir(): string;
|
|
58
|
-
/**
|
|
59
|
-
* Serialize `LockMetadata` to the 6-line on-disk format. Trailing
|
|
60
|
-
* newline included so writes always end in `\n` and the parser's
|
|
61
|
-
* `lines.length` checks behave deterministically.
|
|
62
|
-
*/
|
|
63
|
-
export declare function serializeLock(meta: LockMetadata): string;
|
|
64
|
-
/**
|
|
65
|
-
* Parse the textual lock payload into `LockMetadata`. Accepts 4-line
|
|
66
|
-
* legacy, 5-line transitional, and 6-line D9 modern formats. Throws on
|
|
67
|
-
* fewer than 4 lines or unparseable timestamp / pid / port.
|
|
68
|
-
*/
|
|
69
|
-
export declare function parseLock(raw: string): LockMetadata;
|
|
70
|
-
export declare function parseLockMetadata(path: string): LockMetadata | null;
|
|
71
|
-
export declare function isLockExpired(path: string, ttlHours?: number): boolean;
|
|
72
|
-
/**
|
|
73
|
-
* Cross-platform PID liveness check via `process.kill(pid, 0)`. Best-effort.
|
|
74
|
-
* Returns false on EPERM (different-user processes) so sweep does not steal
|
|
75
|
-
* locks owned by other users. Pre-D9 entry point — kept for backward compat.
|
|
76
|
-
*/
|
|
77
|
-
export declare function isPidAlive(pid: number): boolean;
|
|
78
|
-
/**
|
|
79
|
-
* Liveness check on a parsed `LockMetadata`. D9 sweep tests
|
|
80
|
-
* `vi.spyOn(lockModule, 'isAlive')` to control the alive/dead branch
|
|
81
|
-
* without needing a real PID. Wraps `isPidAlive` so the underlying
|
|
82
|
-
* cross-platform logic stays in one place.
|
|
83
|
-
*/
|
|
84
|
-
export declare function isAlive(meta: LockMetadata): boolean;
|
|
85
|
-
/**
|
|
86
|
-
* Kill the lock owner. D9 sweep tests `vi.spyOn(lockModule, 'terminateDaemon')`
|
|
87
|
-
* to assert the unconfigured-TTL branch invokes termination, without
|
|
88
|
-
* killing real PIDs. Used by `sweepStaleLocks` when an unconfigured
|
|
89
|
-
* daemon's idle TTL elapses.
|
|
90
|
-
*/
|
|
91
|
-
export declare function terminateDaemon(pid: number): void;
|
|
92
40
|
/**
|
|
93
41
|
* Refresh `spawnedAt` of an existing lock file. Silent no-op on legacy /
|
|
94
42
|
* malformed files so callers don't need try/except.
|
|
95
43
|
*
|
|
96
44
|
* Padded to 512 bytes so on-disk size stays stable while a Windows
|
|
97
45
|
* byte-range lock is held past the metadata region (parity with core-py).
|
|
98
|
-
* Preserves the on-disk line count: a 4-line legacy lock stays 4-line
|
|
99
|
-
* after refresh; a 6-line modern lock stays 6-line (with both `spawnedAt`
|
|
100
|
-
* and `lastActivityAt` bumped).
|
|
101
46
|
*/
|
|
102
47
|
export declare function refreshLockTimestamp(path: string): void;
|
|
103
48
|
/**
|
|
104
|
-
* Remove stale lock files for `serverName
|
|
49
|
+
* Remove stale lock files for `serverName`. Returns count removed.
|
|
105
50
|
*
|
|
106
|
-
* Called by `
|
|
107
|
-
* preventing pile-up of dozens of `<server>-<port>.lock` files when
|
|
108
|
-
* exit abnormally (Windows OOM, taskkill, signal).
|
|
51
|
+
* Called by `runHttpServer` at startup before writing its own lock,
|
|
52
|
+
* preventing pile-up of dozens of `<server>-<port>.lock` files when HTTP
|
|
53
|
+
* servers exit abnormally (Windows OOM, taskkill, signal).
|
|
109
54
|
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
55
|
+
* A lock is stale when:
|
|
56
|
+
* - file is unreadable or has malformed payload (legacy / corrupt)
|
|
57
|
+
* - `spawnedAt` is older than the TTL
|
|
113
58
|
*/
|
|
114
59
|
export declare function sweepStaleLocks(serverName: string, ttlHours?: number, root?: string): number;
|
|
115
60
|
/**
|
|
116
61
|
* Write the 4-line lock payload (pid, port, token, ISO timestamp) padded
|
|
117
|
-
* to 512 bytes. Used by `
|
|
118
|
-
* acquired.
|
|
119
|
-
* treats 4-line as `credState='configured'` so behavior is equivalent.
|
|
62
|
+
* to 512 bytes. Used by `runHttpServer` after the OS file lock is
|
|
63
|
+
* acquired.
|
|
120
64
|
*
|
|
121
65
|
* Returns the absolute path to the lock file.
|
|
122
66
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/lifecycle/lock.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/lifecycle/lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAcH,eAAO,MAAM,sBAAsB,KAAK,CAAA;AAExC,kEAAkE;AAClE,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,IAAI,CAAA;CAChB;AAED,wBAAgB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;GAGG;AACH,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAeD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAiBvD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAoD5F;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAMpG"}
|
package/build/lifecycle/lock.js
CHANGED
|
@@ -1,179 +1,63 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Lock-file lifecycle helpers
|
|
2
|
+
* Lock-file lifecycle helpers for HTTP server mode.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* After the stdio-pure + http-multi-user split, lock files are used solely
|
|
5
|
+
* by `runHttpServer` to prevent two HTTP servers binding the same port for
|
|
6
|
+
* the same `serverName`. They are no longer used to discover or steer
|
|
7
|
+
* daemon-bridge processes; per-credState TTLs and PID liveness checks have
|
|
8
|
+
* been removed along with the daemon model.
|
|
9
|
+
*
|
|
10
|
+
* On-disk format (4 lines + trailing newline, padded to 512 bytes):
|
|
6
11
|
*
|
|
7
12
|
* ```
|
|
8
13
|
* {pid}
|
|
9
14
|
* {port}
|
|
10
15
|
* {token}
|
|
11
16
|
* {spawnedAt_iso8601_utc}
|
|
12
|
-
* {credState} # "configured" | "unconfigured" (D9)
|
|
13
|
-
* {lastActivityAt_iso8601_utc} # bumped by daemon refresh loop (D9)
|
|
14
17
|
* ```
|
|
15
18
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* - configured credState → 24h
|
|
20
|
-
* - unconfigured credState → 30 min
|
|
21
|
-
* - writing PID does not exist on this host
|
|
22
|
-
*
|
|
23
|
-
* Dead-PID locks are reaped immediately. Past-TTL idle setup daemons
|
|
24
|
-
* (unconfigured) are terminated; configured daemons past TTL get their
|
|
25
|
-
* lock unlinked but the process is left alone (parity with pre-D9 sweep
|
|
26
|
-
* behavior so a long-running daemon never gets SIGKILL'd by a sweep
|
|
27
|
-
* race).
|
|
19
|
+
* `sweepStaleLocks` removes lock files whose `spawnedAt` is older than the
|
|
20
|
+
* configured TTL. There is no daemon to terminate — the HTTP server owns
|
|
21
|
+
* its own lifecycle and exits when its parent process exits.
|
|
28
22
|
*
|
|
29
|
-
* TypeScript port of core-py's `mcp_core.lifecycle.lock`. Behaviour
|
|
30
|
-
*
|
|
23
|
+
* TypeScript port of core-py's `mcp_core.lifecycle.lock`. Behaviour kept
|
|
24
|
+
* identical for cross-language parity.
|
|
31
25
|
*/
|
|
32
26
|
import { existsSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
33
27
|
import { homedir } from 'node:os';
|
|
34
28
|
import { join } from 'node:path';
|
|
35
|
-
// Self-import so `sweepStaleLocks` can resolve `lockDir
|
|
36
|
-
//
|
|
37
|
-
//
|
|
29
|
+
// Self-import so `sweepStaleLocks` can resolve `lockDir` through the
|
|
30
|
+
// module namespace at call time. This makes
|
|
31
|
+
// `vi.spyOn(lockModule, 'lockDir').mockReturnValue(...)` actually
|
|
38
32
|
// intercept the helper from inside the sweep loop — without this
|
|
39
33
|
// indirection, the closure-captured local binding ignores spies and
|
|
40
34
|
// test mocks become silent no-ops.
|
|
41
35
|
import * as self from './lock.js';
|
|
42
36
|
export const DEFAULT_LOCK_TTL_HOURS = 24;
|
|
43
|
-
/** D9 hybrid TTL constants — selected by `credState` in `sweepStaleLocks`. */
|
|
44
|
-
export const LIFECYCLE_TTL_CONFIGURED_MS = 24 * 3600 * 1000;
|
|
45
|
-
export const LIFECYCLE_TTL_UNCONFIGURED_MS = 30 * 60 * 1000;
|
|
46
37
|
export function locksDir(root) {
|
|
47
38
|
return root ?? join(homedir(), '.config', 'mcp', 'locks');
|
|
48
39
|
}
|
|
49
40
|
/**
|
|
50
|
-
* No-arg lock-dir resolver —
|
|
41
|
+
* No-arg lock-dir resolver — sweep tests `vi.spyOn(lockModule, 'lockDir')`
|
|
51
42
|
* to redirect into a temp directory without threading a `root` arg.
|
|
52
43
|
*/
|
|
53
44
|
export function lockDir() {
|
|
54
45
|
return locksDir();
|
|
55
46
|
}
|
|
56
|
-
/**
|
|
57
|
-
|
|
58
|
-
* newline included so writes always end in `\n` and the parser's
|
|
59
|
-
* `lines.length` checks behave deterministically.
|
|
60
|
-
*/
|
|
61
|
-
export function serializeLock(meta) {
|
|
62
|
-
return [
|
|
63
|
-
String(meta.pid),
|
|
64
|
-
String(meta.port),
|
|
65
|
-
meta.token,
|
|
66
|
-
meta.spawnedAt.toISOString(),
|
|
67
|
-
meta.credState,
|
|
68
|
-
meta.lastActivityAt.toISOString(),
|
|
69
|
-
''
|
|
70
|
-
].join('\n');
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Parse the textual lock payload into `LockMetadata`. Accepts 4-line
|
|
74
|
-
* legacy, 5-line transitional, and 6-line D9 modern formats. Throws on
|
|
75
|
-
* fewer than 4 lines or unparseable timestamp / pid / port.
|
|
76
|
-
*/
|
|
77
|
-
export function parseLock(raw) {
|
|
47
|
+
/** Internal helper: parse the textual lock payload into `LockMetadata`. */
|
|
48
|
+
function parseLockText(raw) {
|
|
78
49
|
const lines = raw.replace(/\n+$/, '').split('\n');
|
|
79
50
|
if (lines.length < 4)
|
|
80
|
-
|
|
51
|
+
return null;
|
|
81
52
|
const pid = Number(lines[0]);
|
|
82
53
|
const port = Number(lines[1]);
|
|
83
|
-
if (!Number.isInteger(pid) || !Number.isInteger(port))
|
|
84
|
-
|
|
85
|
-
}
|
|
54
|
+
if (!Number.isInteger(pid) || !Number.isInteger(port))
|
|
55
|
+
return null;
|
|
86
56
|
const token = lines[2];
|
|
87
57
|
const spawnedAt = new Date(lines[3]);
|
|
88
|
-
if (Number.isNaN(spawnedAt.getTime()))
|
|
89
|
-
throw new Error(`lock file has unparseable spawnedAt`);
|
|
90
|
-
}
|
|
91
|
-
let credState = 'configured';
|
|
92
|
-
let lastActivityAt = spawnedAt;
|
|
93
|
-
if (lines.length >= 6) {
|
|
94
|
-
credState = lines[4];
|
|
95
|
-
lastActivityAt = new Date(lines[5]);
|
|
96
|
-
if (Number.isNaN(lastActivityAt.getTime()))
|
|
97
|
-
lastActivityAt = spawnedAt;
|
|
98
|
-
}
|
|
99
|
-
else if (lines.length === 5) {
|
|
100
|
-
credState = lines[4];
|
|
101
|
-
}
|
|
102
|
-
return { pid, port, token, spawnedAt, credState, lastActivityAt, createdAt: spawnedAt };
|
|
103
|
-
}
|
|
104
|
-
export function parseLockMetadata(path) {
|
|
105
|
-
if (!existsSync(path))
|
|
58
|
+
if (Number.isNaN(spawnedAt.getTime()))
|
|
106
59
|
return null;
|
|
107
|
-
|
|
108
|
-
try {
|
|
109
|
-
content = readFileSync(path, { encoding: 'utf-8' });
|
|
110
|
-
}
|
|
111
|
-
catch {
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
const lines = content.trim().split('\n');
|
|
115
|
-
// Pre-D9 callers expect null for legacy 3-line format. The new
|
|
116
|
-
// `parseLock` instead throws — adapter logic here keeps both
|
|
117
|
-
// contracts: legacy / corrupt -> null; valid 4/5/6-line -> populated.
|
|
118
|
-
if (lines.length < 4)
|
|
119
|
-
return null;
|
|
120
|
-
try {
|
|
121
|
-
return parseLock(content);
|
|
122
|
-
}
|
|
123
|
-
catch {
|
|
124
|
-
return null;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
export function isLockExpired(path, ttlHours = DEFAULT_LOCK_TTL_HOURS) {
|
|
128
|
-
const md = parseLockMetadata(path);
|
|
129
|
-
if (md === null)
|
|
130
|
-
return true;
|
|
131
|
-
const ageMs = Date.now() - md.spawnedAt.getTime();
|
|
132
|
-
return ageMs > ttlHours * 3600 * 1000;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Cross-platform PID liveness check via `process.kill(pid, 0)`. Best-effort.
|
|
136
|
-
* Returns false on EPERM (different-user processes) so sweep does not steal
|
|
137
|
-
* locks owned by other users. Pre-D9 entry point — kept for backward compat.
|
|
138
|
-
*/
|
|
139
|
-
export function isPidAlive(pid) {
|
|
140
|
-
if (pid <= 0)
|
|
141
|
-
return false;
|
|
142
|
-
try {
|
|
143
|
-
process.kill(pid, 0);
|
|
144
|
-
return true;
|
|
145
|
-
}
|
|
146
|
-
catch (err) {
|
|
147
|
-
const code = err?.code;
|
|
148
|
-
if (code === 'EPERM')
|
|
149
|
-
return true; // exists but we lack permission
|
|
150
|
-
return false;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Liveness check on a parsed `LockMetadata`. D9 sweep tests
|
|
155
|
-
* `vi.spyOn(lockModule, 'isAlive')` to control the alive/dead branch
|
|
156
|
-
* without needing a real PID. Wraps `isPidAlive` so the underlying
|
|
157
|
-
* cross-platform logic stays in one place.
|
|
158
|
-
*/
|
|
159
|
-
export function isAlive(meta) {
|
|
160
|
-
return isPidAlive(meta.pid);
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Kill the lock owner. D9 sweep tests `vi.spyOn(lockModule, 'terminateDaemon')`
|
|
164
|
-
* to assert the unconfigured-TTL branch invokes termination, without
|
|
165
|
-
* killing real PIDs. Used by `sweepStaleLocks` when an unconfigured
|
|
166
|
-
* daemon's idle TTL elapses.
|
|
167
|
-
*/
|
|
168
|
-
export function terminateDaemon(pid) {
|
|
169
|
-
if (pid <= 0)
|
|
170
|
-
return;
|
|
171
|
-
try {
|
|
172
|
-
process.kill(pid, 'SIGKILL');
|
|
173
|
-
}
|
|
174
|
-
catch {
|
|
175
|
-
/* ignore */
|
|
176
|
-
}
|
|
60
|
+
return { pid, port, token, spawnedAt };
|
|
177
61
|
}
|
|
178
62
|
/**
|
|
179
63
|
* Refresh `spawnedAt` of an existing lock file. Silent no-op on legacy /
|
|
@@ -181,13 +65,9 @@ export function terminateDaemon(pid) {
|
|
|
181
65
|
*
|
|
182
66
|
* Padded to 512 bytes so on-disk size stays stable while a Windows
|
|
183
67
|
* byte-range lock is held past the metadata region (parity with core-py).
|
|
184
|
-
* Preserves the on-disk line count: a 4-line legacy lock stays 4-line
|
|
185
|
-
* after refresh; a 6-line modern lock stays 6-line (with both `spawnedAt`
|
|
186
|
-
* and `lastActivityAt` bumped).
|
|
187
68
|
*/
|
|
188
69
|
export function refreshLockTimestamp(path) {
|
|
189
|
-
|
|
190
|
-
if (md === null)
|
|
70
|
+
if (!existsSync(path))
|
|
191
71
|
return;
|
|
192
72
|
let raw;
|
|
193
73
|
try {
|
|
@@ -196,15 +76,11 @@ export function refreshLockTimestamp(path) {
|
|
|
196
76
|
catch {
|
|
197
77
|
return;
|
|
198
78
|
}
|
|
199
|
-
const
|
|
79
|
+
const md = parseLockText(raw);
|
|
80
|
+
if (md === null)
|
|
81
|
+
return;
|
|
200
82
|
const now = new Date().toISOString();
|
|
201
|
-
|
|
202
|
-
if (lineCount >= 6) {
|
|
203
|
-
payload = `${md.pid}\n${md.port}\n${md.token}\n${now}\n${md.credState}\n${now}\n`;
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
payload = `${md.pid}\n${md.port}\n${md.token}\n${now}\n`;
|
|
207
|
-
}
|
|
83
|
+
const payload = `${md.pid}\n${md.port}\n${md.token}\n${now}\n`;
|
|
208
84
|
try {
|
|
209
85
|
writeFileSync(path, payload.padEnd(512, ' '), { encoding: 'utf-8' });
|
|
210
86
|
}
|
|
@@ -213,15 +89,15 @@ export function refreshLockTimestamp(path) {
|
|
|
213
89
|
}
|
|
214
90
|
}
|
|
215
91
|
/**
|
|
216
|
-
* Remove stale lock files for `serverName
|
|
92
|
+
* Remove stale lock files for `serverName`. Returns count removed.
|
|
217
93
|
*
|
|
218
|
-
* Called by `
|
|
219
|
-
* preventing pile-up of dozens of `<server>-<port>.lock` files when
|
|
220
|
-
* exit abnormally (Windows OOM, taskkill, signal).
|
|
94
|
+
* Called by `runHttpServer` at startup before writing its own lock,
|
|
95
|
+
* preventing pile-up of dozens of `<server>-<port>.lock` files when HTTP
|
|
96
|
+
* servers exit abnormally (Windows OOM, taskkill, signal).
|
|
221
97
|
*
|
|
222
|
-
*
|
|
223
|
-
*
|
|
224
|
-
*
|
|
98
|
+
* A lock is stale when:
|
|
99
|
+
* - file is unreadable or has malformed payload (legacy / corrupt)
|
|
100
|
+
* - `spawnedAt` is older than the TTL
|
|
225
101
|
*/
|
|
226
102
|
export function sweepStaleLocks(serverName, ttlHours, root) {
|
|
227
103
|
const dir = root !== undefined ? root : self.lockDir();
|
|
@@ -238,7 +114,7 @@ export function sweepStaleLocks(serverName, ttlHours, root) {
|
|
|
238
114
|
const prefix = `${serverName}-`;
|
|
239
115
|
const suffix = '.lock';
|
|
240
116
|
const now = Date.now();
|
|
241
|
-
const
|
|
117
|
+
const ttlMs = (ttlHours ?? DEFAULT_LOCK_TTL_HOURS) * 3600 * 1000;
|
|
242
118
|
for (const entry of entries) {
|
|
243
119
|
if (!entry.startsWith(prefix) || !entry.endsWith(suffix))
|
|
244
120
|
continue;
|
|
@@ -257,21 +133,8 @@ export function sweepStaleLocks(serverName, ttlHours, root) {
|
|
|
257
133
|
}
|
|
258
134
|
continue;
|
|
259
135
|
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
meta = parseLock(raw);
|
|
263
|
-
}
|
|
264
|
-
catch {
|
|
265
|
-
try {
|
|
266
|
-
unlinkSync(full);
|
|
267
|
-
removed += 1;
|
|
268
|
-
}
|
|
269
|
-
catch {
|
|
270
|
-
/* ignore */
|
|
271
|
-
}
|
|
272
|
-
continue;
|
|
273
|
-
}
|
|
274
|
-
if (!self.isAlive(meta)) {
|
|
136
|
+
const meta = parseLockText(raw);
|
|
137
|
+
if (meta === null) {
|
|
275
138
|
try {
|
|
276
139
|
unlinkSync(full);
|
|
277
140
|
removed += 1;
|
|
@@ -281,14 +144,7 @@ export function sweepStaleLocks(serverName, ttlHours, root) {
|
|
|
281
144
|
}
|
|
282
145
|
continue;
|
|
283
146
|
}
|
|
284
|
-
|
|
285
|
-
const lastActivityMs = meta.lastActivityAt.getTime();
|
|
286
|
-
if (now - lastActivityMs > ttlMs) {
|
|
287
|
-
// Only terminate idle setup daemons aggressively; preserve pre-D9
|
|
288
|
-
// behavior of unlink-only for configured daemons past TTL.
|
|
289
|
-
if (meta.credState === 'unconfigured') {
|
|
290
|
-
self.terminateDaemon(meta.pid);
|
|
291
|
-
}
|
|
147
|
+
if (now - meta.spawnedAt.getTime() > ttlMs) {
|
|
292
148
|
try {
|
|
293
149
|
unlinkSync(full);
|
|
294
150
|
removed += 1;
|
|
@@ -302,9 +158,8 @@ export function sweepStaleLocks(serverName, ttlHours, root) {
|
|
|
302
158
|
}
|
|
303
159
|
/**
|
|
304
160
|
* Write the 4-line lock payload (pid, port, token, ISO timestamp) padded
|
|
305
|
-
* to 512 bytes. Used by `
|
|
306
|
-
* acquired.
|
|
307
|
-
* treats 4-line as `credState='configured'` so behavior is equivalent.
|
|
161
|
+
* to 512 bytes. Used by `runHttpServer` after the OS file lock is
|
|
162
|
+
* acquired.
|
|
308
163
|
*
|
|
309
164
|
* Returns the absolute path to the lock file.
|
|
310
165
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/lifecycle/lock.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/lifecycle/lock.ts"],"names":[],"mappings":"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"}
|