unoverse 0.1.200 → 0.1.202

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.
@@ -42,7 +42,7 @@ DOCR_TOKEN=
42
42
  # Page intelligence (promote-page extraction)
43
43
  HYPERBROWSER_API_KEY=
44
44
 
45
- # Marketplace catalogue to install from (docs/architecture/MARKETPLACE.md).
45
+ # Marketplace catalogue to install from (docs/architecture/authoring/MARKETPLACE.md).
46
46
  # Empty = local items only. No default: a URL is never hardcoded.
47
47
  UNOVERSE_MARKETPLACE_URL=
48
48
 
@@ -372,7 +372,7 @@ services:
372
372
  restart: unless-stopped
373
373
 
374
374
  # unoverse-runtime REMOVED 2026-07-28: WIP, excluded from the platform
375
- # (docs/architecture/INFRASTRUCTURE.md). Returns when the user declares it ready.
375
+ # (docs/architecture/deployment/INFRASTRUCTURE.md). Returns when the user declares it ready.
376
376
 
377
377
  # ===========================================================================
378
378
  # OBSERVABILITY — log viewer (runs by default)
@@ -1,4 +1,4 @@
1
- # The Universe — AWS POC (docs/architecture/AWS_DEPLOYMENT.md)
1
+ # The Universe — AWS POC (docs/architecture/deployment/AWS_DEPLOYMENT.md)
2
2
  #
3
3
  # One VM + managed Postgres/Redis + Cognito + a scoped Bedrock IAM user.
4
4
  # Deliberately flat and minimal: this is the POC tier. Terraform provisions,
@@ -1,4 +1,4 @@
1
- # The Universe — DigitalOcean ground (docs/architecture/INFRASTRUCTURE.md)
1
+ # The Universe — DigitalOcean ground (docs/architecture/deployment/INFRASTRUCTURE.md)
2
2
  #
3
3
  # Same five-input contract as infra/aws, DO implementation: Droplet + Managed
4
4
  # Postgres (fronted by its built-in PgBouncer, per the Postgres law) + Managed
@@ -36,7 +36,7 @@ cmd_db_verify() {
36
36
  "id", "name", "description", "nodes", "edges", "active",
37
37
  "execution_mode", "test_inputs", "umap_settings", "viewport",
38
38
  "mcp_schema", "memory_config", "content_taxonomy", "created_at", "updated_at",
39
- "workflow_document", "layout_document"
39
+ "workflow_document", "layout_document", "org"
40
40
  ],
