@tealbrick/kit 0.3.0-rc.1 → 0.3.0-rc.3
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/BOOTSTRAP.md +3 -3
- package/NATIVE.md +8 -2
- package/README.md +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/native-selection.js +19 -4
- package/dist/native-setup.js +38 -15
- package/dist/native.d.ts +2 -0
- package/dist/native.js +13 -3
- package/package.json +6 -6
package/BOOTSTRAP.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
> Prerelease 0.3.0-rc.
|
|
1
|
+
> Prerelease 0.3.0-rc.2 targets fresh Eve 0.70 installations. Use the explicit candidate version or `next` tag after publication. Scoped `@tealbrick/*` `latest` remains 0.2.7 for existing Eve 0.66 installations; durable cross-version session migration is not validated.
|
|
2
2
|
|
|
3
3
|
# Deployment guide: Eve agent + Teal Brick kit
|
|
4
4
|
|
|
@@ -19,7 +19,7 @@ For a fresh machine, the sequence is:
|
|
|
19
19
|
|
|
20
20
|
1. Install Node 24 and npm.
|
|
21
21
|
2. Create an Eve 0.70.0 project and configure its primary model credentials.
|
|
22
|
-
3. Install `@tealbrick/kit@0.3.0-rc.
|
|
22
|
+
3. Install `@tealbrick/kit@0.3.0-rc.2` inside that project.
|
|
23
23
|
4. Run `tealbrick setup` to sign in, select capabilities and register the card.
|
|
24
24
|
5. Build and start Eve, then check a real chat from desktop.
|
|
25
25
|
|
|
@@ -81,7 +81,7 @@ Run this inside the Eve project created in step 2 (or your existing compatible
|
|
|
81
81
|
project), not in an empty directory or as a global install:
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
|
-
npm install --save-exact @tealbrick/kit@0.3.0-rc.
|
|
84
|
+
npm install --save-exact @tealbrick/kit@0.3.0-rc.2
|
|
85
85
|
```
|
|
86
86
|
|
|
87
87
|
This installs Portal, AVM, Voice, Vision, Deliver and the shared provider transport
|
package/NATIVE.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# Native agent setup — Stage A candidate
|
|
2
2
|
|
|
3
|
-
Prerelease suite **0.3.0-rc.
|
|
3
|
+
Prerelease suite **0.3.0-rc.2** targets the `next` tag. The seven scoped `@tealbrick/*` packages keep `latest` at 0.2.7, which lacks this flow. The unscoped `tealbrick` facade currently serves RC1 on both `latest` and `next`; RC2 will initially target `next`, with facade `latest` moved only after registry verification. The `tealbrick` facade forwards the existing kit CLI; it is not another SDK. Matching Portal runtime setup endpoints must be deployed before native onboarding can succeed.
|
|
4
4
|
|
|
5
5
|
## Install and connect
|
|
6
6
|
|
|
7
|
-
Install the review tarballs with the supplied checksum-verifying `install-candidate.mjs`. Once the release is actually published, the intended installation is `npm install --save-exact tealbrick@0.3.0-rc.
|
|
7
|
+
Install the review tarballs with the supplied checksum-verifying `install-candidate.mjs`. Once the release is actually published, the intended installation is `npm install --save-exact tealbrick@0.3.0-rc.2`. RC1 registry installation and live Foxy onboarding have been verified separately. The RC2 command below requires RC2 publication and registry verification; it is not yet a published installation path.
|
|
8
8
|
|
|
9
9
|
From your native agent workspace:
|
|
10
10
|
|
|
@@ -75,3 +75,9 @@ Each request reloads local activation and fetches signed Portal authorization. R
|
|
|
75
75
|
## Acceptance boundary
|
|
76
76
|
|
|
77
77
|
Disposable installed-artifact tests cover empty-account creation, named selection, permission/ambiguity denial, lost-response retry, signed config, scoped Knowledge-fixture read, revoke/reconnect, deactivation and MCP cancellation. They are not real browser consent or real Knowledge product proof. Root's separate Foxy receipt proves the earlier packed candidate's live Claude MCP inactive denial, exact-session process restart and compaction. Codex and LangChain have independent narrower fixture evidence, not live-provider parity. Marketplace, voice/vision and delegated Tealbrick grants are outside this Stage A claim.
|
|
78
|
+
|
|
79
|
+
## Name conflicts and interrupted setup
|
|
80
|
+
|
|
81
|
+
Existing cards are shown with their harness. A card for Eve cannot be converted to Claude by choosing its name. If a name is already used, select an explicitly compatible card or choose another name; setup keeps the approved login during this interaction. Duplicate compatible names require selecting the exact card ID.
|
|
82
|
+
|
|
83
|
+
A definitive Portal name-conflict rejection permits changing the proposed identity. A timeout or lost response does not: the private journal keeps the original request and idempotency key. Repeat `tealbrick setup --harness <harness>` without new identity-selection flags to reconcile that request. Changing an uncertain request fails with `kit_native_setup_pending_intent_mismatch`; do not delete the journal to bypass it.
|
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
> Prerelease 0.3.0-rc.
|
|
1
|
+
> Prerelease 0.3.0-rc.2 targets fresh Eve 0.70 installations. Use the explicit candidate version or `next` tag after publication. Scoped `@tealbrick/*` `latest` remains 0.2.7 for existing Eve 0.66 installations; durable cross-version session migration is not validated.
|
|
2
2
|
|
|
3
3
|
# @tealbrick/kit
|
|
4
4
|
|
|
@@ -9,7 +9,7 @@ availability, not agent permissions. Nothing is mounted by installing the kit.
|
|
|
9
9
|
Install inside an existing Eve 0.70.0 project:
|
|
10
10
|
|
|
11
11
|
```sh
|
|
12
|
-
npm install --save-exact @tealbrick/kit@0.3.0-rc.
|
|
12
|
+
npm install --save-exact @tealbrick/kit@0.3.0-rc.2
|
|
13
13
|
npx --no-install tealbrick setup
|
|
14
14
|
```
|
|
15
15
|
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -12,7 +12,7 @@ const ref = z.string().regex(/^TEALBRICK_[A-Z0-9_]+$/);
|
|
|
12
12
|
const runtime = z.object({ issuer: z.string().url(), org: z.string().min(1), workspaceId: z.string().min(1), agentId: z.string().min(1), connectionId: z.string().min(1), credentialRef: ref, bindings: z.record(z.string(), z.object({ endpoint: z.string().url(), instanceId: z.string().min(1), companyId: z.string().min(1), credentialRef: ref }).strict()) }).strict();
|
|
13
13
|
const command = z.tuple([z.string().min(1)]).rest(z.string());
|
|
14
14
|
const routines = z.object({ url: z.string().url(), credentialRef: ref, scope: z.object({ org: z.string().min(1), workspace: z.string().min(1), agent: z.string().min(1), owner: z.string().min(1) }).strict(), buildCommand: command, restartCommand: command }).strict();
|
|
15
|
-
const schema = z.object({ version: z.literal(1), native: z.object({ harness: z.enum(['claude', 'codex', 'langchain']), active: z.boolean() }).strict().optional(), selfEvolution: z.object({ policyModule: z.string().regex(/^deployment\/[a-zA-Z0-9_-]+\.(ts|js|mjs)$/) }).strict().optional(), routines: routines.optional(), portal: auth.optional(), runtime: runtime.optional(), voice: media.optional(), vision: media.optional(), deliver: z.unknown().optional(), avm: z.custom(v => avmConfigSchema.safeParse(v).success).transform(v => 'target' in v ? { target: v.target, sudo: v.sudo ?? false, ...Object.fromEntries(Object.entries(v).filter(([k]) => k !== 'target' && k !== 'sudo')) } : v).optional() }).strict();
|
|
15
|
+
const schema = z.object({ version: z.literal(1), native: z.object({ harness: z.enum(['claude', 'codex', 'langchain']), active: z.boolean(), marketplace: z.boolean().optional() }).strict().optional(), selfEvolution: z.object({ policyModule: z.string().regex(/^deployment\/[a-zA-Z0-9_-]+\.(ts|js|mjs)$/) }).strict().optional(), routines: routines.optional(), portal: auth.optional(), runtime: runtime.optional(), voice: media.optional(), vision: media.optional(), deliver: z.unknown().optional(), avm: z.custom(v => avmConfigSchema.safeParse(v).success).transform(v => 'target' in v ? { target: v.target, sudo: v.sudo ?? false, ...Object.fromEntries(Object.entries(v).filter(([k]) => k !== 'target' && k !== 'sudo')) } : v).optional() }).strict();
|
|
16
16
|
export const capabilities = ['portal', 'runtime', 'voice', 'vision', 'deliver', 'avm', 'routines', 'selfEvolution'];
|
|
17
17
|
const marker = '// Managed by @tealbrick/kit. Change selection with tealbrick setup.\n';
|
|
18
18
|
const render = (body) => marker + body + '\n';
|
package/dist/native-selection.js
CHANGED
|
@@ -37,6 +37,8 @@ export async function selectNativeIdentity(root, flags, login, prompts) {
|
|
|
37
37
|
if (workspaceName && flags.node)
|
|
38
38
|
throw Error('kit_native_existing_node_requires_workspace');
|
|
39
39
|
const cards = directory.agents.filter(a => a.harness === harness).map(agent => ({ agent }));
|
|
40
|
+
const unavailable = directory.agents.filter(a => a.harness !== harness).map(a => `${a.name} (${a.harness})`);
|
|
41
|
+
const context = unavailable.length ? ` Unavailable for ${harness}: ${unavailable.join(', ')}. Existing cards cannot be converted.` : '';
|
|
40
42
|
let agentId = flags.agent;
|
|
41
43
|
if (flags['agent-name']) {
|
|
42
44
|
const matches = cards.filter((c) => c.agent.name === flags['agent-name']);
|
|
@@ -48,9 +50,9 @@ export async function selectNativeIdentity(root, flags, login, prompts) {
|
|
|
48
50
|
agentId = old.runtime.agentId;
|
|
49
51
|
let name = flags['create-agent'];
|
|
50
52
|
if (!agentId && !name) {
|
|
51
|
-
const choice = cards.length ? await prompts.choose('Choose an agent to attach', [...cards.map((c) => ({ name: `${c.agent.name} (${c.agent.id})`, value: c.agent.id })), { name: 'Create an agent', value: '__create__' }]) : '__create__';
|
|
53
|
+
const choice = cards.length ? await prompts.choose('Choose an agent to attach.' + context, [...cards.map((c) => ({ name: `${c.agent.name} — ${c.agent.harness} (${c.agent.id})`, value: c.agent.id })), { name: 'Create an agent', value: '__create__' }]) : '__create__';
|
|
52
54
|
if (choice === '__create__')
|
|
53
|
-
name = await prompts.name('New agent name');
|
|
55
|
+
name = await prompts.name('New agent name.' + context);
|
|
54
56
|
else {
|
|
55
57
|
const card = cards.find((c) => c.agent.id === choice);
|
|
56
58
|
if (!card)
|
|
@@ -58,8 +60,21 @@ export async function selectNativeIdentity(root, flags, login, prompts) {
|
|
|
58
60
|
agentId = card.agent.id;
|
|
59
61
|
}
|
|
60
62
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
+
while (name) {
|
|
64
|
+
name = validName(name);
|
|
65
|
+
const conflicts = directory.agents.filter(a => a.name === name);
|
|
66
|
+
if (!conflicts.length)
|
|
67
|
+
return { workspace, agent: { name } };
|
|
68
|
+
const choice = await prompts.choose(`The name "${name}" already belongs to ${conflicts.map(a => `${a.name} (${a.harness}, ${a.id})`).join(', ')}. Select a compatible ${harness} card or choose another name.`, [...cards.map(c => ({ name: `${c.agent.name} — ${c.agent.harness} (${c.agent.id})`, value: c.agent.id })), { name: 'Choose another name', value: '__create__' }]);
|
|
69
|
+
if (choice === '__create__') {
|
|
70
|
+
name = await prompts.name('Different agent name.' + context);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (!cards.some(c => c.agent.id === choice))
|
|
74
|
+
throw Error('kit_owned_agent_card_required');
|
|
75
|
+
agentId = choice;
|
|
76
|
+
name = undefined;
|
|
77
|
+
}
|
|
63
78
|
const matches = cards.filter((c) => c.agent.id === agentId);
|
|
64
79
|
if (matches.length !== 1)
|
|
65
80
|
throw Error('kit_owned_agent_card_required');
|
package/dist/native-setup.js
CHANGED
|
@@ -2,6 +2,7 @@ import { randomUUID } from 'node:crypto';
|
|
|
2
2
|
import { join, resolve } from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
import { mkdir, lstat, readFile, writeFile, rename, unlink, realpath } from 'node:fs/promises';
|
|
5
|
+
import { PortalHttpError } from '@tealbrick/portal';
|
|
5
6
|
import { readKit } from './index.js';
|
|
6
7
|
import { selectNativeIdentity, harnessLabels } from './native-selection.js';
|
|
7
8
|
import { setupNative } from './native.js';
|
|
@@ -66,26 +67,48 @@ export async function guidedNativeSetup(root, flags, login, prompts) {
|
|
|
66
67
|
const stamp = { issuer: login.issuer, org: login.org, userId: login.userId, harness };
|
|
67
68
|
if (journal && JSON.stringify(journal.stamp) !== JSON.stringify(stamp))
|
|
68
69
|
throw Error('kit_native_setup_account_mismatch');
|
|
69
|
-
|
|
70
|
-
let
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const
|
|
75
|
-
if (
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
70
|
+
let request = journal?.status !== 'rejected' ? journal?.request : undefined;
|
|
71
|
+
let resuming = !!request;
|
|
72
|
+
let selectionFlags = { ...flags };
|
|
73
|
+
if (request) {
|
|
74
|
+
// A prior POST may already have created the identity. Reconcile that exact key first.
|
|
75
|
+
const mismatched = (flags.agent && request.agent.id !== flags.agent) || (flags['create-agent'] && request.agent.mode === 'create' && request.agent.name !== flags['create-agent'].trim()) || (flags.workspace && request.workspace.id !== flags.workspace) || (flags['create-workspace'] && request.workspace.name !== flags['create-workspace'].trim());
|
|
76
|
+
if (mismatched)
|
|
77
|
+
throw Error('kit_native_setup_pending_intent_mismatch');
|
|
78
|
+
}
|
|
79
|
+
const saveJournal = async (status) => { const tmp = journalPath + '.' + randomUUID(); await writeFile(tmp, JSON.stringify({ version: 1, stamp, request, status }) + '\n', { flag: 'wx', mode: 0o600 }); await rename(tmp, journalPath); };
|
|
80
|
+
let prepared;
|
|
81
|
+
for (let attempt = 0;; attempt++) {
|
|
82
|
+
if (!request) {
|
|
83
|
+
const chosen = await selectNativeIdentity(root, selectionFlags, login, prompts);
|
|
84
|
+
const agent = 'id' in chosen.agent ? { mode: 'attach', id: chosen.agent.id, harness: harnessLabels[harness] } : { mode: 'create', name: chosen.agent.name, harness: harnessLabels[harness] };
|
|
85
|
+
if (old.runtime && (!('id' in chosen.workspace) || chosen.workspace.id !== old.runtime.workspaceId || !('id' in chosen.agent) || chosen.agent.id !== old.runtime.agentId))
|
|
79
86
|
throw Error('kit_runtime_existing_binding_mismatch');
|
|
80
|
-
request = {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
87
|
+
request = { workspace: chosen.workspace, agent, idempotencyKey: randomUUID() };
|
|
88
|
+
await saveJournal('pending');
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
prepared = await login.client.request('/api/runtime/setup', request);
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
// This exact Portal error occurs before workspace/agent mutation. Other failures
|
|
96
|
+
// retain the pending request, including timeouts, lost responses and HTTP 5xx.
|
|
97
|
+
if (!(error instanceof PortalHttpError) || error.status !== 409 || error.code !== 'agent_name_exists_select_existing' || attempt >= 3 || request.agent.mode !== 'create')
|
|
98
|
+
throw error;
|
|
99
|
+
await saveJournal('rejected');
|
|
100
|
+
resuming = false;
|
|
101
|
+
selectionFlags = { harness, ...(request.workspace.id ? { workspace: request.workspace.id } : { 'create-workspace': request.workspace.name }), 'create-agent': request.agent.name };
|
|
102
|
+
request = undefined;
|
|
84
103
|
}
|
|
85
104
|
}
|
|
86
|
-
const prepared = await login.client.request('/api/runtime/setup', request);
|
|
87
105
|
if (!prepared.workspace?.id || !prepared.agent?.id || !prepared.nodeId || prepared.agent.harness !== harnessLabels[harness])
|
|
88
106
|
throw Error('kit_native_setup_response_invalid');
|
|
107
|
+
if (resuming && ((flags['create-agent'] && prepared.agent.name !== flags['create-agent'].trim()) || (flags['agent-name'] && prepared.agent.name !== flags['agent-name']) || (flags['workspace-name'] && prepared.workspace.name !== flags['workspace-name'])))
|
|
108
|
+
throw Error('kit_native_setup_pending_intent_mismatch');
|
|
109
|
+
if (flags.node && flags.node !== prepared.nodeId)
|
|
110
|
+
throw Error('kit_owned_agent_card_required');
|
|
111
|
+
await saveJournal('prepared');
|
|
89
112
|
const authenticated = { ...login, workspaces: [...login.workspaces.filter(w => w.id !== prepared.workspace.id), prepared.workspace] };
|
|
90
113
|
const result = await setupNative(root, { harness, workspaceId: prepared.workspace.id, nodeId: prepared.nodeId, agentId: prepared.agent.id }, authenticated);
|
|
91
114
|
const tmp = configPath + '.' + randomUUID();
|
package/dist/native.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { guidedNativeSetup, nativeSdkConfig } from './native-setup.js';
|
|
2
2
|
import { type PortalLogin } from './onboarding.js';
|
|
3
3
|
import { type KnowledgeOperation } from '@tealbrick/portal/runtime';
|
|
4
|
+
import { MarketplaceRuntimeConnector } from '@tealbrick/portal/marketplace-runtime';
|
|
4
5
|
declare const harnesses: {
|
|
5
6
|
readonly claude: "Claude Agent SDK";
|
|
6
7
|
readonly codex: "Codex";
|
|
@@ -22,6 +23,7 @@ export declare function setupNative(root: string, input: {
|
|
|
22
23
|
/** A fresh connector per invocation rechecks Portal and local activation. No authorization cache
|
|
23
24
|
* survives MCP reconnect, local deactivation or a request boundary. No session is created here. */
|
|
24
25
|
export declare function nativeConnector(): {
|
|
26
|
+
marketplace: () => Promise<MarketplaceRuntimeConnector | undefined>;
|
|
25
27
|
capabilities: () => Promise<{
|
|
26
28
|
revision: string;
|
|
27
29
|
expiresAt: number;
|
package/dist/native.js
CHANGED
|
@@ -4,6 +4,7 @@ import { applyKit, readKit } from './index.js';
|
|
|
4
4
|
import { loginPortal, portalOrigin } from './onboarding.js';
|
|
5
5
|
import { PortalHttpError } from '@tealbrick/portal';
|
|
6
6
|
import { RuntimeConnector } from '@tealbrick/portal/runtime';
|
|
7
|
+
import { MarketplaceRuntimeConnector } from '@tealbrick/portal/marketplace-runtime';
|
|
7
8
|
import { serveMcp } from '@tealbrick/portal/mcp';
|
|
8
9
|
import { runtimeSecret } from './secrets.js';
|
|
9
10
|
const harnesses = { claude: 'Claude Agent SDK', codex: 'Codex', langchain: 'LangChain' };
|
|
@@ -30,7 +31,7 @@ export async function setupNative(root, input, login) {
|
|
|
30
31
|
const enrolled = await login.client.request('/api/runtime/connections', { workspaceId: input.workspaceId, nodeId: input.nodeId, agentId: input.agentId });
|
|
31
32
|
if (!enrolled.connectionId || !enrolled.credential || !Number.isFinite(enrolled.expiresAt) || enrolled.expiresAt <= Date.now())
|
|
32
33
|
throw Error('kit_runtime_enrollment_failed');
|
|
33
|
-
await applyKit(root, { version: 1, native: { harness: input.harness, active: true }, 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 });
|
|
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 });
|
|
34
35
|
return { connected: true, agentId: input.agentId, connectionId: enrolled.connectionId, harness: input.harness };
|
|
35
36
|
}
|
|
36
37
|
/** A fresh connector per invocation rechecks Portal and local activation. No authorization cache
|
|
@@ -43,7 +44,8 @@ export function nativeConnector() {
|
|
|
43
44
|
const { credentialRef, ...runtime } = config.runtime;
|
|
44
45
|
return new RuntimeConnector({ ...runtime, credential: () => runtimeSecret(credentialRef), resolveCredential: runtimeSecret });
|
|
45
46
|
}
|
|
46
|
-
return {
|
|
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) };
|
|
47
49
|
}
|
|
48
50
|
export async function nativeCommand(args, root) {
|
|
49
51
|
const command = args[0], flags = {};
|
|
@@ -91,6 +93,14 @@ export async function nativeCommand(args, root) {
|
|
|
91
93
|
await serveMcp(nativeConnector());
|
|
92
94
|
return;
|
|
93
95
|
}
|
|
96
|
+
if (command === 'marketplace-enable' || command === 'marketplace-disable') {
|
|
97
|
+
const old = await readKit(root);
|
|
98
|
+
if (!old.native)
|
|
99
|
+
throw Error('kit_native_setup_required');
|
|
100
|
+
await applyKit(root, { ...old, native: { ...old.native, marketplace: command === 'marketplace-enable' } });
|
|
101
|
+
console.log(JSON.stringify({ marketplace: command === 'marketplace-enable' }));
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
94
104
|
if (command === 'disable' || command === 'enable') {
|
|
95
105
|
const old = await readKit(root);
|
|
96
106
|
if (!old.native)
|
|
@@ -99,6 +109,6 @@ export async function nativeCommand(args, root) {
|
|
|
99
109
|
console.log(JSON.stringify({ active: command === 'enable' }));
|
|
100
110
|
return;
|
|
101
111
|
}
|
|
102
|
-
throw Error('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 enable|disable');
|
|
112
|
+
throw Error('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 enable|disable | native marketplace-enable|marketplace-disable');
|
|
103
113
|
}
|
|
104
114
|
export { guidedNativeSetup, nativeSdkConfig };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tealbrick/kit",
|
|
3
|
-
"version": "0.3.0-rc.
|
|
3
|
+
"version": "0.3.0-rc.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Complete Teal Brick package kit with explicit Eve capability activation",
|
|
@@ -43,11 +43,11 @@
|
|
|
43
43
|
"test": "node --test test/*.test.mjs"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@tealbrick/portal": "0.3.0-rc.
|
|
47
|
-
"@tealbrick/avm": "0.3.0-rc.
|
|
48
|
-
"@tealbrick/voice": "0.3.0-rc.
|
|
49
|
-
"@tealbrick/vision": "0.3.0-rc.
|
|
50
|
-
"@tealbrick/deliver": "0.3.0-rc.
|
|
46
|
+
"@tealbrick/portal": "0.3.0-rc.3",
|
|
47
|
+
"@tealbrick/avm": "0.3.0-rc.3",
|
|
48
|
+
"@tealbrick/voice": "0.3.0-rc.3",
|
|
49
|
+
"@tealbrick/vision": "0.3.0-rc.3",
|
|
50
|
+
"@tealbrick/deliver": "0.3.0-rc.3",
|
|
51
51
|
"@inquirer/prompts": "8.7.2",
|
|
52
52
|
"zod": "^4.0.0"
|
|
53
53
|
},
|