@synopackageland/templates 0.39.2 → 0.40.1
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/README.md +43 -17
- package/package.json +2 -1
- package/templates/_shared/AGENTS.md +23 -0
- package/templates/compose/dsm-package.yaml +1 -1
- package/templates/native-go/README.md +2 -2
- package/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +1 -1
- package/templates/native-go/backend/go.mod +1 -1
- package/templates/native-go/backend/go.sum +2 -2
- package/templates/native-go-vue/README.md +5 -2
- package/templates/native-go-vue/frontend/package-lock.json +9 -9
- package/templates/native-go-vue/frontend/package.json +2 -2
- package/templates/native-go-vue/frontend/src/App.vue +1 -2
- package/templates/native-node/README.md +2 -2
- package/templates/native-node/backend/package-lock.json +1 -1
- package/templates/native-node/dsm-package.yaml +1 -1
- package/templates/native-node-vue/README.md +5 -2
- package/templates/native-python/README.md +2 -2
- package/templates/native-python/dsm-package.yaml +1 -1
- package/templates/native-python-vue/README.md +5 -2
- package/templates/native-rust/README.md +2 -2
- package/templates/native-rust/backend/Cargo.lock +2 -2
- package/templates/native-rust/backend/Cargo.toml +1 -1
- package/templates/native-rust-delegate/backend/Cargo.lock +2 -2
- package/templates/native-rust-delegate/backend/Cargo.toml +1 -1
- package/templates/native-rust-vue/README.md +5 -2
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ the files an App owns; the SDK (`github.com/synopackageland/syno-pkg-land-sdk`,
|
|
|
8
8
|
|
|
9
9
|
Scaffolds keep automatic daemon recovery **off** by omitting `daemon.restart`.
|
|
10
10
|
For an App that owns a foreground native daemon, a CLI with restart support and
|
|
11
|
-
SDK
|
|
11
|
+
an SDK with restart support can accept this opt-in alongside its existing `exec` and
|
|
12
12
|
`targets`:
|
|
13
13
|
|
|
14
14
|
```yaml
|
|
@@ -22,7 +22,7 @@ daemon:
|
|
|
22
22
|
window_seconds: 300
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
Templates
|
|
25
|
+
Templates pin compatible UI and SDK releases in native and Compose projects.
|
|
26
26
|
Use a CLI that supports executor manifest format 1. The Vue `AppShell` shows a
|
|
27
27
|
non-blocking **Reload** notice when an upgrade replaced the UI an open page
|
|
28
28
|
loaded. Go Apps select
|
|
@@ -42,7 +42,7 @@ for declaration bounds, SDK selection, build/inspect checks and diagnostics.
|
|
|
42
42
|
|
|
43
43
|
An opt-in [Shared Folder permission example](examples/shared-folder-permission/README.md)
|
|
44
44
|
shows the Go status-handler registration and a Vue notice for startup checks and
|
|
45
|
-
storage failures.
|
|
45
|
+
storage failures. Its manifest records its SDK pin independently of the scaffold defaults.
|
|
46
46
|
|
|
47
47
|
An opt-in [native UI plus DSM console example](examples/dual-entry-console/README.md)
|
|
48
48
|
shows the `console` declaration for an App that wraps a web service behind the
|
|
@@ -77,25 +77,26 @@ manifest gets the overlays' methods. `init` copies the App SDK into
|
|
|
77
77
|
package.json without devDependencies and scripts, and `dist/`).
|
|
78
78
|
`_shared/dsm-scripts/` holds DSM's lifecycle scripts (`preinst`, `postinst`, `preupgrade`,
|
|
79
79
|
`postupgrade`, `preuninst`, `postuninst`, `start-stop-status`), each commented and doing
|
|
80
|
-
nothing; `init`
|
|
80
|
+
nothing; `init` copies them into every project's `dsm-scripts/`, and `build`
|
|
81
81
|
calls each one from the generated script of the same name (`synopkgland skill show lifecycle`).
|
|
82
82
|
The placeholders `__PACKAGE__` (also the Go module path), `__DISPLAY_NAME__` and
|
|
83
83
|
`__BACKGROUND_ENABLED__` are substituted by `init`.
|
|
84
84
|
|
|
85
|
-
`backend/go.mod` requires `github.com/synopackageland/syno-pkg-land-sdk
|
|
85
|
+
`backend/go.mod` requires `github.com/synopackageland/syno-pkg-land-sdk`; that line is
|
|
86
86
|
the single source of the SDK version and `frontend/package.json` pins
|
|
87
87
|
`@synopackageland/sdk` to the same version. Python and Node.js name it in
|
|
88
88
|
`backend.sdk`, Rust in the `syno-pkg-land-app` tag of `backend/Cargo.toml`
|
|
89
|
-
(and `Cargo.lock`)
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
(and `Cargo.lock`). The Vue frontend pins a compatible `@synopackageland/ui`.
|
|
90
|
+
Read the SDK's published peer dependency range with
|
|
91
|
+
`npm view @synopackageland/sdk peerDependencies` rather than overriding it. Tests use jsdom 30 for UI floating-layer styles.
|
|
92
92
|
|
|
93
93
|
Interactive NAS file operations use same-origin browser calls.
|
|
94
94
|
Custom file handlers use the SDK's
|
|
95
|
-
[session transport migration](https://github.com/synopackageland/syno-pkg-land-sdk/blob/
|
|
96
|
-
The CLI reads SDK
|
|
97
|
-
executor
|
|
98
|
-
|
|
95
|
+
[session transport migration](https://github.com/synopackageland/syno-pkg-land-sdk/blob/main/docs/dsm-session-transport.md).
|
|
96
|
+
The CLI reads the selected SDK's release manifest, which names its immutable
|
|
97
|
+
executor release and digests. Install matching CLI and templates dependencies;
|
|
98
|
+
query published releases with `npm view @synopackageland/templates version`
|
|
99
|
+
and `npm view @synopackageland/sdk version`.
|
|
99
100
|
|
|
100
101
|
Every App method must appear in the permissions table, including methods whose
|
|
101
102
|
permission equals `default: administrators`. Dynamic method names and custom
|
|
@@ -109,7 +110,7 @@ Keep punctuation between sentences and intentional loading ellipses.
|
|
|
109
110
|
|
|
110
111
|
## Request deadlines and background work
|
|
111
112
|
|
|
112
|
-
SDK/App
|
|
113
|
+
SDK/App defaults to 300 seconds for cooperative requests and 302 seconds
|
|
113
114
|
for the TS client and generated DSM window. The CLI reads the selected SDK's
|
|
114
115
|
timeout spec; `backend.timeout_seconds` explicitly overrides it for native
|
|
115
116
|
backends, and an earlier parent deadline still wins. Go assembly should fall
|
|
@@ -141,11 +142,36 @@ caps, approved root policy/program budgets and credential lifetimes retain
|
|
|
141
142
|
their existing limits; long root work uses `root.start` / `root.jobs.*`.
|
|
142
143
|
The independent ctl transport keeps its 62-second default: use an explicit
|
|
143
144
|
`--timeout` for long synchronous calls, or an existing nonblocking job flow.
|
|
144
|
-
See the SDK's [request deadline contract](https://github.com/synopackageland/syno-pkg-land-sdk/blob/
|
|
145
|
+
See the SDK's [request deadline contract](https://github.com/synopackageland/syno-pkg-land-sdk/blob/main/docs/request-deadlines.md).
|
|
146
|
+
|
|
147
|
+
## HTTPS and stale DSM tokens
|
|
148
|
+
|
|
149
|
+
Many CRUD, settings and file Apps work over HTTP; templates do not force HTTPS.
|
|
150
|
+
Require it only for secure context features (`getUserMedia`, clipboard, Service
|
|
151
|
+
Worker, WebCrypto `subtle`), pairing or an explicit secure Origin policy. Return
|
|
152
|
+
`https_required`, distinct from authentication errors, and show a dedicated
|
|
153
|
+
HTTPS page using SDK `identityCopy(locale).httpsTitle` / `errors.https_required`.
|
|
154
|
+
Go `api.RequireSecureOrigin(request)` is an optional supplementary check.
|
|
155
|
+
|
|
156
|
+
Only administrators may call `readDsmPorts(ctx)` to discover `dms_https` for a
|
|
157
|
+
link. SDK `readDsmHttpsURL(ctx, location.href)` guards this call; ordinary users
|
|
158
|
+
see instructions only, because PortInfo can refuse them or close their window.
|
|
159
|
+
Do not guess a port when discovery is unavailable.
|
|
160
|
+
|
|
161
|
+
An older DSM tab may retain a rejected `X-SYNO-TOKEN` after another tab signs in.
|
|
162
|
+
SDK `createClient({sessionRetry: {session, operations}})` and
|
|
163
|
+
`createDsmSession.refresh(rejectedToken)` offer opt-in, one-time recovery for
|
|
164
|
+
trusted `effect: read`, `kind: rpc` calls. Writes, AI, streams and batches never
|
|
165
|
+
replay; generated `ctx.call` is not automatically wrapped. Check the installed
|
|
166
|
+
SDK's exported API before opting in; keep its frontend and backend pins aligned.
|
|
167
|
+
Read the [CLI skill](https://github.com/synopackageland/syno-pkg-land-cli/blob/main/skills/SKILL.md#https-與舊-dsm-token)
|
|
168
|
+
and [SDK API guide](https://github.com/synopackageland/syno-pkg-land-sdk/blob/main/docs/https-and-session-recovery.md).
|
|
169
|
+
Validate HTTP and HTTPS entries, administrator and ordinary users, stale-token
|
|
170
|
+
read recovery and no replay of writes/AI/streams before shipping an App.
|
|
145
171
|
|
|
146
172
|
## Hyper Backup
|
|
147
173
|
|
|
148
|
-
Native Apps appear in Hyper Backup as applications by default. CLI
|
|
174
|
+
Native Apps appear in Hyper Backup as applications by default. The CLI
|
|
149
175
|
builds them with a fixed `scripts/backup/` shim that Hyper Backup runs as
|
|
150
176
|
root; it only switches to the package account, which archives or restores the
|
|
151
177
|
App's data folder with the SDK backup control. The App itself still runs as
|
|
@@ -161,7 +187,7 @@ Keep `base: './'`, relative imports and `cssCodeSplit: false`; allow lazy chunks
|
|
|
161
187
|
with `() => import('./Page.vue')` or `defineAsyncComponent`. Each mount creates
|
|
162
188
|
its own Vue App and returns synchronous cleanup.
|
|
163
189
|
|
|
164
|
-
CLI
|
|
190
|
+
The CLI copies the entire output into `ui/app/<tree-sha256>/` and verifies it
|
|
165
191
|
during `inspect`. Changing a lazy chunk changes the snapshot URL. An open page
|
|
166
192
|
may need to reload after an upgrade when an old lazy chunk is unavailable.
|
|
167
193
|
See the SDK's [frontend bundle contract](https://github.com/synopackageland/syno-pkg-land-sdk/blob/main/docs/frontend-bundles.md).
|
|
@@ -303,7 +329,7 @@ The bridge examples expose submission, lookup and cancellation through
|
|
|
303
329
|
|
|
304
330
|
## External access
|
|
305
331
|
|
|
306
|
-
With
|
|
332
|
+
With compatible CLI and SDK releases, a gateway App may declare `identity_gateway.external_access: {connect: optional, origin_change: confirm, single_origin: true}` for an upstream that signs in on one fixed URL. The policy is forwarded to the packaged gateway. A single-origin App's `manual_origin` accepts an explicit HTTPS port; the `external-origin` installation setting remains restricted to port 443. The DSM launcher selects a provider destination, probes `/_spl/ping` for up to eight seconds, and explains failures before offering **Open anyway**. A configured single-origin App always opens its primary external origin.
|
|
307
333
|
|
|
308
334
|
|
|
309
335
|
Compose templates declare an app-named dedicated shared folder by default. DSM
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@synopackageland/templates",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.40.1",
|
|
4
4
|
"description": "Project templates for synopkgland init: native-go, native-python, native-node and native-rust (plain or Vue, with jobs, delegate and root-ops overlays), binary and compose.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"README.md"
|
|
18
18
|
],
|
|
19
19
|
"scripts": {
|
|
20
|
+
"check:docs": "node --test scripts/check-doc-versions.test.mjs && node scripts/check-doc-versions.mjs",
|
|
20
21
|
"gate": "scripts/gate.sh"
|
|
21
22
|
}
|
|
22
23
|
}
|
|
@@ -268,6 +268,29 @@ sweep forward the cancel instead of admitting it.
|
|
|
268
268
|
template ships the wizard contract; it is not proof of every DSM release or of
|
|
269
269
|
full writer/reboot behavior.
|
|
270
270
|
|
|
271
|
+
## HTTPS and stale DSM tokens
|
|
272
|
+
|
|
273
|
+
Do not force HTTPS for ordinary CRUD/settings/file Apps. Only secure context
|
|
274
|
+
features, pairing or a strict secure Origin policy justify it. Return
|
|
275
|
+
`https_required`, not a generic authentication error, and render the SDK's
|
|
276
|
+
`identityCopy(locale).httpsTitle` / `errors.https_required` with reopening
|
|
277
|
+
instructions. Go `api.RequireSecureOrigin(request)` is opt-in and does not
|
|
278
|
+
replace authentication, origin or permission checks.
|
|
279
|
+
|
|
280
|
+
Call `readDsmPorts` for `dms_https` only when `ctx.user?.isAdmin === true`;
|
|
281
|
+
`readDsmHttpsURL(ctx, location.href)` applies this guard. Ordinary users see
|
|
282
|
+
instructions only: PortInfo can refuse their session or close the DSM window.
|
|
283
|
+
Do not guess a configured port.
|
|
284
|
+
|
|
285
|
+
For an old tab's stale `X-SYNO-TOKEN`, SDK `createClient` can opt in through
|
|
286
|
+
`sessionRetry` and `createDsmSession.refresh(rejectedToken)`. Only trusted
|
|
287
|
+
`effect: read`, `kind: rpc` calls retry once on `session_required`. Writes, AI,
|
|
288
|
+
streams, batches and unknown methods never retry. Existing `ctx.call` is not
|
|
289
|
+
automatically wrapped. Verify the installed SDK exports these APIs before
|
|
290
|
+
using them. Follow the [CLI skill](https://github.com/synopackageland/syno-pkg-land-cli/blob/main/skills/SKILL.md#https-與舊-dsm-token)
|
|
291
|
+
and [SDK guide](https://github.com/synopackageland/syno-pkg-land-sdk/blob/main/docs/https-and-session-recovery.md).
|
|
292
|
+
Test both HTTP/HTTPS entries, both user roles and cross-tab session recovery.
|
|
293
|
+
|
|
271
294
|
## Go backend
|
|
272
295
|
|
|
273
296
|
- Routes: `backend/internal/app` (`routes.go` registers them); App
|
|
@@ -23,7 +23,7 @@ compose:
|
|
|
23
23
|
web: {service: web, port: 8080, health: {path: /, status: 200}}
|
|
24
24
|
network: {egress: isolated}
|
|
25
25
|
identity_gateway:
|
|
26
|
-
sdk: 0.
|
|
26
|
+
sdk: 0.50.0
|
|
27
27
|
mode: none
|
|
28
28
|
listen: {http: 28000}
|
|
29
29
|
# Web Apps default to new-page through the shared app-launch resolver.
|
|
@@ -17,7 +17,7 @@ DSM main menu → DSM window (ui/app.js)
|
|
|
17
17
|
|
|
18
18
|
## Requests and long work
|
|
19
19
|
|
|
20
|
-
SDK/App
|
|
20
|
+
SDK/App defaults to 300-second requests and a 302-second browser wait.
|
|
21
21
|
Explicit `backend.timeout_seconds` and earlier parent deadlines still apply;
|
|
22
22
|
rebuild the App to use the new SDK. For long NAS work, enable the existing jobs
|
|
23
23
|
capability: return admission and the original job ID promptly, execute in the
|
|
@@ -27,7 +27,7 @@ last queued/running state intact. After a lost admission reply, reuse the same
|
|
|
27
27
|
idempotency key and input instead of replaying a mutation with a new key.
|
|
28
28
|
Jobs default to 30 minutes; approved executor limits remain separate. ctl keeps
|
|
29
29
|
its 62-second transport default; use an explicit `--timeout` or an existing
|
|
30
|
-
nonblocking job. See the SDK's [request deadline contract](https://github.com/synopackageland/syno-pkg-land-sdk/blob/
|
|
30
|
+
nonblocking job. See the SDK's [request deadline contract](https://github.com/synopackageland/syno-pkg-land-sdk/blob/main/docs/request-deadlines.md).
|
|
31
31
|
|
|
32
32
|
## Quick start
|
|
33
33
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
github.com/synopackageland/syno-pkg-land-sdk v0.
|
|
2
|
-
github.com/synopackageland/syno-pkg-land-sdk v0.
|
|
1
|
+
github.com/synopackageland/syno-pkg-land-sdk v0.50.0 h1:eaehFfsLqa18qFe0S3xjF/eaS3qg5ZSCycZdnGAvt7c=
|
|
2
|
+
github.com/synopackageland/syno-pkg-land-sdk v0.50.0/go.mod h1:A4ZvKEQnCMk5offv/57Zsf1Z/pV1RmylS9cMfDqdBMQ=
|
|
3
3
|
golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ=
|
|
4
4
|
golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
|
|
@@ -51,8 +51,11 @@ The manifest is dsm-package.yaml schema 2: backend.kind: go and capabilities.fil
|
|
|
51
51
|
|
|
52
52
|
Use the installed `@synopackageland/ui`; package.json pins its version.
|
|
53
53
|
`App.vue` lays the shell out with the SDK's `AppShell` (`@synopackageland/sdk/vue`):
|
|
54
|
-
`pages` from `shellPages`, the
|
|
55
|
-
default slot.
|
|
54
|
+
`pages` from `shellPages`, the page's buttons in `#actions` and the pages in its
|
|
55
|
+
default slot. The sidebar names the page: the shell shows no page title, puts
|
|
56
|
+
`#actions` in a bar above the page and scrolls only the content; a settings
|
|
57
|
+
page (`SectionTabs fill` or `SettingsPage`) keeps its tabs and footer in place
|
|
58
|
+
with no CSS of its own. Given `ctx`, it follows the launch. In a DSM desktop window it
|
|
56
59
|
keeps `wide-layout="window"`, even maximized; the DSM host sets the 700px
|
|
57
60
|
minimum window width. A Portal or standalone launch owns the whole page
|
|
58
61
|
(`ctx.fullPage`, from the generated window): `AppShell` takes
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
"name": "native-dsm-vue-app",
|
|
8
8
|
"dependencies": {
|
|
9
9
|
"@lucide/vue": "1.48.0",
|
|
10
|
-
"@synopackageland/sdk": "0.
|
|
11
|
-
"@synopackageland/ui": "0.
|
|
10
|
+
"@synopackageland/sdk": "0.50.0",
|
|
11
|
+
"@synopackageland/ui": "0.20.0",
|
|
12
12
|
"vue": "3.5.43"
|
|
13
13
|
},
|
|
14
14
|
"devDependencies": {
|
|
@@ -1177,13 +1177,13 @@
|
|
|
1177
1177
|
}
|
|
1178
1178
|
},
|
|
1179
1179
|
"node_modules/@synopackageland/sdk": {
|
|
1180
|
-
"version": "0.
|
|
1181
|
-
"resolved": "https://registry.npmjs.org/@synopackageland/sdk/-/sdk-0.
|
|
1182
|
-
"integrity": "sha512-
|
|
1180
|
+
"version": "0.50.0",
|
|
1181
|
+
"resolved": "https://registry.npmjs.org/@synopackageland/sdk/-/sdk-0.50.0.tgz",
|
|
1182
|
+
"integrity": "sha512-9cc/aBNicwE/2Ospx1a/akBGU2B8B2cQg6i06LbpZe8rdDBuPdLmAZh5WIlREsUruetq0mfmlVoeQ8l/lrdZ3g==",
|
|
1183
1183
|
"license": "MIT",
|
|
1184
1184
|
"peerDependencies": {
|
|
1185
1185
|
"@lucide/vue": "^1.48.0",
|
|
1186
|
-
"@synopackageland/ui": ">=0.10.1 <0.
|
|
1186
|
+
"@synopackageland/ui": ">=0.10.1 <0.21.0",
|
|
1187
1187
|
"vue": "^3.5.0"
|
|
1188
1188
|
},
|
|
1189
1189
|
"peerDependenciesMeta": {
|
|
@@ -1196,9 +1196,9 @@
|
|
|
1196
1196
|
}
|
|
1197
1197
|
},
|
|
1198
1198
|
"node_modules/@synopackageland/ui": {
|
|
1199
|
-
"version": "0.
|
|
1200
|
-
"resolved": "https://registry.npmjs.org/@synopackageland/ui/-/ui-0.
|
|
1201
|
-
"integrity": "sha512-
|
|
1199
|
+
"version": "0.20.0",
|
|
1200
|
+
"resolved": "https://registry.npmjs.org/@synopackageland/ui/-/ui-0.20.0.tgz",
|
|
1201
|
+
"integrity": "sha512-YoeMoI2s1jw+1fdyVjc2L9GzwaDCiCrj+zMQDOBiCCjPdPiOElENAbBm1vo/XKViVNhPoH4p3gXQEQxf4RRUXA==",
|
|
1202
1202
|
"license": "MIT",
|
|
1203
1203
|
"dependencies": {
|
|
1204
1204
|
"@floating-ui/dom": "1.8.0",
|
|
@@ -25,7 +25,6 @@ const page = ref<ShellPage>('status')
|
|
|
25
25
|
const pages = computed(() => shellPages({background:backgroundEnabled}))
|
|
26
26
|
// Only a confirmed sign-in need replaces the App's pages; the sign-in page draws its own title.
|
|
27
27
|
const signIn = computed(() => login.ready.value && login.enabled.value && !login.subject.value && {header: false as const})
|
|
28
|
-
const subtitle = computed(() => app.value?.package)
|
|
29
28
|
function message(e: unknown) {
|
|
30
29
|
const code = (e as {code?: string})?.code || 'request_failed'
|
|
31
30
|
const errors = copy.value.errors as Record<string, string>
|
|
@@ -71,7 +70,7 @@ onUnmounted(()=>{disposed=true;unsubscribe?.();login.dispose()})
|
|
|
71
70
|
</script>
|
|
72
71
|
|
|
73
72
|
<template>
|
|
74
|
-
<AppShell app-root v-model="page" :ctx="shellCtx" :locale="ctx.locale" :pages="pages" :
|
|
73
|
+
<AppShell app-root v-model="page" :ctx="shellCtx" :locale="ctx.locale" :pages="pages" :denied="signIn" sidebar-storage-key="__PACKAGE__">
|
|
75
74
|
<template #denied><LoginPage :session="login" :locale="ctx.locale" /></template>
|
|
76
75
|
<template #actions><Button variant="secondary" :disabled="busy" @click="refreshAll">{{ copy.refresh }}</Button><Button v-if="login.enabled.value" variant="secondary" :disabled="busy" @click="signOut">{{ copy.signOut }}</Button></template>
|
|
77
76
|
<ExecutorGate :ctx="ctx" :admin="ctx.user?.isAdmin ?? !!app?.admin">
|
|
@@ -17,7 +17,7 @@ DSM main menu → DSM window (ui/app.js)
|
|
|
17
17
|
|
|
18
18
|
## Requests and long work
|
|
19
19
|
|
|
20
|
-
SDK/App
|
|
20
|
+
SDK/App defaults to 300-second requests and a 302-second browser wait.
|
|
21
21
|
Explicit `backend.timeout_seconds` and earlier parent deadlines still apply;
|
|
22
22
|
rebuild the App to use the new SDK. For long NAS work, enable the existing jobs
|
|
23
23
|
capability: return admission and the original job ID promptly, execute in the
|
|
@@ -27,7 +27,7 @@ last queued/running state intact. After a lost admission reply, reuse the same
|
|
|
27
27
|
idempotency key and input instead of replaying a mutation with a new key.
|
|
28
28
|
Jobs default to 30 minutes; approved executor limits remain separate. ctl keeps
|
|
29
29
|
its 62-second transport default; use an explicit `--timeout` or an existing
|
|
30
|
-
nonblocking job. See the SDK's [request deadline contract](https://github.com/synopackageland/syno-pkg-land-sdk/blob/
|
|
30
|
+
nonblocking job. See the SDK's [request deadline contract](https://github.com/synopackageland/syno-pkg-land-sdk/blob/main/docs/request-deadlines.md).
|
|
31
31
|
|
|
32
32
|
## Quick start
|
|
33
33
|
|
|
@@ -28,8 +28,11 @@ bridge App's runtime serves.
|
|
|
28
28
|
|
|
29
29
|
Use the installed `@synopackageland/ui`; package.json pins its version.
|
|
30
30
|
`App.vue` lays the shell out with the SDK's `AppShell` (`@synopackageland/sdk/vue`):
|
|
31
|
-
`pages` from `shellPages`, the
|
|
32
|
-
default slot.
|
|
31
|
+
`pages` from `shellPages`, the page's buttons in `#actions` and the pages in its
|
|
32
|
+
default slot. The sidebar names the page: the shell shows no page title, puts
|
|
33
|
+
`#actions` in a bar above the page and scrolls only the content; a settings
|
|
34
|
+
page (`SectionTabs fill` or `SettingsPage`) keeps its tabs and footer in place
|
|
35
|
+
with no CSS of its own. Given `ctx`, it follows the launch. In a DSM desktop window it
|
|
33
36
|
keeps `wide-layout="window"`, even maximized; the DSM host sets the 700px
|
|
34
37
|
minimum window width. A Portal or standalone launch owns the whole page
|
|
35
38
|
(`ctx.fullPage`, from the generated window): `AppShell` takes
|
|
@@ -17,7 +17,7 @@ DSM main menu → DSM window (ui/app.js)
|
|
|
17
17
|
|
|
18
18
|
## Requests and long work
|
|
19
19
|
|
|
20
|
-
SDK/App
|
|
20
|
+
SDK/App defaults to 300-second requests and a 302-second browser wait.
|
|
21
21
|
Explicit `backend.timeout_seconds` and earlier parent deadlines still apply;
|
|
22
22
|
rebuild the App to use the new SDK. For long NAS work, enable the existing jobs
|
|
23
23
|
capability: return admission and the original job ID promptly, execute in the
|
|
@@ -27,7 +27,7 @@ last queued/running state intact. After a lost admission reply, reuse the same
|
|
|
27
27
|
idempotency key and input instead of replaying a mutation with a new key.
|
|
28
28
|
Jobs default to 30 minutes; approved executor limits remain separate. ctl keeps
|
|
29
29
|
its 62-second transport default; use an explicit `--timeout` or an existing
|
|
30
|
-
nonblocking job. See the SDK's [request deadline contract](https://github.com/synopackageland/syno-pkg-land-sdk/blob/
|
|
30
|
+
nonblocking job. See the SDK's [request deadline contract](https://github.com/synopackageland/syno-pkg-land-sdk/blob/main/docs/request-deadlines.md).
|
|
31
31
|
|
|
32
32
|
## Quick start
|
|
33
33
|
|
|
@@ -28,8 +28,11 @@ bridge App's runtime serves.
|
|
|
28
28
|
|
|
29
29
|
Use the installed `@synopackageland/ui`; package.json pins its version.
|
|
30
30
|
`App.vue` lays the shell out with the SDK's `AppShell` (`@synopackageland/sdk/vue`):
|
|
31
|
-
`pages` from `shellPages`, the
|
|
32
|
-
default slot.
|
|
31
|
+
`pages` from `shellPages`, the page's buttons in `#actions` and the pages in its
|
|
32
|
+
default slot. The sidebar names the page: the shell shows no page title, puts
|
|
33
|
+
`#actions` in a bar above the page and scrolls only the content; a settings
|
|
34
|
+
page (`SectionTabs fill` or `SettingsPage`) keeps its tabs and footer in place
|
|
35
|
+
with no CSS of its own. Given `ctx`, it follows the launch. In a DSM desktop window it
|
|
33
36
|
keeps `wide-layout="window"`, even maximized; the DSM host sets the 700px
|
|
34
37
|
minimum window width. A Portal or standalone launch owns the whole page
|
|
35
38
|
(`ctx.fullPage`, from the generated window): `AppShell` takes
|
|
@@ -17,7 +17,7 @@ DSM main menu → DSM window (ui/app.js)
|
|
|
17
17
|
|
|
18
18
|
## Requests and long work
|
|
19
19
|
|
|
20
|
-
SDK/App
|
|
20
|
+
SDK/App defaults to 300-second requests and a 302-second browser wait.
|
|
21
21
|
Explicit `backend.timeout_seconds` and earlier parent deadlines still apply;
|
|
22
22
|
rebuild the App to use the new SDK. For long NAS work, enable the existing jobs
|
|
23
23
|
capability: return admission and the original job ID promptly, execute in the
|
|
@@ -27,7 +27,7 @@ last queued/running state intact. After a lost admission reply, reuse the same
|
|
|
27
27
|
idempotency key and input instead of replaying a mutation with a new key.
|
|
28
28
|
Jobs default to 30 minutes; approved executor limits remain separate. ctl keeps
|
|
29
29
|
its 62-second transport default; use an explicit `--timeout` or an existing
|
|
30
|
-
nonblocking job. See the SDK's [request deadline contract](https://github.com/synopackageland/syno-pkg-land-sdk/blob/
|
|
30
|
+
nonblocking job. See the SDK's [request deadline contract](https://github.com/synopackageland/syno-pkg-land-sdk/blob/main/docs/request-deadlines.md).
|
|
31
31
|
|
|
32
32
|
## Quick start
|
|
33
33
|
|
|
@@ -104,8 +104,8 @@ dependencies = [
|
|
|
104
104
|
|
|
105
105
|
[[package]]
|
|
106
106
|
name = "syno-pkg-land-app"
|
|
107
|
-
version = "0.
|
|
108
|
-
source = "git+https://github.com/synopackageland/syno-pkg-land-sdk?tag=v0.
|
|
107
|
+
version = "0.50.0"
|
|
108
|
+
source = "git+https://github.com/synopackageland/syno-pkg-land-sdk?tag=v0.50.0#b1adac9407cf1338fa79741ebfcbdaa5c1698b6f"
|
|
109
109
|
dependencies = [
|
|
110
110
|
"libc",
|
|
111
111
|
"serde",
|
|
@@ -9,7 +9,7 @@ libc = "0.2"
|
|
|
9
9
|
serde = { version = "1", features = ["derive"] }
|
|
10
10
|
serde_json = "1"
|
|
11
11
|
# The SDK version is the tag; `synopkgland check` reads it from Cargo.lock.
|
|
12
|
-
syno-pkg-land-app = { git = "https://github.com/synopackageland/syno-pkg-land-sdk", tag = "v0.
|
|
12
|
+
syno-pkg-land-app = { git = "https://github.com/synopackageland/syno-pkg-land-sdk", tag = "v0.50.0" }
|
|
13
13
|
|
|
14
14
|
[profile.release]
|
|
15
15
|
# A handler panic becomes an "internal" reply; abort would end the App without one.
|
|
@@ -170,8 +170,8 @@ dependencies = [
|
|
|
170
170
|
|
|
171
171
|
[[package]]
|
|
172
172
|
name = "syno-pkg-land-app"
|
|
173
|
-
version = "0.
|
|
174
|
-
source = "git+https://github.com/synopackageland/syno-pkg-land-sdk?tag=v0.
|
|
173
|
+
version = "0.50.0"
|
|
174
|
+
source = "git+https://github.com/synopackageland/syno-pkg-land-sdk?tag=v0.50.0#b1adac9407cf1338fa79741ebfcbdaa5c1698b6f"
|
|
175
175
|
dependencies = [
|
|
176
176
|
"libc",
|
|
177
177
|
"serde",
|
|
@@ -10,7 +10,7 @@ libc = "0.2"
|
|
|
10
10
|
serde = { version = "1", features = ["derive"] }
|
|
11
11
|
serde_json = "1"
|
|
12
12
|
# The SDK version is the tag; `synopkgland check` reads it from Cargo.lock.
|
|
13
|
-
syno-pkg-land-app = { git = "https://github.com/synopackageland/syno-pkg-land-sdk", tag = "v0.
|
|
13
|
+
syno-pkg-land-app = { git = "https://github.com/synopackageland/syno-pkg-land-sdk", tag = "v0.50.0" }
|
|
14
14
|
|
|
15
15
|
[profile.release]
|
|
16
16
|
# A handler panic becomes an "internal" reply; abort would end the App without one.
|
|
@@ -28,8 +28,11 @@ bridge App's runtime serves.
|
|
|
28
28
|
|
|
29
29
|
Use the installed `@synopackageland/ui`; package.json pins its version.
|
|
30
30
|
`App.vue` lays the shell out with the SDK's `AppShell` (`@synopackageland/sdk/vue`):
|
|
31
|
-
`pages` from `shellPages`, the
|
|
32
|
-
default slot.
|
|
31
|
+
`pages` from `shellPages`, the page's buttons in `#actions` and the pages in its
|
|
32
|
+
default slot. The sidebar names the page: the shell shows no page title, puts
|
|
33
|
+
`#actions` in a bar above the page and scrolls only the content; a settings
|
|
34
|
+
page (`SectionTabs fill` or `SettingsPage`) keeps its tabs and footer in place
|
|
35
|
+
with no CSS of its own. Given `ctx`, it follows the launch. In a DSM desktop window it
|
|
33
36
|
keeps `wide-layout="window"`, even maximized; the DSM host sets the 700px
|
|
34
37
|
minimum window width. A Portal or standalone launch owns the whole page
|
|
35
38
|
(`ctx.fullPage`, from the generated window): `AppShell` takes
|