41
41
  workflow_executions: [
42
42
  "execution_id", "workflow_id", "status", "start_time", "end_time",
@@ -93,42 +93,42 @@ cmd_db_verify() {
93
93
  "needs", "source_url", "source_id", "umap_x", "umap_y", "umap_z",
94
94
  "umap_cluster_id", "color_hex", "needs_umap_update", "created_at",
95
95
  "updated_at", "workflow_id", "key_need", "metadata", "embedding_original",
96
- "cluster_distance"
96
+ "cluster_distance", "org"
97
97
  ],
98
98
  dictionary_clusters: [
99
99
  "cluster_id", "workflow_id", "parent_id", "depth", "name", "description",
100
100
  "name_embedding", "medoid_id", "terms", "member_count", "umap_x", "umap_y",
101
101
  "umap_z", "radius", "created_at", "updated_at",
102
102
  "region_id", "carried_overlap", "derived_from", "name_locked", "locked_at",
103
- "locked_by", "member_ids"
103
+ "locked_by", "member_ids", "org"
104
104
  ],
105
105
  user_region_events: [
106
106
  "id", "workflow_id", "user_id", "region_id", "region_name", "stage",
107
- "source", "evidence", "occurred_at"
107
+ "source", "evidence", "occurred_at", "org"
108
108
  ],
109
109
  dictionary_regions: [
110
110
  "region_id", "workflow_id", "depth", "name", "description", "name_locked",
111
111
  "locked_at", "locked_by", "stage", "stage_set_by", "needs_review",
112
112
  "skills", "skills_set_by", "skills_set_at",
113
- "derived_from", "first_seen", "last_seen", "closed_at"
113
+ "derived_from", "first_seen", "last_seen", "closed_at", "org"
114
114
  ],
115
115
  dictionary_content_chunks: [
116
116
  "chunk_id", "text", "source_url", "source_type", "metadata",
117
- "workflow_id", "created_at", "updated_at", "embedding_original"
117
+ "workflow_id", "created_at", "updated_at", "embedding_original", "org"
118
118
  ],
119
119
  dictionary_chunk_need_matches: [
120
120
  "chunk_id", "need_id", "similarity_score", "rank", "match_type",
121
- "created_at", "workflow_id"
121
+ "created_at", "workflow_id", "org"
122
122
  ],
123
123
  dictionary_ingestion_configs: [
124
124
  "id", "name", "description", "connector_type", "connector_config",
125
125
  "main_category", "workflow_id", "created_at", "updated_at",
126
- "last_run_at", "run_count"
126
+ "last_run_at", "run_count", "org"
127
127
  ],
128
128
  dictionary_ingestion_jobs: [
129
129
  "job_id", "workflow_id", "status", "connector_type", "category",
130
130
  "config", "extraction_config", "started_at", "completed_at",
131
- "progress", "error", "created_at"
131
+ "progress", "error", "created_at", "org"
132
132
  ],
133
133
  goals: [
134
134
  "goal_id", "user_id", "workflow_id", "status", "description",
@@ -141,13 +141,16 @@ cmd_db_verify() {
141
141
  goal_scratch: [
142
142
  "goal_id", "agent_id", "agent_name", "state", "updated_at"
143
143
  ],
144
+ orgs: [
145
+ "slug", "name", "settings", "website", "logo", "created_at", "updated_at"
146
+ ],
144
147
  knowledge_docs: [
145
148
  "id", "workflow_id", "title", "doc_type", "sections", "version",
146
149
  "links", "metadata", "created_at", "updated_at"
147
150
  ],
148
151
  content_sources: [
149
152
  "workflow_id", "connector", "source_key", "group_path", "label",
150
- "status", "last_ingested", "metadata", "created_at", "updated_at"
153
+ "status", "last_ingested", "metadata", "created_at", "updated_at", "org"
151
154
  ],
152
155
  security_attack_corpus: [
153
156
  "id", "category", "label", "attack_prompt", "expected_result",
@@ -343,7 +343,7 @@ OPENAI_API_KEY=${OPENAI_API_KEY}
343
343
  # back it up with the database. Kept on re-runs.
344
344
  CREDENTIAL_ENCRYPTION_KEY=${CREDENTIAL_ENCRYPTION_KEY}
345
345
  HYPERBROWSER_API_KEY=${HYPERBROWSER_API_KEY}
346
- # Marketplace catalogue to install from (docs/architecture/MARKETPLACE.md).
346
+ # Marketplace catalogue to install from (docs/architecture/authoring/MARKETPLACE.md).
347
347
  # Empty = local items only. No default: a URL is never hardcoded.
348
348
  UNOVERSE_MARKETPLACE_URL=
349
349
  DOMAIN=
@@ -223,7 +223,7 @@ case "${1:-}" in
223
223
  echo "" >&2
224
224
  echo " scripts/operator.sh publish" >&2
225
225
  echo "" >&2
226
- echo " See docs/architecture/DEVELOPER_GUIDE.md § Releasing." >&2
226
+ echo " See docs/architecture/platform/DEVELOPER_GUIDE.md § Releasing." >&2
227
227
  echo "" >&2
228
228
  exit 1
229
229
  else
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unoverse",
3
- "version": "0.1.200",
3
+ "version": "0.1.202",
4
4
  "description": "The Unoverse front door — create a Studio project, a universe, or a client app, and launch Studio.",
5
5
  "license": "SEE LICENSE IN README.md",
6
6
  "type": "module",
@@ -97,7 +97,8 @@ export function collectProject(designRoot, project) {
97
97
  // A prompt block is NEVER qualified this way — see the blocks/ walk below for why.
98
98
  // Apps keep their bare ids: those are org-qualified by convention
99
99
  // (`<org>-chat`). docs/unoverse/UNOVERSE_COMPONENT_ORGS.md.
100
- const QUALIFIED_KINDS = new Set(["component", "skill", "template"]);
100
+ // `identity` (2026-09-05): the org's four documents, `<org>/brand` like a component.
101
+ const QUALIFIED_KINDS = new Set(["component", "skill", "template", "identity"]);
101
102
  const add = (kind, name, definition) => items.push({
102
103
  kind,
103
104
  name: QUALIFIED_KINDS.has(kind) ? `${project}/${name}` : name,
@@ -121,7 +122,10 @@ export function collectProject(designRoot, project) {
121
122
  // 029): apps publish as kind `app` and the Template Model kind owns the bare
122
123
  // word. Forgetting a design dir here ships deploys that silently drop every
123
124
  // artifact of that kind.
124
- for (const [dir, kind] of [["components", "component"], ["apps", "app"], ["templates", "template"], ["atoms", "atom"]]) {
125
+ // IDENTITY (owner ruling 2026-09-05): design/<org>/identity/<doc>/ publishes as kind
126
+ // `identity`, the same walk as a component folder, so it reaches the registry, the
127
+ // spatial catalogue and the map through the one publish path everything else takes.
128
+ for (const [dir, kind] of [["components", "component"], ["apps", "app"], ["templates", "template"], ["atoms", "atom"], ["identity", "identity"]]) {
125
129
  const home = join(root, dir);
126
130
  if (!existsSync(home))
127
131
  continue;
@@ -10,7 +10,7 @@
10
10
  * new, changed, unchanged, or refused because the name belongs to someone else. Publishing
11
11
  * blind is how a project half-lands and nobody can tell by looking.
12
12
  *
13
- * See docs/architecture/DECLARATIVE_NODES.md §9.
13
+ * See docs/architecture/authoring/DECLARATIVE_NODES.md §9.
14
14
  */
15
15
  import { existsSync } from "node:fs";
16
16
  import { join } from "node:path";
@@ -57,7 +57,7 @@ export const PROP_KEYS = [
57
57
  */
58
58
  export const INTERFACE_FIELDS = new Set([
59
59
  "universal_id", "title", "description", "object_type", "key_need", "source_url", "source_id",
60
- "tagline", "shortDescription", "introParagraph", "callToAction", "actionPrompt", "primaryImage", "images", "action",
60
+ "tagline", "shortDescription", "introParagraph", "callToAction", "primaryImage", "images", "action",
61
61
  "bodyCopy", "features", "mainCategory", "section", "needs",
62
62
  ]);
63
63
 
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://docs.unoverse.ai/schemas/nodes/_defs.schema.json",
4
4
  "title": "Shared node definitions",
5
- "description": "Fragments $ref'd by the sibling node schemas. Not authored directly. See docs/architecture/DECLARATIVE_NODES.md.",
5
+ "description": "Fragments $ref'd by the sibling node schemas. Not authored directly. See docs/architecture/authoring/DECLARATIVE_NODES.md.",
6
6
  "definitions": {
7
7
  "nodeType": {
8
8
  "type": "string",
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://docs.unoverse.ai/schemas/nodes/api.schema.json",
4
4
  "title": "Unoverse node API call",
5
- "description": "api.yaml — the upstream call this node makes, and how its response maps onto the node's outputs. This is the file that replaces an executor. NAMED api, not service: `service` already means serviceConnectors / isService / MCP providers / /service-call in this platform. See docs/architecture/DECLARATIVE_NODES.md §8.\n\nEVERY enum below is the EXECUTOR'S CAPABILITY LIST. A manifest may only name a capability that is already implemented in code. Adding a value here without implementing it produces a node that lints clean and fails at run time, and allowing a manifest to name arbitrary code would end the safety property this whole format exists for (§2).\n\nA node is reached two ways, and they never cross. The GRAPH RUNS it: `run` is the ordered list of calls it makes, and `events` says what lands on its output connectors. Or a SERVICE CALLS it ad-hoc, exposed as MCP: `service` holds those methods, each with its own list of calls, each handing one value straight back to the caller rather than touching a connector. A pure service node has only `service`.\n\nCalls are ALWAYS a `run` list, even when there is one of them. There is no `request` key.",
5
+ "description": "api.yaml — the upstream call this node makes, and how its response maps onto the node's outputs. This is the file that replaces an executor. NAMED api, not service: `service` already means serviceConnectors / isService / MCP providers / /service-call in this platform. See docs/architecture/authoring/DECLARATIVE_NODES.md §8.\n\nEVERY enum below is the EXECUTOR'S CAPABILITY LIST. A manifest may only name a capability that is already implemented in code. Adding a value here without implementing it produces a node that lints clean and fails at run time, and allowing a manifest to name arbitrary code would end the safety property this whole format exists for (§2).\n\nA node is reached two ways, and they never cross. The GRAPH RUNS it: `run` is the ordered list of calls it makes, and `events` says what lands on its output connectors. Or a SERVICE CALLS it ad-hoc, exposed as MCP: `service` holds those methods, each with its own list of calls, each handing one value straight back to the caller rather than touching a connector. A pure service node has only `service`.\n\nCalls are ALWAYS a `run` list, even when there is one of them. There is no `request` key.",
6
6
  "type": "object",
7
7
  "required": [],
8
8
  "definitions": {
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://docs.unoverse.ai/schemas/nodes/interface.schema.json",
4
4
  "title": "Unoverse node interface",
5
- "description": "interface.yaml — the node's WIRING SURFACE, and nothing else. Everything another node, an agent, or a developer needs in order to connect to this one: what goes in, what comes out, what services it offers or consumes, and what credentials it needs.\n\nIt has its own file because this is the question asked most often about a node, and it should never require reading past a node's branding to answer. See docs/architecture/DECLARATIVE_NODES.md §5.",
5
+ "description": "interface.yaml — the node's WIRING SURFACE, and nothing else. Everything another node, an agent, or a developer needs in order to connect to this one: what goes in, what comes out, what services it offers or consumes, and what credentials it needs.\n\nIt has its own file because this is the question asked most often about a node, and it should never require reading past a node's branding to answer. See docs/architecture/authoring/DECLARATIVE_NODES.md §5.",
6
6
  "type": "object",
7
7
  "properties": {
8
8
  "$schema": {
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://docs.unoverse.ai/schemas/nodes/node.schema.json",
4
4
  "title": "Unoverse node",
5
- "description": "node.yaml — what this node IS: its identity, its kind, and how it is discovered. The only required file in a node folder.\n\nThe wiring surface lives next door in interface.yaml, so \"what can I connect to this?\" is answered without reading past the node's branding. config/api/test/interface may each be inlined here instead of living in their own file, but never both (that is a lint error, not a merge). See docs/architecture/DECLARATIVE_NODES.md §5.",
5
+ "description": "node.yaml — what this node IS: its identity, its kind, and how it is discovered. The only required file in a node folder.\n\nThe wiring surface lives next door in interface.yaml, so \"what can I connect to this?\" is answered without reading past the node's branding. config/api/test/interface may each be inlined here instead of living in their own file, but never both (that is a lint error, not a merge). See docs/architecture/authoring/DECLARATIVE_NODES.md §5.",
6
6
  "type": "object",
7
7
  "required": [
8
8
  "type",
@@ -143,7 +143,7 @@
143
143
  },
144
144
  "auth": {
145
145
  "type": "object",
146
- "description": "WHO MAY RUN THIS NODE — inbound, about the caller (docs/architecture/DECLARATIVE_NODES.md §9.13). Not to be confused with a call's `credential` in api/run.yaml, which is outbound: how the node proves itself to a vendor. Both were spelled `auth` until 2026-07-28.\n\nCOMPULSORY, which is the point. It was optional (`requires: { role }`) until 2026-07-28, and every node in the tree said nothing — so a node that had been considered and left open looked exactly like a node nobody had thought about. Silence is not an answer to this question.",
146
+ "description": "WHO MAY RUN THIS NODE — inbound, about the caller (docs/architecture/authoring/DECLARATIVE_NODES.md §9.13). Not to be confused with a call's `credential` in api/run.yaml, which is outbound: how the node proves itself to a vendor. Both were spelled `auth` until 2026-07-28.\n\nCOMPULSORY, which is the point. It was optional (`requires: { role }`) until 2026-07-28, and every node in the tree said nothing — so a node that had been considered and left open looked exactly like a node nobody had thought about. Silence is not an answer to this question.",
147
147
  "additionalProperties": false,
148
148
  "properties": {
149
149
  "required": {
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://docs.unoverse.ai/schemas/nodes/package.schema.json",
4
4
  "title": "Unoverse node package",
5
- "description": "package.yaml — the envelope for a folder of nodes. Replaces the `gravity` block in package.json for packages that no longer ship code. See docs/architecture/DECLARATIVE_NODES.md §5.",
5
+ "description": "package.yaml — the envelope for a folder of nodes. Replaces the `gravity` block in package.json for packages that no longer ship code. See docs/architecture/authoring/DECLARATIVE_NODES.md §5.",
6
6
  "type": "object",
7
7
  "required": [
8
8
  "name",
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://docs.unoverse.ai/schemas/nodes/test.schema.json",
4
4
  "title": "Unoverse node test data",
5
- "description": "test.yaml — the fixture behind Studio's \"Load sample, Run\" button and behind `unoverse node test`. Every node must have one: a node nobody can run is a node nobody can trust, and lint enforces it.\n\nTemplate fields are supplied ALREADY RESOLVED, because the bench has no upstream node to resolve them from. See docs/architecture/DECLARATIVE_NODES.md §6.",
5
+ "description": "test.yaml — the fixture behind Studio's \"Load sample, Run\" button and behind `unoverse node test`. Every node must have one: a node nobody can run is a node nobody can trust, and lint enforces it.\n\nTemplate fields are supplied ALREADY RESOLVED, because the bench has no upstream node to resolve them from. See docs/architecture/authoring/DECLARATIVE_NODES.md §6.",
6
6
  "type": "object",
7
7
  "required": [
8
8
  "testData"
@@ -13,7 +13,7 @@
13
13
  * without it is the gap LOCAL_STUDIO.md:246 names: "a malformed definition is one restart
14
14
  * from a broken server", and a published row does not even need the restart.
15
15
  *
16
- * FOUR TIERS (docs/architecture/DECLARATIVE_NODES.md §6). This is tiers 2 and 3.
16
+ * FOUR TIERS (docs/architecture/authoring/DECLARATIVE_NODES.md §6). This is tiers 2 and 3.
17
17
  * 1 editor $schema pointers + .vscode yaml.schemas, no tool
18
18
  * 2 structural every part validated against the node schemas (packages/docs/schemas/nodes)
19
19
  * 3 semantic the cross-file rules a schema cannot express
@@ -9,7 +9,7 @@
9
9
  * Everything past this file works on the composed definition and never learns where
10
10
  * it came from.
11
11
  *
12
- * See docs/architecture/DECLARATIVE_NODES.md.
12
+ * See docs/architecture/authoring/DECLARATIVE_NODES.md.
13
13
  */
14
14
  import * as fs from "fs";
15
15
  import * as path from "path";