@synopackageland/templates 0.30.0 → 0.31.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 CHANGED
@@ -22,8 +22,8 @@ daemon:
22
22
  window_seconds: 300
23
23
  ```
24
24
 
25
- Templates pin UI 0.14.10 and SDK 0.30.0 in native and Compose projects.
26
- Use CLI 0.30.0 or later. Go Apps select
25
+ Templates pin UI 0.16.1 and SDK 0.31.1 in native and Compose projects.
26
+ Use CLI 0.31.0 or later. Go Apps select
27
27
  their controller from their Go SDK requirement; an identity gateway selects it
28
28
  from `identity_gateway.sdk`. The CLI rejects older selected versions, even for
29
29
  an explicit `mode: off`, rather than dropping the declaration. A local SDK source
@@ -39,7 +39,7 @@ for declaration bounds, SDK selection, build/inspect checks and diagnostics.
39
39
 
40
40
  An opt-in [Shared Folder permission example](examples/shared-folder-permission/README.md)
41
41
  shows the Go status-handler registration and a Vue notice for startup checks and
42
- storage failures. It uses the same SDK 0.30.0 release pinned by the default scaffolds.
42
+ storage failures. It uses the same SDK 0.31.1 release pinned by the default scaffolds.
43
43
 
44
44
  An opt-in [native UI plus DSM console example](examples/dual-entry-console/README.md)
45
45
  shows the `console` declaration for an App that wraps a web service behind the
@@ -79,18 +79,20 @@ calls each one from the generated script of the same name (`synopkgland skill sh
79
79
  The placeholders `__PACKAGE__` (also the Go module path), `__DISPLAY_NAME__` and
80
80
  `__BACKGROUND_ENABLED__` are substituted by `init`.
81
81
 
82
- `backend/go.mod` requires `github.com/synopackageland/syno-pkg-land-sdk v0.30.0`; that line is
82
+ `backend/go.mod` requires `github.com/synopackageland/syno-pkg-land-sdk v0.31.1`; that line is
83
83
  the single source of the SDK version and `frontend/package.json` pins
84
84
  `@synopackageland/sdk` to the same version. Python and Node.js name it in
85
85
  `backend.sdk`, Rust in the `syno-pkg-land-app` tag of `backend/Cargo.toml`
86
- (and `Cargo.lock`); all of them pin 0.30.0. The Vue frontend pins
87
- `@synopackageland/ui` 0.14.10. SDK 0.30.0 accepts UI `>=0.10.1 <0.16.0`,
86
+ (and `Cargo.lock`); all of them pin 0.31.1. The Vue frontend pins
87
+ `@synopackageland/ui` 0.16.1. SDK 0.31.1 accepts UI `>=0.10.1 <0.17.0`,
88
88
  so no UI peer override is needed. Tests use jsdom 30 for UI floating-layer styles.
89
89
 
90
90
  SDK 0.27.0 moves interactive NAS file operations to same-origin browser calls.
91
91
  Custom file handlers use the SDK's
