@objectstack/studio 9.4.0 → 9.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,4 +1,23 @@
1
1
  export { STUDIO_APP } from '@objectstack/platform-objects/apps';
2
+ import { Doc } from '@objectstack/spec/system';
3
+
4
+ /**
5
+ * Studio app overview doc (ADR-0046), registered in this package's manifest so
6
+ * it groups under "Studio" in the `/_console/docs` index.
7
+ *
8
+ * Authored inline rather than as a flat `src/docs/*.md` file because this is a
9
+ * TS-first code package built by tsup, not a user app built by `os build` —
10
+ * `defineStack({ docs })` / manifest `docs[]` is the supported path for those
11
+ * (see `DocSchema` in `@objectstack/spec/system`). The `content` below is plain
12
+ * CommonMark + GFM with no images/MDX, per ADR-0046 §3.4.
13
+ *
14
+ * Principle (from the HotCRM reference docs): document the *invisible*
15
+ * business logic, not what the Studio UI already shows on screen.
16
+ *
17
+ * `translations` carries per-locale variants (ADR-0046 i18n); the REST layer
18
+ * collapses the doc to the request's `Accept-Language` and serves one body.
19
+ */
20
+ declare const STUDIO_OVERVIEW_DOC: Doc;
2
21
 
3
22
  /**
4
23
  * `@objectstack/studio` — the Studio metadata-builder app as its own ObjectStack
@@ -49,4 +68,4 @@ declare class StudioAppPlugin {
49
68
  /** Convenience factory mirroring the rest of the plugin ecosystem. */
50
69
  declare function createStudioAppPlugin(): StudioAppPlugin;
51
70
 
52
- export { STUDIO_APP_NAMESPACE, STUDIO_APP_PACKAGE_ID, STUDIO_APP_VERSION, StudioAppPlugin, createStudioAppPlugin, studioAppManifestHeader };
71
+ export { STUDIO_APP_NAMESPACE, STUDIO_APP_PACKAGE_ID, STUDIO_APP_VERSION, STUDIO_OVERVIEW_DOC, StudioAppPlugin, createStudioAppPlugin, studioAppManifestHeader };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,23 @@
1
1
  export { STUDIO_APP } from '@objectstack/platform-objects/apps';
2
+ import { Doc } from '@objectstack/spec/system';
3
+
4
+ /**
5
+ * Studio app overview doc (ADR-0046), registered in this package's manifest so
6
+ * it groups under "Studio" in the `/_console/docs` index.
7
+ *
8
+ * Authored inline rather than as a flat `src/docs/*.md` file because this is a
9
+ * TS-first code package built by tsup, not a user app built by `os build` —
10
+ * `defineStack({ docs })` / manifest `docs[]` is the supported path for those
11
+ * (see `DocSchema` in `@objectstack/spec/system`). The `content` below is plain
12
+ * CommonMark + GFM with no images/MDX, per ADR-0046 §3.4.
13
+ *
14
+ * Principle (from the HotCRM reference docs): document the *invisible*
15
+ * business logic, not what the Studio UI already shows on screen.
16
+ *
17
+ * `translations` carries per-locale variants (ADR-0046 i18n); the REST layer
18
+ * collapses the doc to the request's `Accept-Language` and serves one body.
19
+ */
20
+ declare const STUDIO_OVERVIEW_DOC: Doc;
2
21
 
3
22
  /**
4
23
  * `@objectstack/studio` — the Studio metadata-builder app as its own ObjectStack
@@ -49,4 +68,4 @@ declare class StudioAppPlugin {
49
68
  /** Convenience factory mirroring the rest of the plugin ecosystem. */
50
69
  declare function createStudioAppPlugin(): StudioAppPlugin;
51
70
 
52
- export { STUDIO_APP_NAMESPACE, STUDIO_APP_PACKAGE_ID, STUDIO_APP_VERSION, StudioAppPlugin, createStudioAppPlugin, studioAppManifestHeader };
71
+ export { STUDIO_APP_NAMESPACE, STUDIO_APP_PACKAGE_ID, STUDIO_APP_VERSION, STUDIO_OVERVIEW_DOC, StudioAppPlugin, createStudioAppPlugin, studioAppManifestHeader };
package/dist/index.js CHANGED
@@ -2,6 +2,85 @@
2
2
 
3
3
  var apps = require('@objectstack/platform-objects/apps');
4
4
 
