@noodleseed/one 0.137.0 → 0.138.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.
Files changed (123) hide show
  1. package/dist/commands/assistant-ops.d.ts.map +1 -1
  2. package/dist/commands/assistant-ops.js +30 -1
  3. package/dist/commands/assistant-ops.js.map +1 -1
  4. package/dist/commands/deploy-first-flow.d.ts +2 -0
  5. package/dist/commands/deploy-first-flow.d.ts.map +1 -1
  6. package/dist/commands/deploy-first-flow.js +46 -14
  7. package/dist/commands/deploy-first-flow.js.map +1 -1
  8. package/dist/commands/deploy-ops.d.ts.map +1 -1
  9. package/dist/commands/deploy-ops.js +27 -1
  10. package/dist/commands/deploy-ops.js.map +1 -1
  11. package/dist/commands/deploy-preflight.d.ts +1 -0
  12. package/dist/commands/deploy-preflight.d.ts.map +1 -1
  13. package/dist/commands/deploy-preflight.js +1 -0
  14. package/dist/commands/deploy-preflight.js.map +1 -1
  15. package/dist/commands/deploy-status-ops.d.ts +1 -0
  16. package/dist/commands/deploy-status-ops.d.ts.map +1 -1
  17. package/dist/commands/deploy-status-ops.js +59 -4
  18. package/dist/commands/deploy-status-ops.js.map +1 -1
  19. package/dist/commands/deployments-ops.d.ts.map +1 -1
  20. package/dist/commands/deployments-ops.js +2 -0
  21. package/dist/commands/deployments-ops.js.map +1 -1
  22. package/dist/commands/diagnostics-ops.d.ts +1 -0
  23. package/dist/commands/diagnostics-ops.d.ts.map +1 -1
  24. package/dist/commands/diagnostics-ops.js +3 -0
  25. package/dist/commands/diagnostics-ops.js.map +1 -1
  26. package/dist/deploy.d.ts +3 -0
  27. package/dist/deploy.d.ts.map +1 -1
  28. package/dist/deploy.js +4 -0
  29. package/dist/deploy.js.map +1 -1
  30. package/dist/index.d.ts +1 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +1 -1
  33. package/dist/index.js.map +1 -1
  34. package/node_modules/@noodle-borg/admission-limits/dist/envelope.js +1 -1
  35. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +3 -3
  36. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +1 -0
  37. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.js +6 -7
  38. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  39. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.d.ts +6 -2
  40. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.js +5 -2
  41. package/node_modules/@noodle-borg/assistant-gateway/dist/model-request.js +37 -0
  42. package/node_modules/@noodle-borg/assistant-gateway/dist/model-runtime.js +4 -0
  43. package/node_modules/@noodle-borg/{service/dist/assistant-model-stream.js → assistant-gateway/dist/model-stream.js} +34 -2
  44. package/node_modules/@noodle-borg/assistant-gateway/dist/public-session.d.ts +3 -0
  45. package/node_modules/@noodle-borg/assistant-gateway/dist/public-session.js +2 -1
  46. package/node_modules/@noodle-borg/assistant-gateway/dist/public-turn.d.ts +4 -1
  47. package/node_modules/@noodle-borg/assistant-gateway/dist/public-turn.js +2 -1
  48. package/node_modules/@noodle-borg/assistant-gateway/dist/surface-budget.d.ts +6 -1
  49. package/node_modules/@noodle-borg/assistant-gateway/dist/surface-budget.js +11 -5
  50. package/node_modules/@noodle-borg/assistant-gateway/package.json +5 -1
  51. package/node_modules/@noodle-borg/authoring/dist/assistant.d.ts +10 -2
  52. package/node_modules/@noodle-borg/authoring/dist/assistant.js +4 -0
  53. package/node_modules/@noodle-borg/authoring/dist/index.d.ts +1 -1
  54. package/node_modules/@noodle-borg/authoring/dist/index.js +1 -1
  55. package/node_modules/@noodle-borg/authoring/dist/load-authored.js +1 -1
  56. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-assistant.js +17 -0
  57. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-hosted-deployment.js +14 -0
  58. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +1 -7
  59. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +20 -8
  60. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +12 -8
  61. package/node_modules/@noodle-borg/control-plane/dist/portable.d.ts +2 -0
  62. package/node_modules/@noodle-borg/control-plane/dist/portable.js +1 -0
  63. package/node_modules/@noodle-borg/control-plane/dist/rollback-deployment.d.ts +61 -0
  64. package/node_modules/@noodle-borg/{service/dist/operations → control-plane/dist}/rollback-deployment.js +3 -2
  65. package/node_modules/@noodle-borg/control-plane/dist/rollback-result.d.ts +19 -0
  66. package/node_modules/@noodle-borg/control-plane/package.json +3 -1
  67. package/node_modules/@noodle-borg/developer-mcp/dist/contracts.js +4 -0
  68. package/node_modules/@noodle-borg/developer-mcp/dist/widgets/app-overview.js +1 -1
  69. package/node_modules/@noodle-borg/developer-mcp/dist/widgets/deployment-detail.js +1 -1
  70. package/node_modules/@noodle-borg/module/dist/contract.d.ts +1 -0
  71. package/node_modules/@noodle-borg/module/dist/deployment-automation.d.ts +1 -1
  72. package/node_modules/@noodle-borg/module/dist/endpoint-url.d.ts +11 -0
  73. package/node_modules/@noodle-borg/module/dist/endpoint-url.js +20 -0
  74. package/node_modules/@noodle-borg/module/dist/index.d.ts +1 -0
  75. package/node_modules/@noodle-borg/module/dist/index.js +1 -0
  76. package/node_modules/@noodle-borg/observability/dist/assistant-usage.js +217 -0
  77. package/node_modules/@noodle-borg/observability/dist/index.js +2 -0
  78. package/node_modules/@noodle-borg/{service → observability}/dist/request-event-metrics.js +5 -2
  79. package/node_modules/@noodle-borg/observability/dist/request-events-postgres.js +6 -0
  80. package/node_modules/@noodle-borg/observability/dist/request-events.js +2 -0
  81. package/node_modules/@noodle-borg/service/dist/assistant-bindings.js +3 -1
  82. package/node_modules/@noodle-borg/service/dist/developer-mcp/control-plane-adapter.js +3 -3
  83. package/node_modules/@noodle-borg/service/dist/developer-mcp/inspection.js +2 -1
  84. package/node_modules/@noodle-borg/service/dist/registry-access.js +73 -24
  85. package/node_modules/@noodle-borg/service/dist/registry-deploy-transaction.js +5 -2
  86. package/node_modules/@noodle-borg/service/dist/registry-helpers.d.ts +5 -9
  87. package/node_modules/@noodle-borg/service/dist/registry-helpers.js +4 -18
  88. package/node_modules/@noodle-borg/service/dist/registry-rollback.js +3 -1
  89. package/node_modules/@noodle-borg/service/dist/registry-status.js +4 -1
  90. package/node_modules/@noodle-borg/service/dist/registry-targets.js +4 -4
  91. package/node_modules/@noodle-borg/service/dist/registry-types.d.ts +11 -16
  92. package/node_modules/@noodle-borg/service/dist/registry.d.ts +8 -5
  93. package/node_modules/@noodle-borg/service/dist/registry.js +8 -5
  94. package/node_modules/@noodle-borg/service/dist/routes/access.js +19 -1
  95. package/node_modules/@noodle-borg/service/dist/routes/analytics-dispatch.js +17 -1
  96. package/node_modules/@noodle-borg/service/dist/routes/analytics.js +1 -1
  97. package/node_modules/@noodle-borg/service/dist/routes/assistant-agent.js +73 -59
  98. package/node_modules/@noodle-borg/service/dist/routes/assistant-doctor.js +1 -1
  99. package/node_modules/@noodle-borg/service/dist/routes/assistant-model-binding.js +28 -0
  100. package/node_modules/@noodle-borg/service/dist/routes/assistant-public-session.js +18 -0
  101. package/node_modules/@noodle-borg/service/dist/routes/assistant-public-turn.js +6 -0
  102. package/node_modules/@noodle-borg/service/dist/routes/assistant-usage.js +42 -0
  103. package/node_modules/@noodle-borg/service/dist/routes/assistant.js +20 -3
  104. package/node_modules/@noodle-borg/service/dist/routes/auth-doctor-live.js +1 -2
  105. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +49 -4
  106. package/node_modules/@noodle-borg/service/dist/routes/deploy-preflight.js +11 -1
  107. package/node_modules/@noodle-borg/service/dist/routes/endpoint-enrichment.js +2 -1
  108. package/node_modules/@noodle-borg/service/dist/routes/paths.js +4 -0
  109. package/node_modules/@noodle-borg/service/dist/routes/rollback.js +1 -1
  110. package/node_modules/@noodle-borg/service/dist/service.js +6 -0
  111. package/node_modules/@noodle-borg/service/dist/store/in-memory.d.ts +2 -5
  112. package/node_modules/@noodle-borg/service/dist/store/in-memory.js +9 -21
  113. package/node_modules/@noodle-borg/service/dist/store/json-file.d.ts +2 -5
  114. package/node_modules/@noodle-borg/service/dist/store/json-file.js +8 -20
  115. package/node_modules/@noodle-borg/service/dist/store/records.js +39 -0
  116. package/node_modules/@noodle-borg/service/dist/store.d.ts +21 -10
  117. package/node_modules/@noodle-borg/service/package.json +5 -1
  118. package/node_modules/@noodle-borg/wire-contracts/dist/control-plane.d.ts +120 -0
  119. package/node_modules/@noodle-borg/wire-contracts/dist/control-plane.js +123 -1
  120. package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts +4 -0
  121. package/node_modules/@noodle-borg/wire-contracts/dist/index.js +15 -1
  122. package/node_modules/@noodleseed/assistant/package.json +1 -1
  123. package/package.json +2 -2
