@tealbrick/kit 0.2.7 → 0.3.0-rc.10

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 (46) hide show
  1. package/BOOTSTRAP.md +17 -18
  2. package/BUZZ.md +146 -0
  3. package/NATIVE.md +83 -0
  4. package/README.md +265 -4
  5. package/RUNTIME.md +1 -1
  6. package/assets/buzz/buzz-backend-provider.py +99 -0
  7. package/assets/buzz/buzz-plist.py +22 -0
  8. package/assets/buzz/buzz-run.sh +39 -0
  9. package/assets/buzz/tb-provider-apply.py +97 -0
  10. package/dist/buzz.d.ts +63 -0
  11. package/dist/buzz.js +262 -0
  12. package/dist/cli.js +22 -4
  13. package/dist/index.d.ts +23 -14
  14. package/dist/index.js +4 -2
  15. package/dist/native-acp.d.ts +40 -0
  16. package/dist/native-acp.js +224 -0
  17. package/dist/native-app-capabilities.d.ts +33 -0
  18. package/dist/native-app-capabilities.js +37 -0
  19. package/dist/native-buzz.d.ts +161 -0
  20. package/dist/native-buzz.js +649 -0
  21. package/dist/native-child-guard.d.ts +1 -0
  22. package/dist/native-child-guard.js +22 -0
  23. package/dist/native-claude.d.ts +99 -0
  24. package/dist/native-claude.js +584 -0
  25. package/dist/native-enroll.d.ts +22 -0
  26. package/dist/native-enroll.js +85 -0
  27. package/dist/native-runtime-sync.d.ts +49 -0
  28. package/dist/native-runtime-sync.js +101 -0
  29. package/dist/native-selection.d.ts +27 -0
  30. package/dist/native-selection.js +87 -0
  31. package/dist/native-serve-config.d.ts +286 -0
  32. package/dist/native-serve-config.js +296 -0
  33. package/dist/native-serve.d.ts +76 -0
  34. package/dist/native-serve.js +145 -0
  35. package/dist/native-setup.d.ts +63 -0
  36. package/dist/native-setup.js +122 -0
  37. package/dist/native-standing-grants.d.ts +105 -0
  38. package/dist/native-standing-grants.js +226 -0
  39. package/dist/native.d.ts +42 -0
  40. package/dist/native.js +193 -0
  41. package/dist/onboarding.d.ts +9 -0
  42. package/dist/onboarding.js +9 -2
  43. package/dist/runtime-onboarding.js +3 -3
  44. package/dist/secrets.d.ts +2 -1
  45. package/dist/secrets.js +4 -2
  46. package/package.json +19 -10