5
+ // src/index.ts
6
+
7
+ // src/studio-overview.doc.ts
8
+ var STUDIO_OVERVIEW_DOC = {
9
+ name: "studio_overview",
10
+ label: "Studio overview",
11
+ description: "Orientation for builders: the metadata-first model, overlay precedence, and publishing.",
12
+ content: `# Studio overview
13
+
14
+ Studio is the builder app \u2014 the workbench for shaping the platform's
15
+ *metadata*: objects, fields, views, flows, agents, and the rest. Most of its
16
+ screens are self-explanatory; this page covers the one rule that is not visible
17
+ on screen but governs everything you do here. For the full reference, see
18
+ <https://docs.objectstack.ai>.
19
+
20
+ ## Metadata-first
21
+
22
+ In Studio you do not edit a running database \u2014 you edit *definitions*. Every
23
+ object, field, and view is a metadata record, and the live application is
24
+ generated from that metadata. This is why a change in Studio can reshape the UI
25
+ and the API at once: you are changing the model, not patching a screen.
26
+
27
+ ## Edits are overlays (the invisible rule)
28
+
29
+ Your changes do not mutate the metadata shipped by a package in place. Studio
30
+ writes an **overlay** on top of the base definition, and the runtime resolves
31
+ the two by precedence: an unpublished **draft** wins for you while you work, a
32
+ published **tenant overlay** wins over the package's baseline, and the package
33
+ baseline is the fallback (ADR-0005, ADR-0033). The practical consequence: the
34
+ base definition is never destroyed, so an overlay can always be reverted to
35
+ recover the original \u2014 and a field that "won't change" is usually being shadowed
36
+ by a higher-precedence layer.
37
+
38
+ ## Publishing & deploying
39
+
40
+ A draft is visible only to you until you **publish** it, which promotes the
41
+ overlay so the rest of the tenant sees it. Moving changes between environments
42
+ (for example dev \u2192 production) is a separate **deploy** step, not an automatic
43
+ side effect of publishing \u2014 keeping the two distinct is what lets you build
44
+ safely in one environment before shipping.
45
+
46
+ See <https://docs.objectstack.ai> for drafts, overlays, and deployment in depth.
47
+ `,
48
+ translations: {
49
+ zh: {
50
+ label: "Studio \u6982\u89C8",
51
+ description: "\u642D\u5EFA\u8005\u5165\u95E8:\u5143\u6570\u636E\u4F18\u5148\u6A21\u578B\u3001\u8986\u76D6\u5C42\u4F18\u5148\u7EA7\u3001\u53D1\u5E03\u4E0E\u90E8\u7F72\u3002",
52
+ content: `# Studio \u6982\u89C8
53
+
54
+ Studio \u662F\u642D\u5EFA\u8005\u5E94\u7528\u2014\u2014\u5851\u9020\u5E73\u53F0*\u5143\u6570\u636E*\u7684\u5DE5\u4F5C\u53F0:\u5BF9\u8C61\u3001\u5B57\u6BB5\u3001\u89C6\u56FE\u3001\u6D41\u7A0B\u3001\u667A\u80FD\u4F53\u7B49\u3002
55
+ \u5B83\u7684\u5927\u591A\u6570\u754C\u9762\u4E00\u76EE\u4E86\u7136;\u672C\u9875\u8BB2\u7684\u662F\u90A3\u6761\u754C\u9762\u4E0A\u770B\u4E0D\u89C1\u3001\u5374\u652F\u914D\u4F60\u5728\u8FD9\u91CC\u4E00\u5207\u64CD\u4F5C\u7684\u89C4\u5219\u3002
56
+ \u5B8C\u6574\u53C2\u8003\u89C1 <https://docs.objectstack.ai>\u3002
57
+
58
+ ## \u5143\u6570\u636E\u4F18\u5148
59
+
60
+ \u5728 Studio \u91CC\u4F60\u7F16\u8F91\u7684\u4E0D\u662F\u8FD0\u884C\u4E2D\u7684\u6570\u636E\u5E93,\u800C\u662F*\u5B9A\u4E49*\u3002\u6BCF\u4E2A\u5BF9\u8C61\u3001\u5B57\u6BB5\u3001\u89C6\u56FE\u90FD\u662F\u4E00\u6761
61
+ \u5143\u6570\u636E\u8BB0\u5F55,\u8FD0\u884C\u7684\u5E94\u7528\u7531\u8FD9\u4E9B\u5143\u6570\u636E\u751F\u6210\u3002\u8FD9\u5C31\u662F\u4E3A\u4EC0\u4E48 Studio \u91CC\u7684\u4E00\u5904\u6539\u52A8\u80FD\u540C\u65F6\u91CD\u5851
62
+ UI \u548C API:\u4F60\u6539\u7684\u662F\u6A21\u578B,\u800C\u4E0D\u662F\u4FEE\u8865\u67D0\u4E2A\u754C\u9762\u3002
63
+
64
+ ## \u7F16\u8F91\u5373\u8986\u76D6\u5C42(\u770B\u4E0D\u89C1\u7684\u89C4\u5219)
65
+
66
+ \u4F60\u7684\u6539\u52A8\u4E0D\u4F1A\u539F\u5730\u4FEE\u6539\u67D0\u4E2A\u5305\u53D1\u5E03\u7684\u5143\u6570\u636E\u3002Studio \u5728\u57FA\u7840\u5B9A\u4E49\u4E4B\u4E0A\u5199\u4E00\u5C42**\u8986\u76D6\u5C42**,
67
+ \u8FD0\u884C\u65F6\u6309\u4F18\u5148\u7EA7\u89E3\u6790\u4E24\u8005:\u672A\u53D1\u5E03\u7684**\u8349\u7A3F**\u5728\u4F60\u7F16\u8F91\u65F6\u5BF9\u4F60\u751F\u6548,\u5DF2\u53D1\u5E03\u7684**\u79DF\u6237\u8986\u76D6\u5C42**
68
+ \u4F18\u5148\u4E8E\u5305\u7684\u57FA\u7EBF,\u5305\u57FA\u7EBF\u5219\u662F\u515C\u5E95(ADR-0005\u3001ADR-0033)\u3002\u5B9E\u9645\u540E\u679C:\u57FA\u7840\u5B9A\u4E49\u6C38\u4E0D\u88AB
69
+ \u9500\u6BC1,\u6240\u4EE5\u8986\u76D6\u5C42\u603B\u80FD\u56DE\u9000\u4EE5\u6062\u590D\u539F\u6837\u2014\u2014\u800C\u4E00\u4E2A"\u6539\u4E0D\u52A8"\u7684\u5B57\u6BB5,\u901A\u5E38\u662F\u88AB\u66F4\u9AD8\u4F18\u5148\u7EA7\u7684
70
+ \u5C42\u906E\u4F4F\u4E86\u3002
71
+
72
+ ## \u53D1\u5E03\u4E0E\u90E8\u7F72
73
+
74
+ \u8349\u7A3F\u53EA\u5BF9\u4F60\u81EA\u5DF1\u53EF\u89C1,\u76F4\u5230\u4F60**\u53D1\u5E03**\u5B83,\u628A\u8986\u76D6\u5C42\u63D0\u5347\u7ED9\u6574\u4E2A\u79DF\u6237\u770B\u5230\u3002\u5728\u73AF\u5883\u4E4B\u95F4\u642C\u8FD0
75
+ \u6539\u52A8(\u4F8B\u5982\u5F00\u53D1 \u2192 \u751F\u4EA7)\u662F\u5355\u72EC\u7684**\u90E8\u7F72**\u6B65\u9AA4,\u4E0D\u662F\u53D1\u5E03\u7684\u81EA\u52A8\u526F\u4F5C\u7528\u2014\u2014\u628A\u4E24\u8005\u5206\u5F00,
76
+ \u624D\u80FD\u8BA9\u4F60\u5728\u4E00\u4E2A\u73AF\u5883\u91CC\u5B89\u5168\u642D\u5EFA\u3001\u518D\u4E0A\u7EBF\u3002
77
+
78
+ \u8349\u7A3F\u3001\u8986\u76D6\u5C42\u4E0E\u90E8\u7F72\u7684\u7EC6\u8282\u89C1 <https://docs.objectstack.ai>\u3002
79
+ `
80
+ }
81
+ }
82
+ };
83
+
5
84
  // src/index.ts
6
85
  var STUDIO_APP_PACKAGE_ID = "com.objectstack.studio";
7
86
  var STUDIO_APP_NAMESPACE = "studio";
@@ -32,7 +111,12 @@ var StudioAppPlugin = class {
32
111
  async start(ctx) {
33
112
  const manifest = ctx?.getService?.("manifest");
34
113
  if (!manifest || typeof manifest.register !== "function") return;
35
- manifest.register({ ...studioAppManifestHeader, apps: [apps.STUDIO_APP] });
114
+ manifest.register({
115
+ ...studioAppManifestHeader,
116
+ apps: [apps.STUDIO_APP],
117
+ // ADR-0046 package docs — grouped under "Studio" at /_console/docs.
118
+ docs: [STUDIO_OVERVIEW_DOC]
119
+ });
36
120
  }
37
121
  };