@@ -1,12 +1,133 @@
1
1
  /** Strict service-output contracts for control-plane reads and mutations (ADR 0128). */
2
2
  import { z } from 'zod';
3
3
  import { accessModeSchema } from './access-mode.js';
4
+ function containsC0OrDel(value) {
5
+ for (let index = 0; index < value.length; index += 1) {
6
+ const codeUnit = value.charCodeAt(index);
7
+ if (codeUnit <= 0x1f || codeUnit === 0x7f)
8
+ return true;
9
+ }
10
+ return false;
11
+ }
12
+ /** Exact OAuth subject bound by an operator to an owner-only deployment. */
13
+ export const deploymentOwnerSubjectSchema = z
14
+ .string()
15
+ .min(1)
16
+ .max(512)
17
+ .refine((value) => value.trim() === value && !containsC0OrDel(value), 'owner subject must not contain outer whitespace or C0/DEL control characters');
4
18
  export const accessUpdateRequestSchema = z
5
19
  .object({
6
20
  accessMode: accessModeSchema,
21
+ ownerSubject: deploymentOwnerSubjectSchema.optional(),
7
22
  serverVersion: z.string().min(1).optional(),
8
23
  })
9
- .strict();
24
+ .strict()
25
+ .superRefine((value, context) => {
26
+ if (value.ownerSubject !== undefined && value.accessMode !== 'owner-only') {
27
+ context.addIssue({
28
+ code: 'custom',
29
+ path: ['ownerSubject'],
30
+ message: 'ownerSubject is valid only with owner-only access',
31
+ });
32
+ }
33
+ });
34
+ export const accessUpdateResponseSchema = z
35
+ .object({
36
+ ok: z.literal(true),
37
+ target: z
38
+ .object({
39
+ org: z.string().min(1),
40
+ app: z.string().min(1),
41
+ env: z.string().min(1),
42
+ })
43
+ .strict(),
44
+ deployment: z
45
+ .object({
46
+ deploymentId: z.string().min(1),
47
+ serverVersion: z.string().min(1).optional(),
48
+ accessMode: accessModeSchema,
49
+ ownerSubject: deploymentOwnerSubjectSchema.optional(),
50
+ })
51
+ .strict(),
52
+ previousAccessMode: accessModeSchema,
53
+ previousOwnerSubject: deploymentOwnerSubjectSchema.optional(),
54
+ accessChanged: z.boolean(),
55
+ ownerChanged: z.boolean(),
56
+ changed: z.boolean(),
57
+ })
58
+ .strict()
59
+ .superRefine((value, context) => {
60
+ if (value.deployment.accessMode === 'owner-only' &&
61
+ value.deployment.ownerSubject === undefined) {
62
+ context.addIssue({
63
+ code: 'custom',
64
+ path: ['deployment', 'ownerSubject'],
65
+ message: 'owner-only access requires a current owner subject',
66
+ });
67
+ }
68
+ if (value.changed !== (value.accessChanged || value.ownerChanged)) {
69
+ context.addIssue({
70
+ code: 'custom',
71
+ path: ['changed'],
72
+ message: 'changed must equal accessChanged || ownerChanged',
73
+ });
74
+ }
75
+ });
76
+ /**
77
+ * Additive client reader for the access mutation response. Older services emitted only the aggregate
78
+ * `changed` bit, so the mode component is derived from the authoritative previous/current modes while an
79
+ * unobservable owner component remains omitted. Modern component bits retain the strict cross-field check.
80
+ */
81
+ export const accessUpdateClientResponseSchema = z
82
+ .object({
83
+ ok: z.literal(true),
84
+ target: z.object({
85
+ org: z.string().min(1),
86
+ app: z.string().min(1),
87
+ env: z.string().min(1),
88
+ }),
89
+ deployment: z.object({
90
+ deploymentId: z.string().min(1),
91
+ serverVersion: z.string().min(1).optional(),
92
+ accessMode: accessModeSchema,
93
+ ownerSubject: deploymentOwnerSubjectSchema.optional(),
94
+ }),
95
+ previousAccessMode: accessModeSchema,
96
+ previousOwnerSubject: deploymentOwnerSubjectSchema.optional(),
97
+ accessChanged: z.boolean().optional(),
98
+ ownerChanged: z.boolean().optional(),
99
+ changed: z.boolean(),
100
+ })
101
+ .superRefine((value, context) => {
102
+ const modernComponents = value.accessChanged !== undefined && value.ownerChanged !== undefined;
103
+ if ((value.accessChanged === undefined) !== (value.ownerChanged === undefined)) {
104
+ context.addIssue({
105
+ code: 'custom',
106
+ path: ['accessChanged'],
107
+ message: 'accessChanged and ownerChanged must be present together',
108
+ });
109
+ }
110
+ if (modernComponents &&
111
+ value.deployment.accessMode === 'owner-only' &&
112
+ value.deployment.ownerSubject === undefined) {
113
+ context.addIssue({
114
+ code: 'custom',
115
+ path: ['deployment', 'ownerSubject'],
116
+ message: 'owner-only access requires a current owner subject',
117
+ });
118
+ }
119
+ if (modernComponents && value.changed !== (value.accessChanged || value.ownerChanged)) {
120
+ context.addIssue({
121
+ code: 'custom',
122
+ path: ['changed'],
123
+ message: 'changed must equal accessChanged || ownerChanged',
124
+ });
125
+ }
126
+ })
127
+ .transform((value) => ({
128
+ ...value,
129
+ accessChanged: value.accessChanged ?? value.previousAccessMode !== value.deployment.accessMode,
130
+ }));
10
131
  export const deploymentLockRequestSchema = z