package/dist/native.js ADDED
@@ -0,0 +1,193 @@
1
+ import { resolve } from 'node:path';
2
+ import { guidedNativeSetup, nativeSdkConfig } from './native-setup.js';
3
+ import { applyKit, readKit } from './index.js';
4
+ import { deviceLabel, loginPortal, portalOrigin } from './onboarding.js';
5
+ import { PortalHttpError } from '@tealbrick/portal';
6
+ import { RuntimeConnector } from '@tealbrick/portal/runtime';
7
+ import { MarketplaceRuntimeConnector } from '@tealbrick/portal/marketplace-runtime';
8
+ import { serveMcp } from '@tealbrick/portal/mcp';
9
+ import { runtimeSecret } from './secrets.js';
10
+ const harnesses = { claude: 'Claude Agent SDK', codex: 'Codex', langchain: 'LangChain' };
11
+ /** Enroll an existing, accurately labelled owned card. Registration belongs to Portal. */
12
+ export async function setupNative(root, input, login) {
13
+ if (!Object.hasOwn(harnesses, input.harness))
14
+ throw Error('kit_native_harness_required');
15
+ if (!login.workspaces.some(w => w.id === input.workspaceId))
16
+ throw Error('kit_portal_workspace_required');
17
+ const old = await readKit(root);
18
+ if (old.runtime && (old.runtime.issuer !== login.issuer || old.runtime.org !== login.org || old.runtime.workspaceId !== input.workspaceId || old.runtime.agentId !== input.agentId))
19
+ throw Error('kit_runtime_existing_binding_mismatch');
20
+ if (old.native && old.native.harness !== input.harness)
21
+ throw Error('kit_native_harness_mismatch');
22
+ if (old.portal || old.voice || old.vision || old.deliver !== undefined || old.avm || old.routines || old.selfEvolution || old.runtime && !old.native)
23
+ throw Error('kit_native_eve_configuration_conflict');
24
+ const snapshot = await login.client.request('/api/workspace?workspaceId=' + encodeURIComponent(input.workspaceId));
25
+ const agent = snapshot.agents?.find((a) => a.id === input.agentId && a.bindable);
26
+ const node = snapshot.draft?.nodes?.find((n) => n.id === input.nodeId && n.data?.agentId === input.agentId && n.data.kind === 'agent');
27
+ if (snapshot.workspace?.id !== input.workspaceId || !agent || !node)
28
+ throw Error('kit_owned_agent_card_required');
29
+ if (agent.runtime !== harnesses[input.harness] || node.data.harness !== harnesses[input.harness])
30
+ throw Error('kit_native_portal_harness_mismatch');
31
+ const enrolled = await login.client.request('/api/runtime/connections', { workspaceId: input.workspaceId, nodeId: input.nodeId, agentId: input.agentId });
32
+ if (!enrolled.connectionId || !enrolled.credential || !Number.isFinite(enrolled.expiresAt) || enrolled.expiresAt <= Date.now())
33
+ throw Error('kit_runtime_enrollment_failed');
34
+ await applyKit(root, { version: 1, native: { harness: input.harness, active: true, ...(old.native?.marketplace === undefined ? {} : { marketplace: old.native.marketplace }) }, runtime: { issuer: login.issuer, org: login.org, workspaceId: input.workspaceId, agentId: input.agentId, connectionId: enrolled.connectionId, credentialRef: 'TEALBRICK_RUNTIME_CREDENTIAL', bindings: old.runtime?.bindings ?? {} } }, { TEALBRICK_RUNTIME_CREDENTIAL: enrolled.credential });
35
+ return { connected: true, agentId: input.agentId, connectionId: enrolled.connectionId, harness: input.harness };
36
+ }
37
+ /** A fresh connector per invocation rechecks Portal and local activation. No authorization cache
38
+ * survives MCP reconnect, local deactivation or a request boundary. No session is created here. */
39
+ export function nativeConnector() {
40
+ async function current() {
41
+ const config = await readKit(process.cwd());
42
+ if (!config.native?.active || !config.runtime)
43
+ throw Error('runtime_product_inactive');
44
+ const { credentialRef, ...runtime } = config.runtime;
45
+ return new RuntimeConnector({ ...runtime, credential: () => runtimeSecret(credentialRef), resolveCredential: runtimeSecret });
46
+ }
47
+ return { marketplace: async () => { const config = await readKit(process.cwd()); if (!config.native?.active || !config.native.marketplace || !config.runtime)
48
+ return undefined; const { credentialRef, ...identity } = config.runtime; return new MarketplaceRuntimeConnector({ ...identity, credential: () => runtimeSecret(credentialRef) }); }, capabilities: async () => (await current()).capabilities(true), call: async (registrationId, operation, input = {}, signal) => (await current()).call(registrationId, operation, input, signal) };
49
+ }
50
+ /** serve/enroll take boolean switches, so they are parsed separately from setup flags. */
51
+ function serveFlags(args, values, switches) {
52
+ const flags = {};
53
+ for (let i = 0; i < args.length; i++) {
54
+ const name = /^--([a-z-]+)$/.exec(args[i])?.[1];
55
+ if (!name || flags[name] !== undefined)
56
+ throw Error('kit_native_invalid_arguments');
57
+ if (switches.includes(name)) {
58
+ flags[name] = true;
59
+ continue;
60
+ }
61
+ if (!values.includes(name) || !args[i + 1] || args[i + 1].startsWith('--'))
62
+ throw Error('kit_native_invalid_arguments');
63
+ flags[name] = args[++i];
64
+ }
65
+ return flags;
66
+ }
67
+ export const nativeUsage = 'Usage: tealbrick native setup --harness claude|codex|langchain [--workspace-name NAME | --create-workspace NAME] [--agent-name NAME | --create-agent NAME] [--issuer HTTPS_ORIGIN] | native mcp [--root DIRECTORY] | native serve [--root DIRECTORY] [--install-launchd [--no-load] | --uninstall] | native enroll --url HTTPS_ORIGIN [--port PORT] [--root DIRECTORY] [--skip-endpoint-check] | native acp [--root DIRECTORY] [--buzz-cli PATH] | native enable|disable | native marketplace-enable|marketplace-disable';
68
+ export async function nativeCommand(args, root) {
69
+ if (args[0] === 'acp') {
70
+ const flags = serveFlags(args.slice(1), ['root', 'buzz-cli'], []);
71
+ if (typeof flags.root === 'string') {
72
+ root = resolve(flags.root);
73
+ process.chdir(root);
74
+ }
75
+ const { serveAcp } = await import('./native-acp.js');
76
+ await serveAcp(root, typeof flags['buzz-cli'] === 'string' ? { buzzCli: resolve(flags['buzz-cli']) } : {});
77
+ return;
78
+ }
79
+ if (args[0] === 'serve' || args[0] === 'enroll') {
80
+ const flags = args[0] === 'serve' ? serveFlags(args.slice(1), ['root'], ['install-launchd', 'uninstall', 'no-load']) : serveFlags(args.slice(1), ['root', 'url', 'port'], ['skip-endpoint-check']);
81
+ if (typeof flags.root === 'string') {
82
+ root = resolve(flags.root);
83
+ process.chdir(root);
84
+ }
85
+ if (args[0] === 'serve') {
86
+ const { serveNative, installLaunchd, uninstallLaunchd } = await import('./native-serve.js');
87
+ if (flags['install-launchd'] && flags.uninstall)
88
+ throw Error('kit_native_invalid_arguments');
89
+ if (flags.uninstall) {
90
+ console.log(JSON.stringify(await uninstallLaunchd(root)));
91
+ return;
92
+ }
93
+ if (flags['install-launchd']) {
94
+ console.log(JSON.stringify(await installLaunchd(root, { load: !flags['no-load'] })));
95
+ return;
96
+ }
97
+ if (flags['no-load'])
98
+ throw Error('kit_native_invalid_arguments');
99
+ await serveNative(root);
100
+ return;
101
+ }
102
+ if (typeof flags.url !== 'string')
103
+ throw Error('kit_native_public_url_required');
104
+ const { enrollNative } = await import('./native-enroll.js');
105
+ const state = await readKit(root);
106
+ if (!state.native || !state.runtime)
107
+ throw Error('kit_native_setup_required');
108
+ const login = await loginPortal(portalOrigin(state.runtime.issuer), (url, code) => console.error(`Approve Tealbrick endpoint registration: ${url}\nCode: ${code}`), { label: deviceLabel('native enroll', root) });
109
+ try {
110
+ const result = await enrollNative(root, { url: flags.url, ...(typeof flags.port === 'string' ? { port: Number(flags.port) } : {}) }, login, { verifyEndpoint: !flags['skip-endpoint-check'] });
111
+ console.log(JSON.stringify(result));
112
+ if (!flags['skip-endpoint-check'] && !result.endpointVerified) {
113
+ console.error('Portal registration is saved. Start `tealbrick native serve` and the HTTPS proxy, then re-run enroll to verify the endpoint.');
114
+ process.exitCode = 2;
115
+ }
116
+ }
117
+ catch (error) {
118
+ if (error instanceof PortalHttpError && /^[a-z_]+$/.test(error.code ?? ''))
119
+ throw Error('kit_portal_' + error.code);
120
+ throw error;
121
+ }
122
+ return;
123
+ }
124
+ const command = args[0], flags = {};
125
+ // A bare `tealbrick native` or help request prints usage; it is not a failed setup.
126
+ if (!command || command === 'help' || command === '--help' || command === '-h') {
127
+ console.log(nativeUsage);
128
+ return;
129
+ }
130
+ for (let i = 1; i < args.length; i += 2) {
131
+ if (!/^--(root|harness|workspace|workspace-name|create-workspace|node|agent|agent-name|create-agent|delegation|issuer)$/.test(args[i]) || !args[i + 1] || flags[args[i].slice(2)])
132
+ throw Error('kit_native_invalid_arguments');
133
+ flags[args[i].slice(2)] = args[i + 1];
134
+ }
135
+ if (flags.root) {
136
+ root = resolve(flags.root);
137
+ process.chdir(root);
138
+ }
139
+ if (command === 'setup') {
140
+ if (flags.harness && !Object.hasOwn(harnesses, flags.harness))
141
+ throw Error('kit_native_harness_required');
142
+ if (!flags.harness)
143
+ throw Error('kit_native_harness_required');
144
+ if (flags.harness === 'codex' && flags.delegation !== 'disabled') {
145
+ const { confirm } = await import('@inquirer/prompts');
146
+ if (flags.delegation || !await confirm({ message: 'This Codex Tealbrick profile requires native delegation disabled until scoped child grants are supported. Continue with delegation disabled?', default: false }))
147
+ throw Error('kit_native_codex_delegation_opt_in_required');
148
+ flags.delegation = 'disabled';
149
+ }
150
+ const issuer = portalOrigin(flags.issuer ?? 'https://portal.tealbrick.com');
151
+ const login = await loginPortal(issuer, (url, code) => console.error(`Approve Tealbrick setup: ${url}\nCode: ${code}`), { label: deviceLabel(`native setup (${flags.harness})`, root) });
152
+ const { select, input } = await import('@inquirer/prompts');
153
+ try {
154
+ console.log(JSON.stringify(await guidedNativeSetup(root, flags, login, { choose: (message, choices) => select({ message, choices }), name: message => input({ message }) })));
155
+ }
156
+ catch (error) {
157
+ if (error instanceof PortalHttpError && /^[a-z_]+$/.test(error.code ?? ''))
158
+ throw Error('kit_portal_' + error.code);
159
+ throw error;
160
+ }
161
+ return;
162
+ }
163
+ if (command === 'config') {
164
+ const state = await readKit(root);
165
+ if (!state.native)
166
+ throw Error('kit_native_setup_required');
167
+ console.log(JSON.stringify(nativeSdkConfig(state.native.harness, root, { codexDelegationDisabled: flags.delegation === 'disabled' }), null, 2));
168
+ return;
169
+ }
170
+ if (command === 'mcp') {
171
+ await serveMcp(nativeConnector());
172
+ return;
173
+ }
174
+ if (command === 'marketplace-enable' || command === 'marketplace-disable') {
175
+ const old = await readKit(root);
176
+ if (!old.native)
177
+ throw Error('kit_native_setup_required');
178
+ await applyKit(root, { ...old, native: { ...old.native, marketplace: command === 'marketplace-enable' } });
179
+ console.log(JSON.stringify({ marketplace: command === 'marketplace-enable' }));
180
+ return;
181
+ }
182
+ if (command === 'disable' || command === 'enable') {
183
+ const old = await readKit(root);
184
+ if (!old.native)
185
+ throw Error('kit_native_setup_required');
186
+ await applyKit(root, { ...old, native: { ...old.native, active: command === 'enable' } });
187
+ console.log(JSON.stringify({ active: command === 'enable' }));
188
+ return;
189
+ }
190
+ console.error(nativeUsage);
191
+ process.exitCode = 2;
192
+ }
193
+ export { guidedNativeSetup, nativeSdkConfig };
@@ -1,5 +1,6 @@
1
1
  import { PortalClient } from '@tealbrick/portal';