38
122
  function createStudioAppPlugin() {
@@ -46,6 +130,7 @@ Object.defineProperty(exports, "STUDIO_APP", {
46
130
  exports.STUDIO_APP_NAMESPACE = STUDIO_APP_NAMESPACE;
47
131
  exports.STUDIO_APP_PACKAGE_ID = STUDIO_APP_PACKAGE_ID;
48
132
  exports.STUDIO_APP_VERSION = STUDIO_APP_VERSION;
133
+ exports.STUDIO_OVERVIEW_DOC = STUDIO_OVERVIEW_DOC;
49
134
  exports.StudioAppPlugin = StudioAppPlugin;
50
135
  exports.createStudioAppPlugin = createStudioAppPlugin;
51
136
  exports.studioAppManifestHeader = studioAppManifestHeader;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["STUDIO_APP"],"mappings":";;;;;AAuBO,IAAM,qBAAA,GAAwB;AAC9B,IAAM,oBAAA,GAAuB;AAC7B,IAAM,kBAAA,GAAqB;AAG3B,IAAM,uBAAA,GAA0B;AAAA,EACrC,EAAA,EAAI,qBAAA;AAAA,EACJ,SAAA,EAAW,oBAAA;AAAA,EACX,OAAA,EAAS,kBAAA;AAAA,EACT,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,QAAA;AAAA,EACP,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,EAAa,iDAAA;AAAA;AAAA;AAAA,EAGb,YAAA,EAAc,CAAC,6BAA6B;AAC9C;AAOO,IAAM,kBAAN,MAAsB;AAAA,EAAtB,WAAA,GAAA;AACL,IAAA,IAAA,CAAS,IAAA,GAAO,qBAAA;AAChB,IAAA,IAAA,CAAS,IAAA,GAAO,UAAA;AAChB,IAAA,IAAA,CAAS,OAAA,GAAU,kBAAA;AAGnB;AAAA;AAAA,IAAA,IAAA,CAAS,YAAA,GAAyB,CAAC,sBAAsB,CAAA;AAAA,EAAA;AAAA,EAEzD,MAAM,KAAK,IAAA,EAA0B;AAAA,EAErC;AAAA,EAEA,MAAM,MAAM,GAAA,EAAyB;AACnC,IAAA,MAAM,QAAA,GAAW,GAAA,EAAK,UAAA,GAAa,UAAU,CAAA;AAC7C,IAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,CAAS,aAAa,UAAA,EAAY;AAC1D,IAAA,QAAA,CAAS,QAAA,CAAS,EAAE,GAAG,uBAAA,EAAyB,MAAM,CAACA,eAAU,GAAG,CAAA;AAAA,EACtE;AACF;AAGO,SAAS,qBAAA,GAAyC;AACvD,EAAA,OAAO,IAAI,eAAA,EAAgB;AAC7B","file":"index.js","sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * `@objectstack/studio` — the Studio metadata-builder app as its own ObjectStack\n * package (ADR-0048: one app per package).\n *\n * Studio is a console navigation-shell app (an `AppSchema`), not a kernel\n * extension — but it still needs a thin registration entry to publish its\n * manifest into the running kernel, mirroring how `@objectstack/plugin-auth`\n * registers its own manifest. Giving it a distinct package id\n * (`com.objectstack.studio`) is what lets `/apps/<packageId>` resolve to exactly\n * this app instead of being ambiguous inside a multi-app package.\n *\n * NOTE (transitional): the `STUDIO_APP` schema is still imported from\n * `@objectstack/platform-objects/apps`; a follow-up moves the definition into\n * this package and drops the dependency. This package is intentionally NOT yet\n * wired into the dev/serve plugin set — that boot-path switch (and removing the\n * app from plugin-auth's manifest) lands separately so it can be verified\n * against a live `os dev` boot.\n */\n\nimport { STUDIO_APP } from '@objectstack/platform-objects/apps';\n\nexport const STUDIO_APP_PACKAGE_ID = 'com.objectstack.studio';\nexport const STUDIO_APP_NAMESPACE = 'studio';\nexport const STUDIO_APP_VERSION = '9.3.0';\n\n/** Manifest header for the Studio app package. */\nexport const studioAppManifestHeader = {\n id: STUDIO_APP_PACKAGE_ID,\n namespace: STUDIO_APP_NAMESPACE,\n version: STUDIO_APP_VERSION,\n type: 'plugin' as const,\n scope: 'system' as const,\n name: 'Studio',\n description: 'ObjectStack Studio — metadata builder app.',\n // Studio navigates platform metadata owned by plugin-auth; declare the\n // dependency so it loads after the auth objects are registered.\n dependencies: ['com.objectstack.plugin-auth'],\n};\n\n/**\n * Thin plugin that registers the Studio app manifest. Structurally typed\n * against the kernel `Plugin` contract (no compile-time kernel dependency),\n * exactly like `AuthPlugin`.\n */\nexport class StudioAppPlugin {\n readonly name = STUDIO_APP_PACKAGE_ID;\n readonly type = 'standard';\n readonly version = STUDIO_APP_VERSION;\n // Kernel plugin dependency is matched by plugin NAME (AuthPlugin.name =\n // 'com.objectstack.auth'), not by package id.\n readonly dependencies: string[] = ['com.objectstack.auth'];\n\n async init(_ctx: any): Promise<void> {\n // No-op: registration happens in start() once the manifest service exists.\n }\n\n async start(ctx: any): Promise<void> {\n const manifest = ctx?.getService?.('manifest');\n if (!manifest || typeof manifest.register !== 'function') return;\n manifest.register({ ...studioAppManifestHeader, apps: [STUDIO_APP] });\n }\n}\n\n/** Convenience factory mirroring the rest of the plugin ecosystem. */\nexport function createStudioAppPlugin(): StudioAppPlugin {\n return new StudioAppPlugin();\n}\n\nexport { STUDIO_APP };\n"]}
1
+ {"version":3,"sources":["../src/studio-overview.doc.ts","../src/index.ts"],"names":["STUDIO_APP"],"mappings":";;;;;;;AAoBO,IAAM,mBAAA,GAA2B;AAAA,EACtC,IAAA,EAAM,iBAAA;AAAA,EACN,KAAA,EAAO,iBAAA;AAAA,EACP,WAAA,EAAa,yFAAA;AAAA,EACb,OAAA,EAAS,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAAA,EAoCT,YAAA,EAAc;AAAA,IACZ,EAAA,EAAI;AAAA,MACF,KAAA,EAAO,qBAAA;AAAA,MACP,WAAA,EAAa,+JAAA;AAAA,MACb,OAAA,EAAS,CAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AA4BX;AAEJ;;;ACrEO,IAAM,qBAAA,GAAwB;AAC9B,IAAM,oBAAA,GAAuB;AAC7B,IAAM,kBAAA,GAAqB;AAG3B,IAAM,uBAAA,GAA0B;AAAA,EACrC,EAAA,EAAI,qBAAA;AAAA,EACJ,SAAA,EAAW,oBAAA;AAAA,EACX,OAAA,EAAS,kBAAA;AAAA,EACT,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,QAAA;AAAA,EACP,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,EAAa,iDAAA;AAAA;AAAA;AAAA,EAGb,YAAA,EAAc,CAAC,6BAA6B;AAC9C;AAOO,IAAM,kBAAN,MAAsB;AAAA,EAAtB,WAAA,GAAA;AACL,IAAA,IAAA,CAAS,IAAA,GAAO,qBAAA;AAChB,IAAA,IAAA,CAAS,IAAA,GAAO,UAAA;AAChB,IAAA,IAAA,CAAS,OAAA,GAAU,kBAAA;AAGnB;AAAA;AAAA,IAAA,IAAA,CAAS,YAAA,GAAyB,CAAC,sBAAsB,CAAA;AAAA,EAAA;AAAA,EAEzD,MAAM,KAAK,IAAA,EAA0B;AAAA,EAErC;AAAA,EAEA,MAAM,MAAM,GAAA,EAAyB;AACnC,IAAA,MAAM,QAAA,GAAW,GAAA,EAAK,UAAA,GAAa,UAAU,CAAA;AAC7C,IAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,CAAS,aAAa,UAAA,EAAY;AAC1D,IAAA,QAAA,CAAS,QAAA,CAAS;AAAA,MAChB,GAAG,uBAAA;AAAA,MACH,IAAA,EAAM,CAACA,eAAU,CAAA;AAAA;AAAA,MAEjB,IAAA,EAAM,CAAC,mBAAmB;AAAA,KAC3B,CAAA;AAAA,EACH;AACF;AAGO,SAAS,qBAAA,GAAyC;AACvD,EAAA,OAAO,IAAI,eAAA,EAAgB;AAC7B","file":"index.js","sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport type { Doc } from '@objectstack/spec/system';\n\n/**\n * Studio app overview doc (ADR-0046), registered in this package's manifest so\n * it groups under \"Studio\" in the `/_console/docs` index.\n *\n * Authored inline rather than as a flat `src/docs/*.md` file because this is a\n * TS-first code package built by tsup, not a user app built by `os build` —\n * `defineStack({ docs })` / manifest `docs[]` is the supported path for those\n * (see `DocSchema` in `@objectstack/spec/system`). The `content` below is plain\n * CommonMark + GFM with no images/MDX, per ADR-0046 §3.4.\n *\n * Principle (from the HotCRM reference docs): document the *invisible*\n * business logic, not what the Studio UI already shows on screen.\n *\n * `translations` carries per-locale variants (ADR-0046 i18n); the REST layer\n * collapses the doc to the request's `Accept-Language` and serves one body.\n */\nexport const STUDIO_OVERVIEW_DOC: Doc = {\n name: 'studio_overview',\n label: 'Studio overview',\n description: 'Orientation for builders: the metadata-first model, overlay precedence, and publishing.',\n content: `# Studio overview\n\nStudio is the builder app — the workbench for shaping the platform's\n*metadata*: objects, fields, views, flows, agents, and the rest. Most of its\nscreens are self-explanatory; this page covers the one rule that is not visible\non screen but governs everything you do here. For the full reference, see\n<https://docs.objectstack.ai>.\n\n## Metadata-first\n\nIn Studio you do not edit a running database — you edit *definitions*. Every\nobject, field, and view is a metadata record, and the live application is\ngenerated from that metadata. This is why a change in Studio can reshape the UI\nand the API at once: you are changing the model, not patching a screen.\n\n## Edits are overlays (the invisible rule)\n\nYour changes do not mutate the metadata shipped by a package in place. Studio\nwrites an **overlay** on top of the base definition, and the runtime resolves\nthe two by precedence: an unpublished **draft** wins for you while you work, a\npublished **tenant overlay** wins over the package's baseline, and the package\nbaseline is the fallback (ADR-0005, ADR-0033). The practical consequence: the\nbase definition is never destroyed, so an overlay can always be reverted to\nrecover the original — and a field that \"won't change\" is usually being shadowed\nby a higher-precedence layer.\n\n## Publishing & deploying\n\nA draft is visible only to you until you **publish** it, which promotes the\noverlay so the rest of the tenant sees it. Moving changes between environments\n(for example dev → production) is a separate **deploy** step, not an automatic\nside effect of publishing — keeping the two distinct is what lets you build\nsafely in one environment before shipping.\n\nSee <https://docs.objectstack.ai> for drafts, overlays, and deployment in depth.\n`,\n translations: {\n zh: {\n label: 'Studio 概览',\n description: '搭建者入门:元数据优先模型、覆盖层优先级、发布与部署。',\n content: `# Studio 概览\n\nStudio 是搭建者应用——塑造平台*元数据*的工作台:对象、字段、视图、流程、智能体等。\n它的大多数界面一目了然;本页讲的是那条界面上看不见、却支配你在这里一切操作的规则。\n完整参考见 <https://docs.objectstack.ai>。\n\n## 元数据优先\n\n在 Studio 里你编辑的不是运行中的数据库,而是*定义*。每个对象、字段、视图都是一条\n元数据记录,运行的应用由这些元数据生成。这就是为什么 Studio 里的一处改动能同时重塑\nUI 和 API:你改的是模型,而不是修补某个界面。\n\n## 编辑即覆盖层(看不见的规则)\n\n你的改动不会原地修改某个包发布的元数据。Studio 在基础定义之上写一层**覆盖层**,\n运行时按优先级解析两者:未发布的**草稿**在你编辑时对你生效,已发布的**租户覆盖层**\n优先于包的基线,包基线则是兜底(ADR-0005、ADR-0033)。实际后果:基础定义永不被\n销毁,所以覆盖层总能回退以恢复原样——而一个\"改不动\"的字段,通常是被更高优先级的\n层遮住了。\n\n## 发布与部署\n\n草稿只对你自己可见,直到你**发布**它,把覆盖层提升给整个租户看到。在环境之间搬运\n改动(例如开发 → 生产)是单独的**部署**步骤,不是发布的自动副作用——把两者分开,\n才能让你在一个环境里安全搭建、再上线。\n\n草稿、覆盖层与部署的细节见 <https://docs.objectstack.ai>。\n`,\n },\n },\n};\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * `@objectstack/studio` — the Studio metadata-builder app as its own ObjectStack\n * package (ADR-0048: one app per package).\n *\n * Studio is a console navigation-shell app (an `AppSchema`), not a kernel\n * extension — but it still needs a thin registration entry to publish its\n * manifest into the running kernel, mirroring how `@objectstack/plugin-auth`\n * registers its own manifest. Giving it a distinct package id\n * (`com.objectstack.studio`) is what lets `/apps/<packageId>` resolve to exactly\n * this app instead of being ambiguous inside a multi-app package.\n *\n * NOTE (transitional): the `STUDIO_APP` schema is still imported from\n * `@objectstack/platform-objects/apps`; a follow-up moves the definition into\n * this package and drops the dependency. This package is intentionally NOT yet\n * wired into the dev/serve plugin set — that boot-path switch (and removing the\n * app from plugin-auth's manifest) lands separately so it can be verified\n * against a live `os dev` boot.\n */\n\nimport { STUDIO_APP } from '@objectstack/platform-objects/apps';\n\nimport { STUDIO_OVERVIEW_DOC } from './studio-overview.doc.js';\n\nexport const STUDIO_APP_PACKAGE_ID = 'com.objectstack.studio';\nexport const STUDIO_APP_NAMESPACE = 'studio';\nexport const STUDIO_APP_VERSION = '9.3.0';\n\n/** Manifest header for the Studio app package. */\nexport const studioAppManifestHeader = {\n id: STUDIO_APP_PACKAGE_ID,\n namespace: STUDIO_APP_NAMESPACE,\n version: STUDIO_APP_VERSION,\n type: 'plugin' as const,\n scope: 'system' as const,\n name: 'Studio',\n description: 'ObjectStack Studio — metadata builder app.',\n // Studio navigates platform metadata owned by plugin-auth; declare the\n // dependency so it loads after the auth objects are registered.\n dependencies: ['com.objectstack.plugin-auth'],\n};\n\n/**\n * Thin plugin that registers the Studio app manifest. Structurally typed\n * against the kernel `Plugin` contract (no compile-time kernel dependency),\n * exactly like `AuthPlugin`.\n */\nexport class StudioAppPlugin {\n readonly name = STUDIO_APP_PACKAGE_ID;\n readonly type = 'standard';\n readonly version = STUDIO_APP_VERSION;\n // Kernel plugin dependency is matched by plugin NAME (AuthPlugin.name =\n // 'com.objectstack.auth'), not by package id.\n readonly dependencies: string[] = ['com.objectstack.auth'];\n\n async init(_ctx: any): Promise<void> {\n // No-op: registration happens in start() once the manifest service exists.\n }\n\n async start(ctx: any): Promise<void> {\n const manifest = ctx?.getService?.('manifest');\n if (!manifest || typeof manifest.register !== 'function') return;\n manifest.register({\n ...studioAppManifestHeader,\n apps: [STUDIO_APP],\n // ADR-0046 package docs — grouped under \"Studio\" at /_console/docs.\n docs: [STUDIO_OVERVIEW_DOC],\n });\n }\n}\n\n/** Convenience factory mirroring the rest of the plugin ecosystem. */\nexport function createStudioAppPlugin(): StudioAppPlugin {\n return new StudioAppPlugin();\n}\n\nexport { STUDIO_APP };\nexport { STUDIO_OVERVIEW_DOC };\n"]}
package/dist/index.mjs CHANGED
@@ -1,6 +1,85 @@
1
1
  import { STUDIO_APP } from '@objectstack/platform-objects/apps';