92
92
  [session transport migration](https://github.com/synopackageland/syno-pkg-land-sdk/blob/v0.27.0/docs/dsm-session-transport.md).
93
- Use CLI 0.30.0 for the matching SDK 0.30.0 executor/lifecycle digests. Rebuilt
93
+ CLI 0.31.0 reads SDK 0.31.1's release manifest, which reuses the immutable
94
+ executor/v0.31.0 and its lifecycle digests. Its `~0.31.0` templates dependency
95
+ accepts templates 0.31.1 on a fresh install; no CLI patch is required. Rebuilt
94
96
  protected executors follow normal administrator approval. No NAS acceptance is claimed.
95
97
 
96
98
  UI and i18n text, including the DSM glossary, omit terminal sentence periods.
@@ -230,4 +232,4 @@ The bridge examples expose submission, lookup and cancellation through
230
232
 
231
233
  ## External access
232
234
 
233
- With CLI/SDK 0.30.0, 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.
235
+ With CLI 0.31.0 and SDK 0.31.1, 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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synopackageland/templates",
3
- "version": "0.30.0",
3
+ "version": "0.31.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": {
@@ -14,7 +14,7 @@ compose:
14
14
  web: {service: web, port: 8080, health: {path: /, status: 200}}
15
15
  network: {egress: isolated}
16
16
  identity_gateway:
17
- sdk: 0.30.0
17
+ sdk: 0.31.1
18
18
  mode: none
19
19
  listen: {http: 28000}
20
20
  # Web Apps default to new-page through the shared app-launch resolver.
@@ -1,6 +1,6 @@
1
1
  Native Go package build dependencies
2
2
 
3
- github.com/synopackageland/syno-pkg-land-sdk v0.30.0 (MIT)
3
+ github.com/synopackageland/syno-pkg-land-sdk v0.31.1 (MIT)
4
4
 
5
5
  Copyright (c) 2026 synopkgland
6
6
 
@@ -4,6 +4,6 @@ go 1.25.0
4
4
 
5
5
  toolchain go1.26.10
6
6
 
7
- require github.com/synopackageland/syno-pkg-land-sdk v0.30.0
7
+ require github.com/synopackageland/syno-pkg-land-sdk v0.31.1
8
8
 
9
9
  require golang.org/x/sys v0.44.0 // indirect
@@ -1,4 +1,4 @@
1
- github.com/synopackageland/syno-pkg-land-sdk v0.30.0 h1:J3b55Csho3oBfpyod1BOmNzqcGf216g829j8VnsU2uI=
2
- github.com/synopackageland/syno-pkg-land-sdk v0.30.0/go.mod h1:8GwREGbczc8mAk4Gv8FUHaukXXCUstjzkovQrNV59Cc=
1
+ github.com/synopackageland/syno-pkg-land-sdk v0.31.1 h1:9rH5y7+m0xIXKU5A3AgOeX75o3z4CyRj6W5FNE15Sa4=
2
+ github.com/synopackageland/syno-pkg-land-sdk v0.31.1/go.mod h1:8GwREGbczc8mAk4Gv8FUHaukXXCUstjzkovQrNV59Cc=
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=
@@ -10,6 +10,7 @@ import (
10
10
  "os"
11
11
  "os/user"
12
12
  "path/filepath"
13
+ "strings"
13
14
  "syscall"
14
15
  "time"
15
16
 
@@ -137,7 +138,8 @@ func (b backgroundAPI) submit(ctx context.Context, _ api.Caller, _ *http.Request
137
138
  return map[string]any{"job": job, "duplicate": duplicate}, nil
138
139
  }
139
140
 
140
- // readInput accepts only an existing regular file inside the App data directory.
141
+ // readInput accepts only an existing regular file inside the App data directory,
142
+ // outside the job spool.
141
143
  // The App's producer imports it first; jobs and schedules retain a private copy.
142
144
  func (b backgroundAPI) readInput(input string) ([]byte, error) {
143
145
  bad := api.BadRequest("input must be a regular file in the App data directory")
@@ -145,6 +147,10 @@ func (b backgroundAPI) readInput(input string) ([]byte, error) {
145
147
  if err != nil || !filepath.IsAbs(input) || !filepath.IsLocal(rel) {
146
148
  return nil, bad
147
149
  }
150
+ // The job spool keeps other owners' private copies; it is never an input.
151
+ if first, _, _ := strings.Cut(filepath.ToSlash(rel), "/"); first == "background" {
152
+ return nil, bad
153
+ }
148
154
  root, err := os.OpenRoot(b.dataDir)
149
155
  if err != nil {
150
156
  return nil, bad
@@ -172,7 +172,18 @@ func TestBackgroundSubmitRejectsExternalAndOversizedInput(t *testing.T) {
172
172
  if err := os.Symlink(outside, filepath.Join(e.dataDir, "escape")); err != nil {
173
173
  t.Fatal(err)
174
174
  }
175
- for _, input := range []string{outside, "input.txt", filepath.Join(e.dataDir, "escape"), e.dataDir} {
175
+ if code, _ := e.call(alice, "bg.jobs.submit", e.submitParams("first")); code != "" {
176
+ t.Fatal(code)
177
+ }
178
+ spooled, err := filepath.Glob(filepath.Join(e.dataDir, "background", "*"))
179
+ if err != nil || len(spooled) == 0 {
180
+ t.Fatalf("no spool files: %v", err)
181
+ }
182
+ if err := os.WriteFile(filepath.Join(e.dataDir, "background", "copy"), []byte("x"), 0600); err != nil {
183
+ t.Fatal(err)
184
+ }
185
+ inputs := []string{outside, "input.txt", filepath.Join(e.dataDir, "escape"), e.dataDir, filepath.Join(e.dataDir, "background", "copy")}
186
+ for _, input := range append(inputs, spooled...) {
176
187
  p, _ := json.Marshal(map[string]string{"key": "bad", "name": "a.txt", "input": input})
177
188
  if code, _ := e.call(alice, "bg.jobs.submit", string(p)); code != "bad_request" {
178
189
  t.Fatalf("%s: %s", input, code)
@@ -185,7 +196,7 @@ func TestBackgroundSubmitRejectsExternalAndOversizedInput(t *testing.T) {
185
196
  t.Fatal(code)
186
197
  }
187
198
  jobs, err := e.store.List(context.Background())
188
- if err != nil || len(jobs) != 0 {
199
+ if err != nil || len(jobs) != 1 {
189
200
  t.Fatalf("invalid input queued: %v %v", jobs, err)
190
201
  }
191
202
  }
@@ -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.30.0",
11
- "@synopackageland/ui": "0.14.10",
10
+ "@synopackageland/sdk": "0.31.1",
11
+ "@synopackageland/ui": "0.16.1",
12
12
  "vue": "3.5.43"
13
13
  },
14
14
  "devDependencies": {
@@ -1152,13 +1152,13 @@
1152
1152
  }
1153
1153
  },
1154
1154
  "node_modules/@synopackageland/sdk": {
1155
- "version": "0.30.0",
1156
- "resolved": "https://registry.npmjs.org/@synopackageland/sdk/-/sdk-0.30.0.tgz",
1157
- "integrity": "sha512-dyUCtTcW4/XmhC8R2x1/RiifzT6K8AkjeIX1H2DkrvZsoWwGdeV6u/NgVYptN80WaqbkwcKbqOVa5Dq6ppwo7A==",
1155
+ "version": "0.31.1",
1156
+ "resolved": "https://registry.npmjs.org/@synopackageland/sdk/-/sdk-0.31.1.tgz",
1157
+ "integrity": "sha512-kPkkNei2BOFeKgquzTCltmNe/UUIvfXorJ8HeTu4Nx106J37/oQsEDAxI/GMj0rUAqkqJQOfH+MxhV/hqsQEYw==",
1158
1158
  "license": "MIT",
1159
1159
  "peerDependencies": {
1160
1160
  "@lucide/vue": "^1.48.0",
1161
- "@synopackageland/ui": ">=0.10.1 <0.16.0",
1161
+ "@synopackageland/ui": ">=0.10.1 <0.17.0",
1162
1162
  "vue": "^3.5.0"
1163
1163
  },
1164
1164
  "peerDependenciesMeta": {
@@ -1171,9 +1171,9 @@
1171
1171
  }
1172
1172
  },
1173
1173
  "node_modules/@synopackageland/ui": {
1174
- "version": "0.14.10",
1175
- "resolved": "https://registry.npmjs.org/@synopackageland/ui/-/ui-0.14.10.tgz",
1176
- "integrity": "sha512-4xq1LvbBaM6HdDY2jcaQUe+nMfBdFb9GGq6ds/fsozfTrLnrZm0ZqUlmbosJuPqO8655ven2/FB0bKTnHj16mA==",
1174
+ "version": "0.16.1",
1175
+ "resolved": "https://registry.npmjs.org/@synopackageland/ui/-/ui-0.16.1.tgz",
1176
+ "integrity": "sha512-iJ5oHGatraAuGx5xUqDsShB2/G1Luo5EG9dt/KkU/zakQxNq135xucosYFrrmCu2MhwL3ZWCCHS3Cow+2GgfJQ==",
1177
1177
  "license": "MIT",
1178
1178
  "dependencies": {
1179
1179
  "@internationalized/date": "3.12.4",
@@ -8,8 +8,8 @@
8
8
  },
9
9
  "dependencies": {
10
10
  "@lucide/vue": "1.48.0",
11
- "@synopackageland/sdk": "0.30.0",
12
- "@synopackageland/ui": "0.14.10",
11
+ "@synopackageland/sdk": "0.31.1",
12
+ "@synopackageland/ui": "0.16.1",
13
13
  "vue": "3.5.43"
14
14
  },
15
15
  "devDependencies": {
@@ -49,7 +49,7 @@ backend:
49
49
  runtime: node
50
50
  dir: backend/app
51
51
  entry: main.js
52
- sdk: 0.30.0
52
+ sdk: 0.31.1
53
53
  node: { package: Node.js_v22 }
54
54
 
55
55
  ui:
@@ -47,7 +47,7 @@ backend:
47
47
  runtime: python
48
48
  dir: backend/app
49
49
  entry: main.py
50
- sdk: 0.30.0
50
+ sdk: 0.31.1
51
51
 
52
52
  ui:
53
53
  # Non-UI-SDK frontends open a full page; Portal is a separate opt-in.
@@ -104,8 +104,8 @@ dependencies = [
104
104
 
105
105
  [[package]]
106
106
  name = "syno-pkg-land-app"
107
- version = "0.30.0"
108
- source = "git+https://github.com/synopackageland/syno-pkg-land-sdk?tag=v0.30.0#30b08ee64ec8def3819c8c17765d778606c356f3"
107
+ version = "0.31.1"
108
+ source = "git+https://github.com/synopackageland/syno-pkg-land-sdk?tag=v0.31.1#3b5c5170db0b56abc02a6bf8fca31f2528935291"
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.30.0" }
12
+ syno-pkg-land-app = { git = "https://github.com/synopackageland/syno-pkg-land-sdk", tag = "v0.31.1" }
13
13
 
14
14
  [profile.release]
15
15
  # A handler panic becomes an "internal" reply; abort would end the App without one.