@happyvertical/smrt-desktop 0.0.0-stage → 0.60.10
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/AGENTS.md +9 -0
- package/CLAUDE.md +1 -0
- package/LICENSE +7 -0
- package/README.md +67 -2
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.json +12 -0
- package/dist/smrt-knowledge.json +54 -0
- package/dist/smrt-knowledge.okf.md +44 -0
- package/examples/node26-sidecar.json +7 -0
- package/package.json +46 -3
package/AGENTS.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# @happyvertical/smrt-desktop
|
|
2
|
+
|
|
3
|
+
The sidecar manifest is shared by the desktop runtime bundler and supervisor.
|
|
4
|
+
Its v1 wire format, portable path rules, and trusted package boundary are
|
|
5
|
+
documented in [README.md](README.md). Keep the Node 26 example and test cases
|
|
6
|
+
aligned with the parser. Keep the manifest package free of runtime dependencies.
|
|
7
|
+
|
|
8
|
+
From this directory, run `npm run build`, `npm run typecheck`, and
|
|
9
|
+
`smrt test src/sidecar-manifest.test.ts`.
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
package/LICENSE
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Copyright <2025> <Happy Vertical Corporation>
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
4
|
+
|
|
5
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,68 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @happyvertical/smrt-desktop
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Versioned JSON manifest for a runtime bundled with an s-m-r-t desktop app. The
|
|
4
|
+
runtime bundler writes the manifest and the desktop supervisor consumes it
|
|
5
|
+
before launching the packaged executable.
|
|
6
|
+
|
|
7
|
+
## Node 26 and adapter-node example
|
|
8
|
+
|
|
9
|
+
This [manifest](examples/node26-sidecar.json) describes a stock Node 26 sidecar
|
|
10
|
+
and a SvelteKit adapter-node build. Mount the app-runtime health handler at
|
|
11
|
+
`/api/_runtime/health` and use the local runtime profile.
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"version": 1,
|
|
16
|
+
"executable": "binaries/node",
|
|
17
|
+
"args": ["build/index.js"],
|
|
18
|
+
"healthRoute": "/api/_runtime/health",
|
|
19
|
+
"dataDirectory": "runtime"
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { readFile } from 'node:fs/promises';
|
|
25
|
+
import { parseSidecarManifest } from '@happyvertical/smrt-desktop';
|
|
26
|
+
|
|
27
|
+
const sidecar = parseSidecarManifest(
|
|
28
|
+
await readFile('node26-sidecar.json', 'utf8'),
|
|
29
|
+
);
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Version 1 fields
|
|
33
|
+
|
|
34
|
+
- `version` is the number `1`. All five fields are required. Unknown fields and
|
|
35
|
+
versions are errors. A future incompatible contract requires a new version.
|
|
36
|
+
- `executable` is a portable path relative to the packaged executable root.
|
|
37
|
+
For Tauri `externalBin` it is the configured logical path before any
|
|
38
|
+
target-specific suffix or extension. The supervisor uses its packaged
|
|
39
|
+
executable mapping and never searches `PATH`.
|
|
40
|
+
- `args` is an ordered array of literal strings. Empty arrays and empty strings
|
|
41
|
+
are valid. NUL and unpaired UTF-16 surrogates are rejected. The supervisor
|
|
42
|
+
passes the array directly as process arguments, with the packaged app root
|
|
43
|
+
as its working directory. The argument strings receive no shell expansion,
|
|
44
|
+
token substitution, or path rewriting. Their interpretation belongs to the
|
|
45
|
+
chosen executable.
|
|
46
|
+
- `healthRoute` is a path on the supervisor-selected loopback origin.
|
|
47
|
+
It begins with one slash and can be `/` or have nonempty segments containing
|
|
48
|
+
only ASCII letters, digits, periods, underscores, tildes, and hyphens.
|
|
49
|
+
A trailing slash is allowed. Dot segments, URL origins, network-path
|
|
50
|
+
references, backslashes, percent escapes, queries and fragments are invalid.
|
|
51
|
+
The probe stays on the selected loopback origin and rejects redirects.
|
|
52
|
+
- `dataDirectory` is a portable path relative to the per-app OS data root.
|
|
53
|
+
The supervisor supplies its resolved absolute path to the local runtime as
|
|
54
|
+
`SMRT_DATA_DIR`. The app-runtime retains ownership of directory custody.
|
|
55
|
+
|
|
56
|
+
Portable paths use forward-slash-separated nonempty segments, each starting
|
|
57
|
+
with an ASCII letter, digit, underscore or hyphen. Subsequent characters may
|
|
58
|
+
also include periods. Trailing periods and Windows device names (`CON`, `PRN`,
|
|
59
|
+
`AUX`, `NUL`, `COM0` through `COM9`, and `LPT0` through `LPT9`, including
|
|
60
|
+
extension forms) are rejected. The same lexical rules apply on each target.
|
|
61
|
+
|
|
62
|
+
The parser throws a fixed diagnostic on malformed JSON or invalid fields and
|
|
63
|
+
returns a typed snapshot on success. The bundler serializes that snapshot to
|
|
64
|
+
write the artifact, so consumers receive one occurrence of each field. The
|
|
65
|
+
manifest is trusted package content.
|
|
66
|
+
The bundler and supervisor enforce executable provenance and filesystem
|
|
67
|
+
containment, including symlink handling. Argument policies belong to the
|
|
68
|
+
packaging tool and runtime being launched.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** The version 1 wire contract for a bundled SMRT desktop sidecar. */
|
|
2
|
+
export interface SidecarManifestV1 {
|
|
3
|
+
readonly version: 1;
|
|
4
|
+
readonly executable: string;
|
|
5
|
+
readonly args: readonly string[];
|
|
6
|
+
readonly healthRoute: string;
|
|
7
|
+
readonly dataDirectory: string;
|
|
8
|
+
}
|
|
9
|
+
/** Parse a packaged JSON manifest or throw with a value-free diagnostic. */
|
|
10
|
+
export declare function parseSidecarManifest(json: string): SidecarManifestV1;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AA0CD,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CA0DpE"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
//#region src/index.ts
|
|
2
|
+
var manifestKeys = [
|
|
3
|
+
"version",
|
|
4
|
+
"executable",
|
|
5
|
+
"args",
|
|
6
|
+
"healthRoute",
|
|
7
|
+
"dataDirectory"
|
|
8
|
+
];
|
|
9
|
+
var portableSegment = /^[A-Za-z0-9_-][A-Za-z0-9._-]*$/;
|
|
10
|
+
var windowsDevice = /^(?:con|prn|aux|nul|com[0-9]|lpt[0-9])(?:\.|$)/i;
|
|
11
|
+
var routeSegment = /^[A-Za-z0-9._~-]+$/;
|
|
12
|
+
var unpairedSurrogate = /\p{Surrogate}/u;
|
|
13
|
+
function isPortablePath(value) {
|
|
14
|
+
return typeof value === "string" && value.split("/").every((segment) => portableSegment.test(segment) && !segment.endsWith(".") && !windowsDevice.test(segment));
|
|
15
|
+
}
|
|
16
|
+
function isHealthRoute(value) {
|
|
17
|
+
if (typeof value !== "string" || !value.startsWith("/")) return false;
|
|
18
|
+
if (value === "/") return true;
|
|
19
|
+
return value.slice(1, value.endsWith("/") ? -1 : void 0).split("/").every((segment) => routeSegment.test(segment) && segment !== "." && segment !== "..");
|
|
20
|
+
}
|
|
21
|
+
function parseSidecarManifest(json) {
|
|
22
|
+
if (typeof json !== "string") throw new Error("Sidecar manifest must be JSON text");
|
|
23
|
+
let input;
|
|
24
|
+
try {
|
|
25
|
+
input = JSON.parse(json);
|
|
26
|
+
} catch {
|
|
27
|
+
throw new Error("Sidecar manifest must be valid JSON");
|
|
28
|
+
}
|
|
29
|
+
if (input === null || typeof input !== "object" || Array.isArray(input)) throw new Error("Sidecar manifest must be a JSON object");
|
|
30
|
+
const record = input;
|
|
31
|
+
if (!Object.hasOwn(record, "version") || record.version !== 1) throw new Error("Sidecar manifest requires supported version 1");
|
|
32
|
+
if (Object.keys(record).length !== manifestKeys.length || !manifestKeys.every((key) => Object.hasOwn(record, key))) throw new Error("Sidecar manifest v1 requires exactly the documented fields");
|
|
33
|
+
const { executable, args, healthRoute, dataDirectory } = record;
|
|
34
|
+
if (!isPortablePath(executable)) throw new Error("Sidecar manifest executable must be a portable relative path");
|
|
35
|
+
if (!Array.isArray(args) || !args.every((arg) => typeof arg === "string" && !arg.includes("\0") && !unpairedSurrogate.test(arg))) throw new Error("Sidecar manifest args must be an array of valid strings");
|
|
36
|
+
if (!isHealthRoute(healthRoute)) throw new Error("Sidecar manifest healthRoute must be a local absolute path");
|
|
37
|
+
if (!isPortablePath(dataDirectory)) throw new Error("Sidecar manifest dataDirectory must be a portable relative path");
|
|
38
|
+
return {
|
|
39
|
+
version: 1,
|
|
40
|
+
executable,
|
|
41
|
+
args,
|
|
42
|
+
healthRoute,
|
|
43
|
+
dataDirectory
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//#endregion
|
|
47
|
+
export { parseSidecarManifest };
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["/** The version 1 wire contract for a bundled SMRT desktop sidecar. */\nexport interface SidecarManifestV1 {\n readonly version: 1;\n readonly executable: string;\n readonly args: readonly string[];\n readonly healthRoute: string;\n readonly dataDirectory: string;\n}\n\nconst manifestKeys = [\n 'version',\n 'executable',\n 'args',\n 'healthRoute',\n 'dataDirectory',\n] as const satisfies readonly (keyof SidecarManifestV1)[];\n\nconst portableSegment = /^[A-Za-z0-9_-][A-Za-z0-9._-]*$/;\nconst windowsDevice = /^(?:con|prn|aux|nul|com[0-9]|lpt[0-9])(?:\\.|$)/i;\nconst routeSegment = /^[A-Za-z0-9._~-]+$/;\nconst unpairedSurrogate = /\\p{Surrogate}/u;\n\nfunction isPortablePath(value: unknown): value is string {\n return (\n typeof value === 'string' &&\n value\n .split('/')\n .every(\n (segment) =>\n portableSegment.test(segment) &&\n !segment.endsWith('.') &&\n !windowsDevice.test(segment),\n )\n );\n}\n\nfunction isHealthRoute(value: unknown): value is string {\n if (typeof value !== 'string' || !value.startsWith('/')) return false;\n if (value === '/') return true;\n\n return value\n .slice(1, value.endsWith('/') ? -1 : undefined)\n .split('/')\n .every(\n (segment) =>\n routeSegment.test(segment) && segment !== '.' && segment !== '..',\n );\n}\n\n/** Parse a packaged JSON manifest or throw with a value-free diagnostic. */\nexport function parseSidecarManifest(json: string): SidecarManifestV1 {\n if (typeof json !== 'string') {\n throw new Error('Sidecar manifest must be JSON text');\n }\n\n let input: unknown;\n try {\n input = JSON.parse(json);\n } catch {\n throw new Error('Sidecar manifest must be valid JSON');\n }\n\n if (input === null || typeof input !== 'object' || Array.isArray(input)) {\n throw new Error('Sidecar manifest must be a JSON object');\n }\n\n const record = input as Record<string, unknown>;\n if (!Object.hasOwn(record, 'version') || record.version !== 1) {\n throw new Error('Sidecar manifest requires supported version 1');\n }\n if (\n Object.keys(record).length !== manifestKeys.length ||\n !manifestKeys.every((key) => Object.hasOwn(record, key))\n ) {\n throw new Error(\n 'Sidecar manifest v1 requires exactly the documented fields',\n );\n }\n\n const { executable, args, healthRoute, dataDirectory } = record;\n if (!isPortablePath(executable)) {\n throw new Error(\n 'Sidecar manifest executable must be a portable relative path',\n );\n }\n if (\n !Array.isArray(args) ||\n !args.every(\n (arg): arg is string =>\n typeof arg === 'string' &&\n !arg.includes('\\0') &&\n !unpairedSurrogate.test(arg),\n )\n ) {\n throw new Error('Sidecar manifest args must be an array of valid strings');\n }\n if (!isHealthRoute(healthRoute)) {\n throw new Error(\n 'Sidecar manifest healthRoute must be a local absolute path',\n );\n }\n if (!isPortablePath(dataDirectory)) {\n throw new Error(\n 'Sidecar manifest dataDirectory must be a portable relative path',\n );\n }\n\n return { version: 1, executable, args, healthRoute, dataDirectory };\n}\n"],"mappings":";AASA,IAAM,eAAe;CACnB;CACA;CACA;CACA;CACA;AACF;AAEA,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AACtB,IAAM,eAAe;AACrB,IAAM,oBAAoB;AAE1B,SAAS,eAAe,OAAiC;CACvD,OACE,OAAO,UAAU,YACjB,MACG,MAAM,GAAG,CAAA,CACT,OACE,YACC,gBAAgB,KAAK,OAAO,KAC5B,CAAC,QAAQ,SAAS,GAAG,KACrB,CAAC,cAAc,KAAK,OAAO,CAC/B;AAEN;AAEA,SAAS,cAAc,OAAiC;CACtD,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,WAAW,GAAG,GAAG,OAAO;CAChE,IAAI,UAAU,KAAK,OAAO;CAE1B,OAAO,MACJ,MAAM,GAAG,MAAM,SAAS,GAAG,IAAI,KAAK,KAAA,CAAS,CAAA,CAC7C,MAAM,GAAG,CAAA,CACT,OACE,YACC,aAAa,KAAK,OAAO,KAAK,YAAY,OAAO,YAAY,IACjE;AACJ;AAGO,SAAS,qBAAqB,MAAiC;CACpE,IAAI,OAAO,SAAS,UAClB,MAAM,IAAI,MAAM,oCAAoC;CAGtD,IAAI;CACJ,IAAI;EACF,QAAQ,KAAK,MAAM,IAAI;CACzB,QAAQ;EACN,MAAM,IAAI,MAAM,qCAAqC;CACvD;CAEA,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GACpE,MAAM,IAAI,MAAM,wCAAwC;CAG1D,MAAM,SAAS;CACf,IAAI,CAAC,OAAO,OAAO,QAAQ,SAAS,KAAK,OAAO,YAAY,GAC1D,MAAM,IAAI,MAAM,+CAA+C;CAEjE,IACE,OAAO,KAAK,MAAM,CAAA,CAAE,WAAW,aAAa,UAC5C,CAAC,aAAa,OAAO,QAAQ,OAAO,OAAO,QAAQ,GAAG,CAAC,GAEvD,MAAM,IAAI,MACR,4DACF;CAGF,MAAM,EAAE,YAAY,MAAM,aAAa,kBAAkB;CACzD,IAAI,CAAC,eAAe,UAAU,GAC5B,MAAM,IAAI,MACR,8DACF;CAEF,IACE,CAAC,MAAM,QAAQ,IAAI,KACnB,CAAC,KAAK,OACH,QACC,OAAO,QAAQ,YACf,CAAC,IAAI,SAAS,IAAI,KAClB,CAAC,kBAAkB,KAAK,GAAG,CAC/B,GAEA,MAAM,IAAI,MAAM,yDAAyD;CAE3E,IAAI,CAAC,cAAc,WAAW,GAC5B,MAAM,IAAI,MACR,4DACF;CAEF,IAAI,CAAC,eAAe,aAAa,GAC/B,MAAM,IAAI,MACR,iEACF;CAGF,OAAO;EAAE,SAAS;EAAG;EAAY;EAAM;EAAa;CAAc;AACpE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"sensitiveFieldsExcluded": true,
|
|
4
|
+
"generatedAt": "1970-01-01T00:00:00.000Z",
|
|
5
|
+
"packageName": "@happyvertical/smrt-desktop",
|
|
6
|
+
"packageVersion": "0.60.10",
|
|
7
|
+
"sourceManifestPath": "dist/manifest.json",
|
|
8
|
+
"agentDocPath": "AGENTS.md",
|
|
9
|
+
"sourceHashes": {
|
|
10
|
+
"manifest": "531411d36dc6f5b97cd448edfc4df13906abf8fa8be488c9e1d37dea83871f5b",
|
|
11
|
+
"packageJson": "77cde31315f02781480765298c53e7813fb4258135fbd131232c91861dccad01",
|
|
12
|
+
"agents": "3816a164f6bd9e2ca6a93bb986ceb31b946a7b7692002fb4296c63f906a280a2",
|
|
13
|
+
"moduleDoc:README.md": "7455ec910926a71c4874e127121b421f81ad1250b766b49551dc9ef7787221e7"
|
|
14
|
+
},
|
|
15
|
+
"exports": [
|
|
16
|
+
"."
|
|
17
|
+
],
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@happyvertical/smrt-core": "workspace:*",
|
|
20
|
+
"@types/node": "24.13.6",
|
|
21
|
+
"typescript": "6.0.3",
|
|
22
|
+
"vite": "8.1.6",
|
|
23
|
+
"vitest": "4.1.10"
|
|
24
|
+
},
|
|
25
|
+
"smrtDependencies": [
|
|
26
|
+
"@happyvertical/smrt-core"
|
|
27
|
+
],
|
|
28
|
+
"sdkDependencies": [],
|
|
29
|
+
"tags": [
|
|
30
|
+
"cross-package"
|
|
31
|
+
],
|
|
32
|
+
"risks": [
|
|
33
|
+
"sensitive-fields-excluded"
|
|
34
|
+
],
|
|
35
|
+
"objects": [],
|
|
36
|
+
"surfaces": [],
|
|
37
|
+
"prompts": [],
|
|
38
|
+
"relationshipsV2": {
|
|
39
|
+
"foreignKeyFields": 0,
|
|
40
|
+
"crossPackageRefFields": 0,
|
|
41
|
+
"junctionCollections": 0,
|
|
42
|
+
"hierarchicalObjects": 0,
|
|
43
|
+
"polymorphicAssociations": 0,
|
|
44
|
+
"uuidColumns": 0
|
|
45
|
+
},
|
|
46
|
+
"agentDoc": "# @happyvertical/smrt-desktop\n\nThe sidecar manifest is shared by the desktop runtime bundler and supervisor.\nIts v1 wire format, portable path rules, and trusted package boundary are\ndocumented in [README.md](README.md). Keep the Node 26 example and test cases\naligned with the parser. Keep the manifest package free of runtime dependencies.\n\nFrom this directory, run `npm run build`, `npm run typecheck`, and\n`smrt test src/sidecar-manifest.test.ts`.\n",
|
|
47
|
+
"moduleDocs": [
|
|
48
|
+
{
|
|
49
|
+
"path": "README.md",
|
|
50
|
+
"module": "README",
|
|
51
|
+
"content": "# @happyvertical/smrt-desktop\n\nVersioned JSON manifest for a runtime bundled with an s-m-r-t desktop app. The\nruntime bundler writes the manifest and the desktop supervisor consumes it\nbefore launching the packaged executable.\n\n## Node 26 and adapter-node example\n\nThis [manifest](examples/node26-sidecar.json) describes a stock Node 26 sidecar\nand a SvelteKit adapter-node build. Mount the app-runtime health handler at\n`/api/_runtime/health` and use the local runtime profile.\n\n```json\n{\n \"version\": 1,\n \"executable\": \"binaries/node\",\n \"args\": [\"build/index.js\"],\n \"healthRoute\": \"/api/_runtime/health\",\n \"dataDirectory\": \"runtime\"\n}\n```\n\n```ts\nimport { readFile } from 'node:fs/promises';\nimport { parseSidecarManifest } from '@happyvertical/smrt-desktop';\n\nconst sidecar = parseSidecarManifest(\n await readFile('node26-sidecar.json', 'utf8'),\n);\n```\n\n## Version 1 fields\n\n- `version` is the number `1`. All five fields are required. Unknown fields and\n versions are errors. A future incompatible contract requires a new version.\n- `executable` is a portable path relative to the packaged executable root.\n For Tauri `externalBin` it is the configured logical path before any\n target-specific suffix or extension. The supervisor uses its packaged\n executable mapping and never searches `PATH`.\n- `args` is an ordered array of literal strings. Empty arrays and empty strings\n are valid. NUL and unpaired UTF-16 surrogates are rejected. The supervisor\n passes the array directly as process arguments, with the packaged app root\n as its working directory. The argument strings receive no shell expansion,\n token substitution, or path rewriting. Their interpretation belongs to the\n chosen executable.\n- `healthRoute` is a path on the supervisor-selected loopback origin.\n It begins with one slash and can be `/` or have nonempty segments containing\n only ASCII letters, digits, periods, underscores, tildes, and hyphens.\n A trailing slash is allowed. Dot segments, URL origins, network-path\n references, backslashes, percent escapes, queries and fragments are invalid.\n The probe stays on the selected loopback origin and rejects redirects.\n- `dataDirectory` is a portable path relative to the per-app OS data root.\n The supervisor supplies its resolved absolute path to the local runtime as\n `SMRT_DATA_DIR`. The app-runtime retains ownership of directory custody.\n\nPortable paths use forward-slash-separated nonempty segments, each starting\nwith an ASCII letter, digit, underscore or hyphen. Subsequent characters may\nalso include periods. Trailing periods and Windows device names (`CON`, `PRN`,\n`AUX`, `NUL`, `COM0` through `COM9`, and `LPT0` through `LPT9`, including\nextension forms) are rejected. The same lexical rules apply on each target.\n\nThe parser throws a fixed diagnostic on malformed JSON or invalid fields and\nreturns a typed snapshot on success. The bundler serializes that snapshot to\nwrite the artifact, so consumers receive one occurrence of each field. The\nmanifest is trusted package content.\nThe bundler and supervisor enforce executable provenance and filesystem\ncontainment, including symlink handling. Argument policies belong to the\npackaging tool and runtime being launched.\n"
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "Component"
|
|
3
|
+
title: "@happyvertical/smrt-desktop"
|
|
4
|
+
description: "Versioned sidecar manifest for SMRT desktop apps"
|
|
5
|
+
status: "stable"
|
|
6
|
+
generated:
|
|
7
|
+
by: "smrt/scripts/generate-knowledge-okf.ts"
|
|
8
|
+
at: "2026-11-05T17:39:51Z"
|
|
9
|
+
audience: "internal"
|
|
10
|
+
evidence_level: "manifest-described"
|
|
11
|
+
source_revision: "sha256:e12f0a6c9e9d167e0f17775f2be0fa2a1dee881aff99b2cf2780019be2552567"
|
|
12
|
+
sources:
|
|
13
|
+
- id: "manifest"
|
|
14
|
+
resource: "https://github.com/happyvertical/smrt/blob/main/packages/smrt-desktop/package.json"
|
|
15
|
+
title: "@happyvertical/smrt-desktop package manifest"
|
|
16
|
+
- id: "agents"
|
|
17
|
+
resource: "https://github.com/happyvertical/smrt/blob/main/packages/smrt-desktop/AGENTS.md"
|
|
18
|
+
title: "@happyvertical/smrt-desktop packages/smrt-desktop/AGENTS.md"
|
|
19
|
+
- id: "agents-2"
|
|
20
|
+
resource: "https://github.com/happyvertical/smrt/blob/main/packages/smrt-desktop/README.md"
|
|
21
|
+
title: "@happyvertical/smrt-desktop packages/smrt-desktop/README.md"
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# @happyvertical/smrt-desktop
|
|
25
|
+
|
|
26
|
+
## Package
|
|
27
|
+
|
|
28
|
+
- Directory: `packages/smrt-desktop`
|
|
29
|
+
- Private: no
|
|
30
|
+
- Object source: `domain-artifact`
|
|
31
|
+
- Evidence level: `manifest-described`
|
|
32
|
+
|
|
33
|
+
## Documentation
|
|
34
|
+
|
|
35
|
+
- `packages/smrt-desktop/AGENTS.md`
|
|
36
|
+
- `packages/smrt-desktop/README.md`
|
|
37
|
+
|
|
38
|
+
## Framework dependencies
|
|
39
|
+
|
|
40
|
+
- [smrt-core](/components/smrt-core.md)
|
|
41
|
+
|
|
42
|
+
## Exports
|
|
43
|
+
|
|
44
|
+
- `.`
|
package/package.json
CHANGED
|
@@ -1,6 +1,49 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@happyvertical/smrt-desktop",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.60.10",
|
|
4
|
+
"description": "Versioned sidecar manifest for SMRT desktop apps",
|
|
5
|
+
"author": "HappyVertical",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"types": "dist/index.d.ts",
|
|
10
|
+
"files": [
|
|
11
|
+
"CLAUDE.md",
|
|
12
|
+
"dist",
|
|
13
|
+
"AGENTS.md",
|
|
14
|
+
"examples"
|
|
15
|
+
],
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"import": "./dist/index.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@happyvertical/smrt-core": "0.60.10",
|
|
24
|
+
"@types/node": "24.13.6",
|
|
25
|
+
"typescript": "6.0.3",
|
|
26
|
+
"vite": "8.1.6",
|
|
27
|
+
"vitest": "4.1.10"
|
|
28
|
+
},
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"registry": "https://registry.npmjs.org",
|
|
31
|
+
"access": "public"
|
|
32
|
+
},
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "https://github.com/happyvertical/smrt.git",
|
|
36
|
+
"directory": "packages/smrt-desktop"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "vite build",
|
|
40
|
+
"build:watch": "vite build --watch",
|
|
41
|
+
"dev": "npm run build:watch & npm run test:watch",
|
|
42
|
+
"test": "vitest run",
|
|
43
|
+
"test:watch": "vitest",
|
|
44
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
45
|
+
"clean": "rm -rf dist",
|
|
46
|
+
"verify:pack": "node ../../scripts/verify-package-types-exports.js .",
|
|
47
|
+
"build:fresh": "npm run clean && npm run build && npm run verify:pack"
|
|
48
|
+
}
|
|
6
49
|
}
|