2
2
  export { STUDIO_APP } from '@objectstack/platform-objects/apps';
3
3
 
4
+ // src/index.ts
5
+
6
+ // src/studio-overview.doc.ts
7
+ var STUDIO_OVERVIEW_DOC = {
8
+ name: "studio_overview",
9
+ label: "Studio overview",
10
+ description: "Orientation for builders: the metadata-first model, overlay precedence, and publishing.",
11
+ content: `# Studio overview
12
+
13
+ Studio is the builder app \u2014 the workbench for shaping the platform's
14
+ *metadata*: objects, fields, views, flows, agents, and the rest. Most of its
15
+ screens are self-explanatory; this page covers the one rule that is not visible
16
+ on screen but governs everything you do here. For the full reference, see
17
+ <https://docs.objectstack.ai>.
18
+
19
+ ## Metadata-first
20
+
21
+ In Studio you do not edit a running database \u2014 you edit *definitions*. Every
22
+ object, field, and view is a metadata record, and the live application is
23
+ generated from that metadata. This is why a change in Studio can reshape the UI
24
+ and the API at once: you are changing the model, not patching a screen.
25
+
26
+ ## Edits are overlays (the invisible rule)
27
+
28
+ Your changes do not mutate the metadata shipped by a package in place. Studio
29
+ writes an **overlay** on top of the base definition, and the runtime resolves
30
+ the two by precedence: an unpublished **draft** wins for you while you work, a
31
+ published **tenant overlay** wins over the package's baseline, and the package
32
+ baseline is the fallback (ADR-0005, ADR-0033). The practical consequence: the
33
+ base definition is never destroyed, so an overlay can always be reverted to
34
+ recover the original \u2014 and a field that "won't change" is usually being shadowed
35
+ by a higher-precedence layer.
36
+
37
+ ## Publishing & deploying
38
+
39
+ A draft is visible only to you until you **publish** it, which promotes the
40
+ overlay so the rest of the tenant sees it. Moving changes between environments
41
+ (for example dev \u2192 production) is a separate **deploy** step, not an automatic
42
+ side effect of publishing \u2014 keeping the two distinct is what lets you build
43
+ safely in one environment before shipping.
44
+
45
+ See <https://docs.objectstack.ai> for drafts, overlays, and deployment in depth.
46
+ `,
47
+ translations: {
48
+ zh: {
49
+ label: "Studio \u6982\u89C8",
50
+ description: "\u642D\u5EFA\u8005\u5165\u95E8:\u5143\u6570\u636E\u4F18\u5148\u6A21\u578B\u3001\u8986\u76D6\u5C42\u4F18\u5148\u7EA7\u3001\u53D1\u5E03\u4E0E\u90E8\u7F72\u3002",
51
+ content: `# Studio \u6982\u89C8
52
+
53
+ Studio \u662F\u642D\u5EFA\u8005\u5E94\u7528\u2014\u2014\u5851\u9020\u5E73\u53F0*\u5143\u6570\u636E*\u7684\u5DE5\u4F5C\u53F0:\u5BF9\u8C61\u3001\u5B57\u6BB5\u3001\u89C6\u56FE\u3001\u6D41\u7A0B\u3001\u667A\u80FD\u4F53\u7B49\u3002
54
+ \u5B83\u7684\u5927\u591A\u6570\u754C\u9762\u4E00\u76EE\u4E86\u7136;\u672C\u9875\u8BB2\u7684\u662F\u90A3\u6761\u754C\u9762\u4E0A\u770B\u4E0D\u89C1\u3001\u5374\u652F\u914D\u4F60\u5728\u8FD9\u91CC\u4E00\u5207\u64CD\u4F5C\u7684\u89C4\u5219\u3002
55
+ \u5B8C\u6574\u53C2\u8003\u89C1 <https://docs.objectstack.ai>\u3002
56
+
57
+ ## \u5143\u6570\u636E\u4F18\u5148
58
+
59
+ \u5728 Studio \u91CC\u4F60\u7F16\u8F91\u7684\u4E0D\u662F\u8FD0\u884C\u4E2D\u7684\u6570\u636E\u5E93,\u800C\u662F*\u5B9A\u4E49*\u3002\u6BCF\u4E2A\u5BF9\u8C61\u3001\u5B57\u6BB5\u3001\u89C6\u56FE\u90FD\u662F\u4E00\u6761
60
+ \u5143\u6570\u636E\u8BB0\u5F55,\u8FD0\u884C\u7684\u5E94\u7528\u7531\u8FD9\u4E9B\u5143\u6570\u636E\u751F\u6210\u3002\u8FD9\u5C31\u662F\u4E3A\u4EC0\u4E48 Studio \u91CC\u7684\u4E00\u5904\u6539\u52A8\u80FD\u540C\u65F6\u91CD\u5851
61
+ UI \u548C API:\u4F60\u6539\u7684\u662F\u6A21\u578B,\u800C\u4E0D\u662F\u4FEE\u8865\u67D0\u4E2A\u754C\u9762\u3002
62
+
63
+ ## \u7F16\u8F91\u5373\u8986\u76D6\u5C42(\u770B\u4E0D\u89C1\u7684\u89C4\u5219)
64
+
65
+ \u4F60\u7684\u6539\u52A8\u4E0D\u4F1A\u539F\u5730\u4FEE\u6539\u67D0\u4E2A\u5305\u53D1\u5E03\u7684\u5143\u6570\u636E\u3002Studio \u5728\u57FA\u7840\u5B9A\u4E49\u4E4B\u4E0A\u5199\u4E00\u5C42**\u8986\u76D6\u5C42**,
66
+ \u8FD0\u884C\u65F6\u6309\u4F18\u5148\u7EA7\u89E3\u6790\u4E24\u8005:\u672A\u53D1\u5E03\u7684**\u8349\u7A3F**\u5728\u4F60\u7F16\u8F91\u65F6\u5BF9\u4F60\u751F\u6548,\u5DF2\u53D1\u5E03\u7684**\u79DF\u6237\u8986\u76D6\u5C42**
67
+ \u4F18\u5148\u4E8E\u5305\u7684\u57FA\u7EBF,\u5305\u57FA\u7EBF\u5219\u662F\u515C\u5E95(ADR-0005\u3001ADR-0033)\u3002\u5B9E\u9645\u540E\u679C:\u57FA\u7840\u5B9A\u4E49\u6C38\u4E0D\u88AB
68
+ \u9500\u6BC1,\u6240\u4EE5\u8986\u76D6\u5C42\u603B\u80FD\u56DE\u9000\u4EE5\u6062\u590D\u539F\u6837\u2014\u2014\u800C\u4E00\u4E2A"\u6539\u4E0D\u52A8"\u7684\u5B57\u6BB5,\u901A\u5E38\u662F\u88AB\u66F4\u9AD8\u4F18\u5148\u7EA7\u7684
69
+ \u5C42\u906E\u4F4F\u4E86\u3002
70
+
71
+ ## \u53D1\u5E03\u4E0E\u90E8\u7F72
72
+
73
+ \u8349\u7A3F\u53EA\u5BF9\u4F60\u81EA\u5DF1\u53EF\u89C1,\u76F4\u5230\u4F60**\u53D1\u5E03**\u5B83,\u628A\u8986\u76D6\u5C42\u63D0\u5347\u7ED9\u6574\u4E2A\u79DF\u6237\u770B\u5230\u3002\u5728\u73AF\u5883\u4E4B\u95F4\u642C\u8FD0
74
+ \u6539\u52A8(\u4F8B\u5982\u5F00\u53D1 \u2192 \u751F\u4EA7)\u662F\u5355\u72EC\u7684**\u90E8\u7F72**\u6B65\u9AA4,\u4E0D\u662F\u53D1\u5E03\u7684\u81EA\u52A8\u526F\u4F5C\u7528\u2014\u2014\u628A\u4E24\u8005\u5206\u5F00,
75
+ \u624D\u80FD\u8BA9\u4F60\u5728\u4E00\u4E2A\u73AF\u5883\u91CC\u5B89\u5168\u642D\u5EFA\u3001\u518D\u4E0A\u7EBF\u3002
76
+
77
+ \u8349\u7A3F\u3001\u8986\u76D6\u5C42\u4E0E\u90E8\u7F72\u7684\u7EC6\u8282\u89C1 <https://docs.objectstack.ai>\u3002
78
+ `
79
+ }
80
+ }
81
+ };
82
+
4
83
  // src/index.ts