2
2
  export interface PortalLogin {
3
+ issuer: string;
3
4
  client: PortalClient;
4
5
  org: string;
5
6
  userId: string;
@@ -7,15 +8,23 @@ export interface PortalLogin {
7
8
  id: string;
8
9
  name: string;
9
10
  }>;
11
+ /** Ephemeral user identity for endpoint verification. Never persisted. */
12
+ identity?: {
13
+ token: string;
14
+ bundle: string;
15
+ };
10
16
  }
11
17
  /** Reject URLs that would leak credentials or be silently truncated by registration. */
12
18
  export declare function portalOrigin(value: string): string;
13
19
  export declare function agentOrigin(value: string): string;
14
20
  /** Device authorization is interactive; user/refresh tokens never enter kit state. */
21
+ /** Label shown in Portal → Connected access: purpose, host and kit folder, so owners can tell devices apart (portal-core#15). */
22
+ export declare function deviceLabel(purpose: string, root?: string, host?: string): string;
15
23
  export declare function loginPortal(issuer: string, show: (url: string, code: string) => void, options?: {
16
24
  fetch?: typeof fetch;
17
25
  sleep?: (ms: number) => Promise<void>;
18
26
  now?: () => number;
27
+ label?: string;
19
28
  }): Promise<PortalLogin>;