11
132
  .object({
12
133
  serverVersion: z.string().min(1),
@@ -32,6 +153,7 @@ export const DeploymentSummarySchema = z
32
153
  serverName: z.string(),
33
154
  createdAt: z.string(),
34
155
  createdByEmail: z.string().optional(),
156
+ ownerSubject: deploymentOwnerSubjectSchema.optional(),
35
157
  deploymentSource: z.string().optional(),
36
158
  accessMode: accessModeSchema,
37
159
  deploymentLock: DeploymentLockMetadataSchema.optional(),
@@ -80,6 +80,7 @@ export declare const deployRequestSchema: z.ZodObject<{
80
80
  mixed: "mixed";
81
81
  customers: "customers";
82
82
  }>>;
83
+ ownerSubject: z.ZodOptional<z.ZodString>;
83
84
  orgMembershipSources: z.ZodOptional<z.ZodArray<z.ZodEnum<{
84
85
  explicit: "explicit";
85
86
  domain: "domain";
@@ -115,6 +116,7 @@ export declare const deploySuccessResponseSchema: z.ZodObject<{
115
116
  mixed: "mixed";
116
117
  customers: "customers";
117
118
  }>;
119
+ ownerSubject: z.ZodOptional<z.ZodString>;
118
120
  url: z.ZodString;
119
121
  defaultUrl: z.ZodString;
120
122
  embedId: z.ZodOptional<z.ZodString>;
@@ -158,6 +160,7 @@ export declare const deployPreflightRequestSchema: z.ZodObject<{
158
160
  mixed: "mixed";
159
161
  customers: "customers";
160
162
  }>>;
163
+ ownerSubject: z.ZodOptional<z.ZodString>;
161
164
  orgMembershipSources: z.ZodOptional<z.ZodArray<z.ZodEnum<{
162
165
  explicit: "explicit";
163
166
  domain: "domain";
@@ -183,6 +186,7 @@ export type DeployTargetState = z.infer<typeof deployTargetStateSchema>;
183
186
  export declare const deployPreflightResponseSchema: z.ZodObject<{
184
187
  ok: z.ZodLiteral<true>;
185
188
  ready: z.ZodBoolean;
189
+ ownerSubject: z.ZodOptional<z.ZodString>;
186
190
  target: z.ZodObject<{
187
191
  org: z.ZodString;
188
192
  app: z.ZodString;
@@ -9,6 +9,7 @@
9
9
  */
10
10
  import { z } from 'zod';
11
11
  import { accessModeSchema } from './access-mode.js';
12
+ import { deploymentOwnerSubjectSchema } from './control-plane.js';
12
13
  export * from './access-mode.js';
13
14
  export * from './assistant.js';
14
15
  export * from './billing-operations.js';
@@ -50,14 +51,25 @@ export const hostedAssetSchema = z.object({
50
51
  */
51
52
  export const ORG_MEMBERSHIP_SOURCES = ['explicit', 'domain'];
52
53
  export const orgMembershipSourceSchema = z.enum(ORG_MEMBERSHIP_SOURCES);
53
- export const deployRequestSchema = z.object({
54
+ export const deployRequestSchema = z
55
+ .object({
54
56
  manifest: z.string().min(1),
55
57
  connectors: z.string().min(1).optional(),
56
58
  hostedAssets: z.array(hostedAssetSchema).optional(),
57
59
  accessMode: accessModeSchema.optional(),
60
+ ownerSubject: deploymentOwnerSubjectSchema.optional(),
58
61
  orgMembershipSources: z.array(orgMembershipSourceSchema).min(1).optional(),
59
62
  serverVersion: z.string().min(1).optional(),
60
63
  deploymentSource: deploymentSourceSchema.optional(),
64
+ })
65
+ .superRefine((value, context) => {
66
+ if (value.ownerSubject !== undefined && (value.accessMode ?? 'owner-only') !== 'owner-only') {
67
+ context.addIssue({
68
+ code: 'custom',
69
+ path: ['ownerSubject'],
70
+ message: 'ownerSubject is valid only with owner-only access',
71
+ });
72
+ }
61
73
  });
62
74
  /** Exact bytes both sides bind when deriving a retry-safe deploy key. */
63
75
  export function deployIdempotencyMaterial(target, requestBody) {
@@ -72,6 +84,7 @@ export const deploySuccessResponseSchema = z.object({
72
84
  deploymentId: z.string().min(1),
73
85
  serverVersion: z.string().min(1),
74
86
  accessMode: accessModeSchema,
87
+ ownerSubject: deploymentOwnerSubjectSchema.optional(),
75
88
  url: z.string().min(1),
76
89
  defaultUrl: z.string().min(1),
77
90
  /**
@@ -111,6 +124,7 @@ const deployPreflightErrorSchema = z.object({
111
124
  export const deployPreflightResponseSchema = z.object({
112
125
  ok: z.literal(true),
113
126
  ready: z.boolean(),
127
+ ownerSubject: deploymentOwnerSubjectSchema.optional(),
114
128
  target: z.object({
115
129
  org: z.string().min(1),
116
130
  app: z.string().min(1),
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noodleseed/assistant",
3
- "version": "1.22.0",
3
+ "version": "1.23.0",
4
4
  "description": "Embed the Noodle Seed customer-branded assistant in your web app with managed or framework-owned UI, a framework-neutral MCP App host, a DOM-free client, and a backend session helper. Authoring and deploying the server is @noodleseed/one.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noodleseed/one",
3
- "version": "0.137.0",
3
+ "version": "0.138.0",
4
4
  "private": false,
5
5
  "description": "Noodle CLI by Noodle Seed — author, run, and deploy declarative MCP servers. Embedding the assistant in your own web app is @noodleseed/assistant.",
6
6
  "license": "Apache-2.0",
@@ -236,7 +236,7 @@
236
236
  "@modelcontextprotocol/client": "2.0.0",
237
237
  "@modelcontextprotocol/server": "2.0.0",
238
238
  "@noodle-borg/admission-limits": "0.0.0",
239
- "@noodle-borg/agent-kit": "0.81.0",
239
+ "@noodle-borg/agent-kit": "0.82.0",
240
240
  "@noodle-borg/app-audit": "0.0.0",
241
241
  "@noodle-borg/app-package": "0.0.0",
242
242
  "@noodle-borg/assistant-gateway": "0.0.0",