5
84
  var STUDIO_APP_PACKAGE_ID = "com.objectstack.studio";
6
85
  var STUDIO_APP_NAMESPACE = "studio";
@@ -31,13 +110,18 @@ var StudioAppPlugin = class {
31
110
  async start(ctx) {
32
111
  const manifest = ctx?.getService?.("manifest");
33
112
  if (!manifest || typeof manifest.register !== "function") return;
34
- manifest.register({ ...studioAppManifestHeader, apps: [STUDIO_APP] });
113
+ manifest.register({
114
+ ...studioAppManifestHeader,
115
+ apps: [STUDIO_APP],
116
+ // ADR-0046 package docs — grouped under "Studio" at /_console/docs.
117
+ docs: [STUDIO_OVERVIEW_DOC]
118
+ });
35
119
  }
36
120
  };
37
121
  function createStudioAppPlugin() {
38
122
  return new StudioAppPlugin();
39
123
  }
40
124
 
41
- export { STUDIO_APP_NAMESPACE, STUDIO_APP_PACKAGE_ID, STUDIO_APP_VERSION, StudioAppPlugin, createStudioAppPlugin, studioAppManifestHeader };
125
+ export { STUDIO_APP_NAMESPACE, STUDIO_APP_PACKAGE_ID, STUDIO_APP_VERSION, STUDIO_OVERVIEW_DOC, StudioAppPlugin, createStudioAppPlugin, studioAppManifestHeader };
42
126
  //# sourceMappingURL=index.mjs.map