20
29
  /** Reuse Portal's owned registration + revision-checked canvas APIs, not a parallel card store. */
21
30
  export declare function registerPortalCard(login: PortalLogin, input: {
@@ -1,4 +1,6 @@
1
1
  import { randomUUID } from 'node:crypto';
2
+ import { hostname } from 'node:os';
3
+ import { basename } from 'node:path';
2
4
  import { PortalClient, PortalHttpError } from '@tealbrick/portal';
3
5
  /** Reject URLs that would leak credentials or be silently truncated by registration. */
4
6
  export function portalOrigin(value) {
@@ -14,10 +16,15 @@ export function agentOrigin(value) {
14
16
  return url.origin;
15
17
  }
16
18
  /** Device authorization is interactive; user/refresh tokens never enter kit state. */
19
+ /** Label shown in Portal → Connected access: purpose, host and kit folder, so owners can tell devices apart (portal-core#15). */
20
+ export function deviceLabel(purpose, root = process.cwd(), host = hostname()) {
21
+ const folder = basename(root) || root;
22
+ return `Teal Brick ${purpose} · ${host.replace(/\.local$/, '')} · ${folder}`.replace(/[\u0000-\u001f]/g, '').slice(0, 120);
23
+ }
17
24
  export async function loginPortal(issuer, show, options = {}) {
18
25
  issuer = portalOrigin(issuer);
19
26
  const client = new PortalClient({ issuer, fetch: options.fetch });
20
- const device = await client.startDevice({ deviceId: randomUUID(), deviceLabel: 'Teal Brick package setup' });
27
+ const device = await client.startDevice({ deviceId: randomUUID(), deviceLabel: options.label ?? deviceLabel('setup') });
21
28
  const verification = new URL(device.verification_uri_complete);
22
29
  if (verification.origin !== issuer || verification.username || verification.password)
23
30
  throw Error('kit_portal_verification_origin_mismatch');
@@ -53,7 +60,7 @@ export async function loginPortal(issuer, show, options = {}) {
53
60
  const directory = await authenticated.request('/api/me/workspaces');
54
61
  if (!account.user?.id || !account.user.orgId || directory.accountId !== account.user.id || directory.organizationId !== account.user.orgId || !Array.isArray(directory.workspaces) || directory.workspaces.some(w => !w.id || !w.name))
55
62
  throw Error('kit_portal_account_mismatch');
56
- return { client: authenticated, org: account.user.orgId, userId: account.user.id, workspaces: directory.workspaces };
63
+ return { issuer, client: authenticated, org: account.user.orgId, userId: account.user.id, workspaces: directory.workspaces, identity: { token: session.token, bundle: session.bundle } };
57
64
  }
58
65
  /** Reuse Portal's owned registration + revision-checked canvas APIs, not a parallel card store. */
59
66
  export async function registerPortalCard(login, input) {
@@ -1,6 +1,6 @@
1
1
  import { password } from '@inquirer/prompts';
2
2
  import { createHash } from 'node:crypto';
3
- import { loginPortal, portalOrigin } from './onboarding.js';
3
+ import { deviceLabel, loginPortal, portalOrigin } from './onboarding.js';
4
4
  import { readKit, applyKit } from './index.js';
5
5
  function flags(args) { const out = {}; for (let i = 0; i < args.length; i += 2) {
6
6
  if (!/^--[a-z]+$/.test(args[i]) || !args[i + 1] || args[i + 1].startsWith('--'))
@@ -37,7 +37,7 @@ finally {
37
37
  export async function runtimeOnboarding(command, args, root) {
38
38
  const f = flags(args), old = await readKit(root), issuer = portalOrigin(f.issuer ?? old.portal?.issuer ?? 'https://portal.tealbrick.com');
39
39
  const workspaceId = required(f, 'workspace'), nodeId = required(f, 'node');
40
- const login = await loginPortal(issuer, (url, code) => console.log(`Approve this customer runtime in Portal: ${url}\nCode: ${code}`));
40
+ const login = await loginPortal(issuer, (url, code) => console.log(`Approve this customer runtime in Portal: ${url}\nCode: ${code}`), { label: deviceLabel(`runtime ${command}`, root) });
41
41
  if (!login.workspaces.some(w => w.id === workspaceId))
42
42
  throw Error('kit_portal_workspace_required');
43
43
  if (command === 'connect') {
@@ -50,7 +50,7 @@ export async function runtimeOnboarding(command, args, root) {
50
50
  const runtime = { issuer, org: login.org, workspaceId, agentId, connectionId: enrolled.connectionId, credentialRef: 'TEALBRICK_RUNTIME_CREDENTIAL', bindings: old.runtime?.bindings ?? {} };
51
51
  await applyKit(root, { ...old, runtime }, { TEALBRICK_RUNTIME_CREDENTIAL: enrolled.credential });
52
52
  console.log(JSON.stringify({ connectionId: enrolled.connectionId, workspaceId, agentId, expiresAt: enrolled.expiresAt, requiresReload: true }));
53
- console.log('Connected. Customer-side tools are mounted; rebuild/restart Eve. Claim a licensed Knowledge instance and set its local binding before calling it.');
53
+ console.log(old.native ? 'Connected. Native MCP will reload the current connection on each call.' : 'Connected. Customer-side tools are mounted; rebuild/restart Eve.');
54
54
  return;
55
55
  }
56
56
  if (!old.runtime || old.runtime.issuer !== issuer || old.runtime.workspaceId !== workspaceId || old.runtime.org !== login.org)
package/dist/secrets.d.ts CHANGED
@@ -1,3 +1,4 @@
1
- export declare function runtimeSecret(name: string): string;
1
+ /** Reads from the environment, then the kit root's private credentials file (cwd unless `root` is given). */
2
+ export declare function runtimeSecret(name: string, root?: string): string;
2
3
  /** Lazy: does not read credentials during discovery/build or for unused providers. */
3
4
  export declare function secretEnvironment(): NodeJS.ProcessEnv;
package/dist/secrets.js CHANGED
@@ -1,12 +1,14 @@
1
1
  import { readFileSync, lstatSync } from 'node:fs';
2
+ import { join } from 'node:path';
2
3
  const namePattern = /^TEALBRICK_[A-Z0-9_]+$/;
3
- export function runtimeSecret(name) {
4
+ /** Reads from the environment, then the kit root's private credentials file (cwd unless `root` is given). */
5
+ export function runtimeSecret(name, root) {
4
6
  if (!namePattern.test(name))
5
7
  throw Error('kit_invalid_secret_reference');
6
8
  let value = process.env[name];
7
9
  if (!value) {
8
10
  try {
9
- const path = '.tealbrick/kit.credentials.json', stat = lstatSync(path);
11
+ const path = root === undefined ? '.tealbrick/kit.credentials.json' : join(root, '.tealbrick', 'kit.credentials.json'), stat = lstatSync(path);
10
12
  if (!stat.isFile() || stat.isSymbolicLink() || (process.platform !== 'win32' && (stat.mode & 0o077)))
11
13
  throw Error('kit_secret_permissions');
12
14
  const data = JSON.parse(readFileSync(path, 'utf8'));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tealbrick/kit",
3
- "version": "0.2.7",
3
+ "version": "0.3.0-rc.10",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Complete Teal Brick package kit with explicit Eve capability activation",
@@ -13,7 +13,10 @@
13
13
  "LICENSE",
14
14
  "NOTICE",
15
15
  "BOOTSTRAP.md",
16
- "RUNTIME.md"
16
+ "RUNTIME.md",
17
+ "NATIVE.md",
18
+ "BUZZ.md",
19
+ "assets"
17
20
  ],
18
21
  "bin": {
19
22
  "tealbrick": "dist/cli.js"
@@ -30,23 +33,28 @@
30
33
  "./secrets": {
31
34
  "types": "./dist/secrets.d.ts",
32
35
  "import": "./dist/secrets.js"
33
- }
36
+ },
37
+ "./native": {
38
+ "types": "./dist/native.d.ts",
39
+ "import": "./dist/native.js"
40
+ },
41
+ "./cli": "./dist/cli.js"
34
42
  },
35
43
  "scripts": {
36
44
  "build": "npm run build --workspace @tealbrick/provider-transport --workspace @tealbrick/portal --workspace @tealbrick/voice --workspace @tealbrick/vision --workspace @tealbrick/deliver --workspace @tealbrick/avm && tsc -p tsconfig.json",
37
45
  "test": "node --test test/*.test.mjs"
38
46
  },
39
47
  "dependencies": {
40
- "@tealbrick/portal": "0.2.7",
41
- "@tealbrick/avm": "0.2.7",
42
- "@tealbrick/voice": "0.2.7",
43
- "@tealbrick/vision": "0.2.7",
44
- "@tealbrick/deliver": "0.2.7",
48
+ "@tealbrick/portal": "0.3.0-rc.10",
49
+ "@tealbrick/avm": "0.3.0-rc.10",
50
+ "@tealbrick/voice": "0.3.0-rc.10",
51
+ "@tealbrick/vision": "0.3.0-rc.10",
52
+ "@tealbrick/deliver": "0.3.0-rc.10",
45
53
  "@inquirer/prompts": "8.7.2",
46
54
  "zod": "^4.0.0"
47
55
  },
48
56
  "peerDependencies": {
49
- "eve": ">=0.66.0 <0.67.0"
57
+ "eve": ">=0.70.0 <0.71.0"
50
58
  },
51
59
  "peerDependenciesMeta": {
52
60
  "eve": {
@@ -59,6 +67,7 @@
59
67
  },
60
68
  "publishConfig": {
61
69
  "access": "public",
62
- "registry": "https://registry.npmjs.org"
70
+ "registry": "https://registry.npmjs.org",
71
+ "tag": "next"
63
72
  }
64
73
  }