43
127
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;AAuBO,IAAM,qBAAA,GAAwB;AAC9B,IAAM,oBAAA,GAAuB;AAC7B,IAAM,kBAAA,GAAqB;AAG3B,IAAM,uBAAA,GAA0B;AAAA,EACrC,EAAA,EAAI,qBAAA;AAAA,EACJ,SAAA,EAAW,oBAAA;AAAA,EACX,OAAA,EAAS,kBAAA;AAAA,EACT,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,QAAA;AAAA,EACP,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,EAAa,iDAAA;AAAA;AAAA;AAAA,EAGb,YAAA,EAAc,CAAC,6BAA6B;AAC9C;AAOO,IAAM,kBAAN,MAAsB;AAAA,EAAtB,WAAA,GAAA;AACL,IAAA,IAAA,CAAS,IAAA,GAAO,qBAAA;AAChB,IAAA,IAAA,CAAS,IAAA,GAAO,UAAA;AAChB,IAAA,IAAA,CAAS,OAAA,GAAU,kBAAA;AAGnB;AAAA;AAAA,IAAA,IAAA,CAAS,YAAA,GAAyB,CAAC,sBAAsB,CAAA;AAAA,EAAA;AAAA,EAEzD,MAAM,KAAK,IAAA,EAA0B;AAAA,EAErC;AAAA,EAEA,MAAM,MAAM,GAAA,EAAyB;AACnC,IAAA,MAAM,QAAA,GAAW,GAAA,EAAK,UAAA,GAAa,UAAU,CAAA;AAC7C,IAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,CAAS,aAAa,UAAA,EAAY;AAC1D,IAAA,QAAA,CAAS,QAAA,CAAS,EAAE,GAAG,uBAAA,EAAyB,MAAM,CAAC,UAAU,GAAG,CAAA;AAAA,EACtE;AACF;AAGO,SAAS,qBAAA,GAAyC;AACvD,EAAA,OAAO,IAAI,eAAA,EAAgB;AAC7B","file":"index.mjs","sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * `@objectstack/studio` — the Studio metadata-builder app as its own ObjectStack\n * package (ADR-0048: one app per package).\n *\n * Studio is a console navigation-shell app (an `AppSchema`), not a kernel\n * extension — but it still needs a thin registration entry to publish its\n * manifest into the running kernel, mirroring how `@objectstack/plugin-auth`\n * registers its own manifest. Giving it a distinct package id\n * (`com.objectstack.studio`) is what lets `/apps/<packageId>` resolve to exactly\n * this app instead of being ambiguous inside a multi-app package.\n *\n * NOTE (transitional): the `STUDIO_APP` schema is still imported from\n * `@objectstack/platform-objects/apps`; a follow-up moves the definition into\n * this package and drops the dependency. This package is intentionally NOT yet\n * wired into the dev/serve plugin set — that boot-path switch (and removing the\n * app from plugin-auth's manifest) lands separately so it can be verified\n * against a live `os dev` boot.\n */\n\nimport { STUDIO_APP } from '@objectstack/platform-objects/apps';\n\nexport const STUDIO_APP_PACKAGE_ID = 'com.objectstack.studio';\nexport const STUDIO_APP_NAMESPACE = 'studio';\nexport const STUDIO_APP_VERSION = '9.3.0';\n\n/** Manifest header for the Studio app package. */\nexport const studioAppManifestHeader = {\n id: STUDIO_APP_PACKAGE_ID,\n namespace: STUDIO_APP_NAMESPACE,\n version: STUDIO_APP_VERSION,\n type: 'plugin' as const,\n scope: 'system' as const,\n name: 'Studio',\n description: 'ObjectStack Studio — metadata builder app.',\n // Studio navigates platform metadata owned by plugin-auth; declare the\n // dependency so it loads after the auth objects are registered.\n dependencies: ['com.objectstack.plugin-auth'],\n};\n\n/**\n * Thin plugin that registers the Studio app manifest. Structurally typed\n * against the kernel `Plugin` contract (no compile-time kernel dependency),\n * exactly like `AuthPlugin`.\n */\nexport class StudioAppPlugin {\n readonly name = STUDIO_APP_PACKAGE_ID;\n readonly type = 'standard';\n readonly version = STUDIO_APP_VERSION;\n // Kernel plugin dependency is matched by plugin NAME (AuthPlugin.name =\n // 'com.objectstack.auth'), not by package id.\n readonly dependencies: string[] = ['com.objectstack.auth'];\n\n async init(_ctx: any): Promise<void> {\n // No-op: registration happens in start() once the manifest service exists.\n }\n\n async start(ctx: any): Promise<void> {\n const manifest = ctx?.getService?.('manifest');\n if (!manifest || typeof manifest.register !== 'function') return;\n manifest.register({ ...studioAppManifestHeader, apps: [STUDIO_APP] });\n }\n}\n\n/** Convenience factory mirroring the rest of the plugin ecosystem. */\nexport function createStudioAppPlugin(): StudioAppPlugin {\n return new StudioAppPlugin();\n}\n\nexport { STUDIO_APP };\n"]}
1
+ {"version":3,"sources":["../src/studio-overview.doc.ts","../src/index.ts"],"names":[],"mappings":";;;;;;AAoBO,IAAM,mBAAA,GAA2B;AAAA,EACtC,IAAA,EAAM,iBAAA;AAAA,EACN,KAAA,EAAO,iBAAA;AAAA,EACP,WAAA,EAAa,yFAAA;AAAA,EACb,OAAA,EAAS,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAAA,EAoCT,YAAA,EAAc;AAAA,IACZ,EAAA,EAAI;AAAA,MACF,KAAA,EAAO,qBAAA;AAAA,MACP,WAAA,EAAa,+JAAA;AAAA,MACb,OAAA,EAAS,CAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AA4BX;AAEJ;;;ACrEO,IAAM,qBAAA,GAAwB;AAC9B,IAAM,oBAAA,GAAuB;AAC7B,IAAM,kBAAA,GAAqB;AAG3B,IAAM,uBAAA,GAA0B;AAAA,EACrC,EAAA,EAAI,qBAAA;AAAA,EACJ,SAAA,EAAW,oBAAA;AAAA,EACX,OAAA,EAAS,kBAAA;AAAA,EACT,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,QAAA;AAAA,EACP,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,EAAa,iDAAA;AAAA;AAAA;AAAA,EAGb,YAAA,EAAc,CAAC,6BAA6B;AAC9C;AAOO,IAAM,kBAAN,MAAsB;AAAA,EAAtB,WAAA,GAAA;AACL,IAAA,IAAA,CAAS,IAAA,GAAO,qBAAA;AAChB,IAAA,IAAA,CAAS,IAAA,GAAO,UAAA;AAChB,IAAA,IAAA,CAAS,OAAA,GAAU,kBAAA;AAGnB;AAAA;AAAA,IAAA,IAAA,CAAS,YAAA,GAAyB,CAAC,sBAAsB,CAAA;AAAA,EAAA;AAAA,EAEzD,MAAM,KAAK,IAAA,EAA0B;AAAA,EAErC;AAAA,EAEA,MAAM,MAAM,GAAA,EAAyB;AACnC,IAAA,MAAM,QAAA,GAAW,GAAA,EAAK,UAAA,GAAa,UAAU,CAAA;AAC7C,IAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,CAAS,aAAa,UAAA,EAAY;AAC1D,IAAA,QAAA,CAAS,QAAA,CAAS;AAAA,MAChB,GAAG,uBAAA;AAAA,MACH,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA;AAAA,MAEjB,IAAA,EAAM,CAAC,mBAAmB;AAAA,KAC3B,CAAA;AAAA,EACH;AACF;AAGO,SAAS,qBAAA,GAAyC;AACvD,EAAA,OAAO,IAAI,eAAA,EAAgB;AAC7B","file":"index.mjs","sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport type { Doc } from '@objectstack/spec/system';\n\n/**\n * Studio app overview doc (ADR-0046), registered in this package's manifest so\n * it groups under \"Studio\" in the `/_console/docs` index.\n *\n * Authored inline rather than as a flat `src/docs/*.md` file because this is a\n * TS-first code package built by tsup, not a user app built by `os build` —\n * `defineStack({ docs })` / manifest `docs[]` is the supported path for those\n * (see `DocSchema` in `@objectstack/spec/system`). The `content` below is plain\n * CommonMark + GFM with no images/MDX, per ADR-0046 §3.4.\n *\n * Principle (from the HotCRM reference docs): document the *invisible*\n * business logic, not what the Studio UI already shows on screen.\n *\n * `translations` carries per-locale variants (ADR-0046 i18n); the REST layer\n * collapses the doc to the request's `Accept-Language` and serves one body.\n */\nexport const STUDIO_OVERVIEW_DOC: Doc = {\n name: 'studio_overview',\n label: 'Studio overview',\n description: 'Orientation for builders: the metadata-first model, overlay precedence, and publishing.',\n content: `# Studio overview\n\nStudio is the builder app — the workbench for shaping the platform's\n*metadata*: objects, fields, views, flows, agents, and the rest. Most of its\nscreens are self-explanatory; this page covers the one rule that is not visible\non screen but governs everything you do here. For the full reference, see\n<https://docs.objectstack.ai>.\n\n## Metadata-first\n\nIn Studio you do not edit a running database — you edit *definitions*. Every\nobject, field, and view is a metadata record, and the live application is\ngenerated from that metadata. This is why a change in Studio can reshape the UI\nand the API at once: you are changing the model, not patching a screen.\n\n## Edits are overlays (the invisible rule)\n\nYour changes do not mutate the metadata shipped by a package in place. Studio\nwrites an **overlay** on top of the base definition, and the runtime resolves\nthe two by precedence: an unpublished **draft** wins for you while you work, a\npublished **tenant overlay** wins over the package's baseline, and the package\nbaseline is the fallback (ADR-0005, ADR-0033). The practical consequence: the\nbase definition is never destroyed, so an overlay can always be reverted to\nrecover the original — and a field that \"won't change\" is usually being shadowed\nby a higher-precedence layer.\n\n## Publishing & deploying\n\nA draft is visible only to you until you **publish** it, which promotes the\noverlay so the rest of the tenant sees it. Moving changes between environments\n(for example dev → production) is a separate **deploy** step, not an automatic\nside effect of publishing — keeping the two distinct is what lets you build\nsafely in one environment before shipping.\n\nSee <https://docs.objectstack.ai> for drafts, overlays, and deployment in depth.\n`,\n translations: {\n zh: {\n label: 'Studio 概览',\n description: '搭建者入门:元数据优先模型、覆盖层优先级、发布与部署。',\n content: `# Studio 概览\n\nStudio 是搭建者应用——塑造平台*元数据*的工作台:对象、字段、视图、流程、智能体等。\n它的大多数界面一目了然;本页讲的是那条界面上看不见、却支配你在这里一切操作的规则。\n完整参考见 <https://docs.objectstack.ai>。\n\n## 元数据优先\n\n在 Studio 里你编辑的不是运行中的数据库,而是*定义*。每个对象、字段、视图都是一条\n元数据记录,运行的应用由这些元数据生成。这就是为什么 Studio 里的一处改动能同时重塑\nUI 和 API:你改的是模型,而不是修补某个界面。\n\n## 编辑即覆盖层(看不见的规则)\n\n你的改动不会原地修改某个包发布的元数据。Studio 在基础定义之上写一层**覆盖层**,\n运行时按优先级解析两者:未发布的**草稿**在你编辑时对你生效,已发布的**租户覆盖层**\n优先于包的基线,包基线则是兜底(ADR-0005、ADR-0033)。实际后果:基础定义永不被\n销毁,所以覆盖层总能回退以恢复原样——而一个\"改不动\"的字段,通常是被更高优先级的\n层遮住了。\n\n## 发布与部署\n\n草稿只对你自己可见,直到你**发布**它,把覆盖层提升给整个租户看到。在环境之间搬运\n改动(例如开发 → 生产)是单独的**部署**步骤,不是发布的自动副作用——把两者分开,\n才能让你在一个环境里安全搭建、再上线。\n\n草稿、覆盖层与部署的细节见 <https://docs.objectstack.ai>。\n`,\n },\n },\n};\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * `@objectstack/studio` — the Studio metadata-builder app as its own ObjectStack\n * package (ADR-0048: one app per package).\n *\n * Studio is a console navigation-shell app (an `AppSchema`), not a kernel\n * extension — but it still needs a thin registration entry to publish its\n * manifest into the running kernel, mirroring how `@objectstack/plugin-auth`\n * registers its own manifest. Giving it a distinct package id\n * (`com.objectstack.studio`) is what lets `/apps/<packageId>` resolve to exactly\n * this app instead of being ambiguous inside a multi-app package.\n *\n * NOTE (transitional): the `STUDIO_APP` schema is still imported from\n * `@objectstack/platform-objects/apps`; a follow-up moves the definition into\n * this package and drops the dependency. This package is intentionally NOT yet\n * wired into the dev/serve plugin set — that boot-path switch (and removing the\n * app from plugin-auth's manifest) lands separately so it can be verified\n * against a live `os dev` boot.\n */\n\nimport { STUDIO_APP } from '@objectstack/platform-objects/apps';\n\nimport { STUDIO_OVERVIEW_DOC } from './studio-overview.doc.js';\n\nexport const STUDIO_APP_PACKAGE_ID = 'com.objectstack.studio';\nexport const STUDIO_APP_NAMESPACE = 'studio';\nexport const STUDIO_APP_VERSION = '9.3.0';\n\n/** Manifest header for the Studio app package. */\nexport const studioAppManifestHeader = {\n id: STUDIO_APP_PACKAGE_ID,\n namespace: STUDIO_APP_NAMESPACE,\n version: STUDIO_APP_VERSION,\n type: 'plugin' as const,\n scope: 'system' as const,\n name: 'Studio',\n description: 'ObjectStack Studio — metadata builder app.',\n // Studio navigates platform metadata owned by plugin-auth; declare the\n // dependency so it loads after the auth objects are registered.\n dependencies: ['com.objectstack.plugin-auth'],\n};\n\n/**\n * Thin plugin that registers the Studio app manifest. Structurally typed\n * against the kernel `Plugin` contract (no compile-time kernel dependency),\n * exactly like `AuthPlugin`.\n */\nexport class StudioAppPlugin {\n readonly name = STUDIO_APP_PACKAGE_ID;\n readonly type = 'standard';\n readonly version = STUDIO_APP_VERSION;\n // Kernel plugin dependency is matched by plugin NAME (AuthPlugin.name =\n // 'com.objectstack.auth'), not by package id.\n readonly dependencies: string[] = ['com.objectstack.auth'];\n\n async init(_ctx: any): Promise<void> {\n // No-op: registration happens in start() once the manifest service exists.\n }\n\n async start(ctx: any): Promise<void> {\n const manifest = ctx?.getService?.('manifest');\n if (!manifest || typeof manifest.register !== 'function') return;\n manifest.register({\n ...studioAppManifestHeader,\n apps: [STUDIO_APP],\n // ADR-0046 package docs — grouped under \"Studio\" at /_console/docs.\n docs: [STUDIO_OVERVIEW_DOC],\n });\n }\n}\n\n/** Convenience factory mirroring the rest of the plugin ecosystem. */\nexport function createStudioAppPlugin(): StudioAppPlugin {\n return new StudioAppPlugin();\n}\n\nexport { STUDIO_APP };\nexport { STUDIO_OVERVIEW_DOC };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@objectstack/studio",
3
- "version": "9.4.0",
3
+ "version": "9.5.0",
4
4
  "license": "Apache-2.0",
5
5
  "description": "ObjectStack Studio — the metadata builder app, packaged as its own ObjectStack app package (ADR-0048: one app per package).",
6
6
  "main": "dist/index.js",
@@ -13,8 +13,8 @@
13
13
  }
14
14
  },
15
15
  "dependencies": {
16
- "@objectstack/platform-objects": "9.4.0",
17
- "@objectstack/spec": "9.4.0"
16
+ "@objectstack/platform-objects": "9.5.0",
17
+ "@objectstack/spec": "9.5.0"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@types/node": "^25.9.2",