struere 0.3.7 → 0.3.9
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/bin/struere.js +69 -74
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/index.js +69 -74
- package/dist/cli/templates/index.d.ts +1 -2
- package/dist/cli/templates/index.d.ts.map +1 -1
- package/dist/cli/utils/scaffold.d.ts.map +1 -1
- package/dist/define/index.d.ts +0 -1
- package/dist/define/index.d.ts.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -13
- package/dist/types.d.ts +0 -13
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/bin/struere.js
CHANGED
|
@@ -17313,7 +17313,6 @@ export default defineConfig({
|
|
|
17313
17313
|
function getAgentTs(name) {
|
|
17314
17314
|
const displayName = name.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
|
|
17315
17315
|
return `import { defineAgent } from 'struere'
|
|
17316
|
-
import { context } from './context'
|
|
17317
17316
|
import { tools } from './tools'
|
|
17318
17317
|
|
|
17319
17318
|
export default defineAgent({
|
|
@@ -17328,6 +17327,8 @@ export default defineAgent({
|
|
|
17328
17327
|
},
|
|
17329
17328
|
systemPrompt: \`You are ${displayName}, a helpful AI assistant.
|
|
17330
17329
|
|
|
17330
|
+
Current time: {{datetime}}
|
|
17331
|
+
|
|
17331
17332
|
Your capabilities:
|
|
17332
17333
|
- Answer questions accurately and helpfully
|
|
17333
17334
|
- Use available tools when appropriate
|
|
@@ -17335,30 +17336,6 @@ Your capabilities:
|
|
|
17335
17336
|
|
|
17336
17337
|
Always be concise, accurate, and helpful.\`,
|
|
17337
17338
|
tools,
|
|
17338
|
-
context,
|
|
17339
|
-
state: {
|
|
17340
|
-
storage: 'memory',
|
|
17341
|
-
ttl: 3600,
|
|
17342
|
-
},
|
|
17343
|
-
})
|
|
17344
|
-
`;
|
|
17345
|
-
}
|
|
17346
|
-
function getContextTs() {
|
|
17347
|
-
return `import { defineContext } from 'struere'
|
|
17348
|
-
|
|
17349
|
-
export const context = defineContext(async (request) => {
|
|
17350
|
-
const { conversationId, userId, channel, state } = request
|
|
17351
|
-
|
|
17352
|
-
return {
|
|
17353
|
-
additionalContext: \`
|
|
17354
|
-
Current conversation: \${conversationId}
|
|
17355
|
-
Channel: \${channel}
|
|
17356
|
-
\`,
|
|
17357
|
-
variables: {
|
|
17358
|
-
userId,
|
|
17359
|
-
timestamp: new Date().toISOString(),
|
|
17360
|
-
},
|
|
17361
|
-
}
|
|
17362
17339
|
})
|
|
17363
17340
|
`;
|
|
17364
17341
|
}
|
|
@@ -17480,7 +17457,7 @@ function getEnvLocal(deploymentUrl) {
|
|
|
17480
17457
|
return `STRUERE_DEPLOYMENT_URL=${deploymentUrl}
|
|
17481
17458
|
`;
|
|
17482
17459
|
}
|
|
17483
|
-
function
|
|
17460
|
+
function getClaudeMD(name) {
|
|
17484
17461
|
const displayName = name.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
|
|
17485
17462
|
return `# ${displayName} Agent
|
|
17486
17463
|
|
|
@@ -17491,7 +17468,6 @@ This is a Struere AI agent project. Struere is a framework for building producti
|
|
|
17491
17468
|
\`\`\`
|
|
17492
17469
|
src/
|
|
17493
17470
|
\u251C\u2500\u2500 agent.ts # Agent definition (system prompt, model, tools)
|
|
17494
|
-
\u251C\u2500\u2500 context.ts # Dynamic context injection per request
|
|
17495
17471
|
\u251C\u2500\u2500 tools.ts # Custom tool definitions
|
|
17496
17472
|
\u2514\u2500\u2500 workflows/ # Multi-step workflow definitions
|
|
17497
17473
|
tests/
|
|
@@ -17507,7 +17483,6 @@ Define your agent in \`src/agent.ts\`:
|
|
|
17507
17483
|
\`\`\`typescript
|
|
17508
17484
|
import { defineAgent } from 'struere'
|
|
17509
17485
|
import { tools } from './tools'
|
|
17510
|
-
import { context } from './context'
|
|
17511
17486
|
|
|
17512
17487
|
export default defineAgent({
|
|
17513
17488
|
name: 'my-agent',
|
|
@@ -17524,11 +17499,6 @@ export default defineAgent({
|
|
|
17524
17499
|
Current time: {{datetime}}
|
|
17525
17500
|
Customer: {{entity.get({"id": "{{thread.metadata.customerId}}"})}}\\\`,
|
|
17526
17501
|
tools,
|
|
17527
|
-
context,
|
|
17528
|
-
state: {
|
|
17529
|
-
storage: 'memory',
|
|
17530
|
-
ttl: 3600,
|
|
17531
|
-
},
|
|
17532
17502
|
})
|
|
17533
17503
|
\`\`\`
|
|
17534
17504
|
|
|
@@ -17669,33 +17639,6 @@ Example job operations:
|
|
|
17669
17639
|
{ "id": "job_abc123" }
|
|
17670
17640
|
\`\`\`
|
|
17671
17641
|
|
|
17672
|
-
## Context Function
|
|
17673
|
-
|
|
17674
|
-
Inject dynamic context per request in \`src/context.ts\`:
|
|
17675
|
-
|
|
17676
|
-
\`\`\`typescript
|
|
17677
|
-
import { defineContext } from 'struere'
|
|
17678
|
-
|
|
17679
|
-
export const context = defineContext(async (request) => {
|
|
17680
|
-
const { conversationId, userId, channel, state } = request
|
|
17681
|
-
|
|
17682
|
-
const userProfile = await fetchUserProfile(userId)
|
|
17683
|
-
|
|
17684
|
-
return {
|
|
17685
|
-
additionalContext: \\\`
|
|
17686
|
-
User: \${userProfile.name} (\${userProfile.tier} tier)
|
|
17687
|
-
Conversation: \${conversationId}
|
|
17688
|
-
Channel: \${channel}
|
|
17689
|
-
\\\`,
|
|
17690
|
-
variables: {
|
|
17691
|
-
userId,
|
|
17692
|
-
userTier: userProfile.tier,
|
|
17693
|
-
timestamp: new Date().toISOString(),
|
|
17694
|
-
},
|
|
17695
|
-
}
|
|
17696
|
-
})
|
|
17697
|
-
\`\`\`
|
|
17698
|
-
|
|
17699
17642
|
## Testing
|
|
17700
17643
|
|
|
17701
17644
|
Write YAML-based conversation tests in \`tests/\`:
|
|
@@ -17803,7 +17746,7 @@ curl -X POST https://your-deployment.convex.cloud/v1/chat \\
|
|
|
17803
17746
|
4. **Events**: Emit events for audit trails and analytics
|
|
17804
17747
|
5. **Jobs**: Use jobs for async operations (emails, notifications)
|
|
17805
17748
|
6. **Testing**: Write tests for critical conversation flows
|
|
17806
|
-
7. **
|
|
17749
|
+
7. **Thread Metadata**: Use metadata for user-specific personalization
|
|
17807
17750
|
`;
|
|
17808
17751
|
}
|
|
17809
17752
|
|
|
@@ -17841,12 +17784,11 @@ function scaffoldAgentFiles(cwd, projectName) {
|
|
|
17841
17784
|
"tsconfig.json": getTsConfig(),
|
|
17842
17785
|
"struere.config.ts": getStruereConfig(),
|
|
17843
17786
|
"src/agent.ts": getAgentTs(projectName),
|
|
17844
|
-
"src/context.ts": getContextTs(),
|
|
17845
17787
|
"src/tools.ts": getToolsTs(),
|
|
17846
17788
|
"src/workflows/.gitkeep": "",
|
|
17847
17789
|
"tests/basic.test.yaml": getBasicTestYaml(),
|
|
17848
17790
|
".env.example": getEnvExample(),
|
|
17849
|
-
".
|
|
17791
|
+
"CLAUDE.md": getClaudeMD(projectName)
|
|
17850
17792
|
};
|
|
17851
17793
|
for (const [relativePath, content] of Object.entries(files)) {
|
|
17852
17794
|
const fullPath = join3(cwd, relativePath);
|
|
@@ -18124,6 +18066,7 @@ function readLine() {
|
|
|
18124
18066
|
// src/cli/commands/dev.ts
|
|
18125
18067
|
var import_chokidar = __toESM(require_chokidar(), 1);
|
|
18126
18068
|
import { join as join7, basename as basename2 } from "path";
|
|
18069
|
+
import { existsSync as existsSync5, writeFileSync as writeFileSync4 } from "fs";
|
|
18127
18070
|
|
|
18128
18071
|
// src/cli/utils/config.ts
|
|
18129
18072
|
import { join as join5 } from "path";
|
|
@@ -18223,14 +18166,21 @@ var devCommand = new Command("dev").description("Sync agent to development envir
|
|
|
18223
18166
|
spinner.start("Loading agent");
|
|
18224
18167
|
let agent = await loadAgent(cwd);
|
|
18225
18168
|
spinner.succeed(`Agent "${agent.name}" loaded`);
|
|
18226
|
-
const
|
|
18169
|
+
const claudeMdPath = join7(cwd, "CLAUDE.md");
|
|
18170
|
+
if (!existsSync5(claudeMdPath)) {
|
|
18171
|
+
writeFileSync4(claudeMdPath, getClaudeMD(project.agent.slug));
|
|
18172
|
+
console.log(source_default.green("\u2713"), "Created CLAUDE.md");
|
|
18173
|
+
}
|
|
18174
|
+
let credentials = loadCredentials();
|
|
18227
18175
|
const apiKey = getApiKey();
|
|
18228
18176
|
if (!credentials && !apiKey) {
|
|
18229
|
-
|
|
18230
|
-
console.log();
|
|
18231
|
-
console.log(source_default.gray("Run"), source_default.cyan("struere login"), source_default.gray("to authenticate"));
|
|
18177
|
+
console.log(source_default.gray("Authentication required"));
|
|
18232
18178
|
console.log();
|
|
18233
|
-
|
|
18179
|
+
credentials = await performLogin();
|
|
18180
|
+
if (!credentials) {
|
|
18181
|
+
console.log(source_default.red("Authentication failed"));
|
|
18182
|
+
process.exit(1);
|
|
18183
|
+
}
|
|
18234
18184
|
}
|
|
18235
18185
|
spinner.start("Syncing to Convex");
|
|
18236
18186
|
const performSync = async () => {
|
|
@@ -18245,13 +18195,38 @@ var devCommand = new Command("dev").description("Sync agent to development envir
|
|
|
18245
18195
|
throw error;
|
|
18246
18196
|
}
|
|
18247
18197
|
};
|
|
18198
|
+
const isAuthError = (error) => {
|
|
18199
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
18200
|
+
return message.includes("Unauthenticated") || message.includes("OIDC") || message.includes("token") || message.includes("expired");
|
|
18201
|
+
};
|
|
18248
18202
|
try {
|
|
18249
18203
|
await performSync();
|
|
18250
18204
|
spinner.succeed("Synced to development");
|
|
18251
18205
|
} catch (error) {
|
|
18252
|
-
|
|
18253
|
-
|
|
18254
|
-
|
|
18206
|
+
if (isAuthError(error)) {
|
|
18207
|
+
spinner.fail("Session expired");
|
|
18208
|
+
console.log();
|
|
18209
|
+
console.log(source_default.gray("Re-authenticating..."));
|
|
18210
|
+
clearCredentials();
|
|
18211
|
+
credentials = await performLogin();
|
|
18212
|
+
if (!credentials) {
|
|
18213
|
+
console.log(source_default.red("Authentication failed"));
|
|
18214
|
+
process.exit(1);
|
|
18215
|
+
}
|
|
18216
|
+
spinner.start("Syncing to Convex");
|
|
18217
|
+
try {
|
|
18218
|
+
await performSync();
|
|
18219
|
+
spinner.succeed("Synced to development");
|
|
18220
|
+
} catch (retryError) {
|
|
18221
|
+
spinner.fail("Sync failed");
|
|
18222
|
+
console.log(source_default.red("Error:"), retryError instanceof Error ? retryError.message : String(retryError));
|
|
18223
|
+
process.exit(1);
|
|
18224
|
+
}
|
|
18225
|
+
} else {
|
|
18226
|
+
spinner.fail("Sync failed");
|
|
18227
|
+
console.log(source_default.red("Error:"), error instanceof Error ? error.message : String(error));
|
|
18228
|
+
process.exit(1);
|
|
18229
|
+
}
|
|
18255
18230
|
}
|
|
18256
18231
|
const devUrl = `https://${project.agent.slug}-dev.struere.dev`;
|
|
18257
18232
|
console.log();
|
|
@@ -18272,8 +18247,28 @@ var devCommand = new Command("dev").description("Sync agent to development envir
|
|
|
18272
18247
|
await performSync();
|
|
18273
18248
|
syncSpinner.succeed("Synced");
|
|
18274
18249
|
} catch (error) {
|
|
18275
|
-
|
|
18276
|
-
|
|
18250
|
+
if (isAuthError(error)) {
|
|
18251
|
+
syncSpinner.fail("Session expired");
|
|
18252
|
+
console.log();
|
|
18253
|
+
console.log(source_default.gray("Re-authenticating..."));
|
|
18254
|
+
clearCredentials();
|
|
18255
|
+
const newCredentials = await performLogin();
|
|
18256
|
+
if (!newCredentials) {
|
|
18257
|
+
console.log(source_default.red("Authentication failed"));
|
|
18258
|
+
return;
|
|
18259
|
+
}
|
|
18260
|
+
const retrySyncSpinner = ora("Syncing...").start();
|
|
18261
|
+
try {
|
|
18262
|
+
await performSync();
|
|
18263
|
+
retrySyncSpinner.succeed("Synced");
|
|
18264
|
+
} catch (retryError) {
|
|
18265
|
+
retrySyncSpinner.fail("Sync failed");
|
|
18266
|
+
console.log(source_default.red("Error:"), retryError instanceof Error ? retryError.message : String(retryError));
|
|
18267
|
+
}
|
|
18268
|
+
} else {
|
|
18269
|
+
syncSpinner.fail("Sync failed");
|
|
18270
|
+
console.log(source_default.red("Error:"), error instanceof Error ? error.message : String(error));
|
|
18271
|
+
}
|
|
18277
18272
|
}
|
|
18278
18273
|
});
|
|
18279
18274
|
process.on("SIGINT", () => {
|
|
@@ -19095,7 +19090,7 @@ var whoamiCommand = new Command("whoami").description("Show current logged in us
|
|
|
19095
19090
|
// package.json
|
|
19096
19091
|
var package_default = {
|
|
19097
19092
|
name: "struere",
|
|
19098
|
-
version: "0.3.
|
|
19093
|
+
version: "0.3.9",
|
|
19099
19094
|
description: "Build, test, and deploy AI agents",
|
|
19100
19095
|
keywords: [
|
|
19101
19096
|
"ai",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAenC,eAAO,MAAM,UAAU,SAuKnB,CAAA"}
|
package/dist/cli/index.js
CHANGED
|
@@ -652,7 +652,6 @@ export default defineConfig({
|
|
|
652
652
|
function getAgentTs(name) {
|
|
653
653
|
const displayName = name.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
|
|
654
654
|
return `import { defineAgent } from 'struere'
|
|
655
|
-
import { context } from './context'
|
|
656
655
|
import { tools } from './tools'
|
|
657
656
|
|
|
658
657
|
export default defineAgent({
|
|
@@ -667,6 +666,8 @@ export default defineAgent({
|
|
|
667
666
|
},
|
|
668
667
|
systemPrompt: \`You are ${displayName}, a helpful AI assistant.
|
|
669
668
|
|
|
669
|
+
Current time: {{datetime}}
|
|
670
|
+
|
|
670
671
|
Your capabilities:
|
|
671
672
|
- Answer questions accurately and helpfully
|
|
672
673
|
- Use available tools when appropriate
|
|
@@ -674,30 +675,6 @@ Your capabilities:
|
|
|
674
675
|
|
|
675
676
|
Always be concise, accurate, and helpful.\`,
|
|
676
677
|
tools,
|
|
677
|
-
context,
|
|
678
|
-
state: {
|
|
679
|
-
storage: 'memory',
|
|
680
|
-
ttl: 3600,
|
|
681
|
-
},
|
|
682
|
-
})
|
|
683
|
-
`;
|
|
684
|
-
}
|
|
685
|
-
function getContextTs() {
|
|
686
|
-
return `import { defineContext } from 'struere'
|
|
687
|
-
|
|
688
|
-
export const context = defineContext(async (request) => {
|
|
689
|
-
const { conversationId, userId, channel, state } = request
|
|
690
|
-
|
|
691
|
-
return {
|
|
692
|
-
additionalContext: \`
|
|
693
|
-
Current conversation: \${conversationId}
|
|
694
|
-
Channel: \${channel}
|
|
695
|
-
\`,
|
|
696
|
-
variables: {
|
|
697
|
-
userId,
|
|
698
|
-
timestamp: new Date().toISOString(),
|
|
699
|
-
},
|
|
700
|
-
}
|
|
701
678
|
})
|
|
702
679
|
`;
|
|
703
680
|
}
|
|
@@ -819,7 +796,7 @@ function getEnvLocal(deploymentUrl) {
|
|
|
819
796
|
return `STRUERE_DEPLOYMENT_URL=${deploymentUrl}
|
|
820
797
|
`;
|
|
821
798
|
}
|
|
822
|
-
function
|
|
799
|
+
function getClaudeMD(name) {
|
|
823
800
|
const displayName = name.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
|
|
824
801
|
return `# ${displayName} Agent
|
|
825
802
|
|
|
@@ -830,7 +807,6 @@ This is a Struere AI agent project. Struere is a framework for building producti
|
|
|
830
807
|
\`\`\`
|
|
831
808
|
src/
|
|
832
809
|
\u251C\u2500\u2500 agent.ts # Agent definition (system prompt, model, tools)
|
|
833
|
-
\u251C\u2500\u2500 context.ts # Dynamic context injection per request
|
|
834
810
|
\u251C\u2500\u2500 tools.ts # Custom tool definitions
|
|
835
811
|
\u2514\u2500\u2500 workflows/ # Multi-step workflow definitions
|
|
836
812
|
tests/
|
|
@@ -846,7 +822,6 @@ Define your agent in \`src/agent.ts\`:
|
|
|
846
822
|
\`\`\`typescript
|
|
847
823
|
import { defineAgent } from 'struere'
|
|
848
824
|
import { tools } from './tools'
|
|
849
|
-
import { context } from './context'
|
|
850
825
|
|
|
851
826
|
export default defineAgent({
|
|
852
827
|
name: 'my-agent',
|
|
@@ -863,11 +838,6 @@ export default defineAgent({
|
|
|
863
838
|
Current time: {{datetime}}
|
|
864
839
|
Customer: {{entity.get({"id": "{{thread.metadata.customerId}}"})}}\\\`,
|
|
865
840
|
tools,
|
|
866
|
-
context,
|
|
867
|
-
state: {
|
|
868
|
-
storage: 'memory',
|
|
869
|
-
ttl: 3600,
|
|
870
|
-
},
|
|
871
841
|
})
|
|
872
842
|
\`\`\`
|
|
873
843
|
|
|
@@ -1008,33 +978,6 @@ Example job operations:
|
|
|
1008
978
|
{ "id": "job_abc123" }
|
|
1009
979
|
\`\`\`
|
|
1010
980
|
|
|
1011
|
-
## Context Function
|
|
1012
|
-
|
|
1013
|
-
Inject dynamic context per request in \`src/context.ts\`:
|
|
1014
|
-
|
|
1015
|
-
\`\`\`typescript
|
|
1016
|
-
import { defineContext } from 'struere'
|
|
1017
|
-
|
|
1018
|
-
export const context = defineContext(async (request) => {
|
|
1019
|
-
const { conversationId, userId, channel, state } = request
|
|
1020
|
-
|
|
1021
|
-
const userProfile = await fetchUserProfile(userId)
|
|
1022
|
-
|
|
1023
|
-
return {
|
|
1024
|
-
additionalContext: \\\`
|
|
1025
|
-
User: \${userProfile.name} (\${userProfile.tier} tier)
|
|
1026
|
-
Conversation: \${conversationId}
|
|
1027
|
-
Channel: \${channel}
|
|
1028
|
-
\\\`,
|
|
1029
|
-
variables: {
|
|
1030
|
-
userId,
|
|
1031
|
-
userTier: userProfile.tier,
|
|
1032
|
-
timestamp: new Date().toISOString(),
|
|
1033
|
-
},
|
|
1034
|
-
}
|
|
1035
|
-
})
|
|
1036
|
-
\`\`\`
|
|
1037
|
-
|
|
1038
981
|
## Testing
|
|
1039
982
|
|
|
1040
983
|
Write YAML-based conversation tests in \`tests/\`:
|
|
@@ -1142,7 +1085,7 @@ curl -X POST https://your-deployment.convex.cloud/v1/chat \\
|
|
|
1142
1085
|
4. **Events**: Emit events for audit trails and analytics
|
|
1143
1086
|
5. **Jobs**: Use jobs for async operations (emails, notifications)
|
|
1144
1087
|
6. **Testing**: Write tests for critical conversation flows
|
|
1145
|
-
7. **
|
|
1088
|
+
7. **Thread Metadata**: Use metadata for user-specific personalization
|
|
1146
1089
|
`;
|
|
1147
1090
|
}
|
|
1148
1091
|
|
|
@@ -1180,12 +1123,11 @@ function scaffoldAgentFiles(cwd, projectName) {
|
|
|
1180
1123
|
"tsconfig.json": getTsConfig(),
|
|
1181
1124
|
"struere.config.ts": getStruereConfig(),
|
|
1182
1125
|
"src/agent.ts": getAgentTs(projectName),
|
|
1183
|
-
"src/context.ts": getContextTs(),
|
|
1184
1126
|
"src/tools.ts": getToolsTs(),
|
|
1185
1127
|
"src/workflows/.gitkeep": "",
|
|
1186
1128
|
"tests/basic.test.yaml": getBasicTestYaml(),
|
|
1187
1129
|
".env.example": getEnvExample(),
|
|
1188
|
-
".
|
|
1130
|
+
"CLAUDE.md": getClaudeMD(projectName)
|
|
1189
1131
|
};
|
|
1190
1132
|
for (const [relativePath, content] of Object.entries(files)) {
|
|
1191
1133
|
const fullPath = join3(cwd, relativePath);
|
|
@@ -1466,6 +1408,7 @@ import chalk3 from "chalk";
|
|
|
1466
1408
|
import ora3 from "ora";
|
|
1467
1409
|
import chokidar from "chokidar";
|
|
1468
1410
|
import { join as join7, basename as basename2 } from "path";
|
|
1411
|
+
import { existsSync as existsSync5, writeFileSync as writeFileSync4 } from "fs";
|
|
1469
1412
|
|
|
1470
1413
|
// src/cli/utils/config.ts
|
|
1471
1414
|
import { join as join5 } from "path";
|
|
@@ -1565,14 +1508,21 @@ var devCommand = new Command3("dev").description("Sync agent to development envi
|
|
|
1565
1508
|
spinner.start("Loading agent");
|
|
1566
1509
|
let agent = await loadAgent(cwd);
|
|
1567
1510
|
spinner.succeed(`Agent "${agent.name}" loaded`);
|
|
1568
|
-
const
|
|
1511
|
+
const claudeMdPath = join7(cwd, "CLAUDE.md");
|
|
1512
|
+
if (!existsSync5(claudeMdPath)) {
|
|
1513
|
+
writeFileSync4(claudeMdPath, getClaudeMD(project.agent.slug));
|
|
1514
|
+
console.log(chalk3.green("\u2713"), "Created CLAUDE.md");
|
|
1515
|
+
}
|
|
1516
|
+
let credentials = loadCredentials();
|
|
1569
1517
|
const apiKey = getApiKey();
|
|
1570
1518
|
if (!credentials && !apiKey) {
|
|
1571
|
-
|
|
1572
|
-
console.log();
|
|
1573
|
-
console.log(chalk3.gray("Run"), chalk3.cyan("struere login"), chalk3.gray("to authenticate"));
|
|
1519
|
+
console.log(chalk3.gray("Authentication required"));
|
|
1574
1520
|
console.log();
|
|
1575
|
-
|
|
1521
|
+
credentials = await performLogin();
|
|
1522
|
+
if (!credentials) {
|
|
1523
|
+
console.log(chalk3.red("Authentication failed"));
|
|
1524
|
+
process.exit(1);
|
|
1525
|
+
}
|
|
1576
1526
|
}
|
|
1577
1527
|
spinner.start("Syncing to Convex");
|
|
1578
1528
|
const performSync = async () => {
|
|
@@ -1587,13 +1537,38 @@ var devCommand = new Command3("dev").description("Sync agent to development envi
|
|
|
1587
1537
|
throw error;
|
|
1588
1538
|
}
|
|
1589
1539
|
};
|
|
1540
|
+
const isAuthError = (error) => {
|
|
1541
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
1542
|
+
return message.includes("Unauthenticated") || message.includes("OIDC") || message.includes("token") || message.includes("expired");
|
|
1543
|
+
};
|
|
1590
1544
|
try {
|
|
1591
1545
|
await performSync();
|
|
1592
1546
|
spinner.succeed("Synced to development");
|
|
1593
1547
|
} catch (error) {
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1548
|
+
if (isAuthError(error)) {
|
|
1549
|
+
spinner.fail("Session expired");
|
|
1550
|
+
console.log();
|
|
1551
|
+
console.log(chalk3.gray("Re-authenticating..."));
|
|
1552
|
+
clearCredentials();
|
|
1553
|
+
credentials = await performLogin();
|
|
1554
|
+
if (!credentials) {
|
|
1555
|
+
console.log(chalk3.red("Authentication failed"));
|
|
1556
|
+
process.exit(1);
|
|
1557
|
+
}
|
|
1558
|
+
spinner.start("Syncing to Convex");
|
|
1559
|
+
try {
|
|
1560
|
+
await performSync();
|
|
1561
|
+
spinner.succeed("Synced to development");
|
|
1562
|
+
} catch (retryError) {
|
|
1563
|
+
spinner.fail("Sync failed");
|
|
1564
|
+
console.log(chalk3.red("Error:"), retryError instanceof Error ? retryError.message : String(retryError));
|
|
1565
|
+
process.exit(1);
|
|
1566
|
+
}
|
|
1567
|
+
} else {
|
|
1568
|
+
spinner.fail("Sync failed");
|
|
1569
|
+
console.log(chalk3.red("Error:"), error instanceof Error ? error.message : String(error));
|
|
1570
|
+
process.exit(1);
|
|
1571
|
+
}
|
|
1597
1572
|
}
|
|
1598
1573
|
const devUrl = `https://${project.agent.slug}-dev.struere.dev`;
|
|
1599
1574
|
console.log();
|
|
@@ -1614,8 +1589,28 @@ var devCommand = new Command3("dev").description("Sync agent to development envi
|
|
|
1614
1589
|
await performSync();
|
|
1615
1590
|
syncSpinner.succeed("Synced");
|
|
1616
1591
|
} catch (error) {
|
|
1617
|
-
|
|
1618
|
-
|
|
1592
|
+
if (isAuthError(error)) {
|
|
1593
|
+
syncSpinner.fail("Session expired");
|
|
1594
|
+
console.log();
|
|
1595
|
+
console.log(chalk3.gray("Re-authenticating..."));
|
|
1596
|
+
clearCredentials();
|
|
1597
|
+
const newCredentials = await performLogin();
|
|
1598
|
+
if (!newCredentials) {
|
|
1599
|
+
console.log(chalk3.red("Authentication failed"));
|
|
1600
|
+
return;
|
|
1601
|
+
}
|
|
1602
|
+
const retrySyncSpinner = ora3("Syncing...").start();
|
|
1603
|
+
try {
|
|
1604
|
+
await performSync();
|
|
1605
|
+
retrySyncSpinner.succeed("Synced");
|
|
1606
|
+
} catch (retryError) {
|
|
1607
|
+
retrySyncSpinner.fail("Sync failed");
|
|
1608
|
+
console.log(chalk3.red("Error:"), retryError instanceof Error ? retryError.message : String(retryError));
|
|
1609
|
+
}
|
|
1610
|
+
} else {
|
|
1611
|
+
syncSpinner.fail("Sync failed");
|
|
1612
|
+
console.log(chalk3.red("Error:"), error instanceof Error ? error.message : String(error));
|
|
1613
|
+
}
|
|
1619
1614
|
}
|
|
1620
1615
|
});
|
|
1621
1616
|
process.on("SIGINT", () => {
|
|
@@ -2460,7 +2455,7 @@ var whoamiCommand = new Command11("whoami").description("Show current logged in
|
|
|
2460
2455
|
// package.json
|
|
2461
2456
|
var package_default = {
|
|
2462
2457
|
name: "struere",
|
|
2463
|
-
version: "0.3.
|
|
2458
|
+
version: "0.3.9",
|
|
2464
2459
|
description: "Build, test, and deploy AI agents",
|
|
2465
2460
|
keywords: [
|
|
2466
2461
|
"ai",
|
|
@@ -2,12 +2,11 @@ export declare function getPackageJson(name: string): string;
|
|
|
2
2
|
export declare function getTsConfig(): string;
|
|
3
3
|
export declare function getStruereConfig(): string;
|
|
4
4
|
export declare function getAgentTs(name: string): string;
|
|
5
|
-
export declare function getContextTs(): string;
|
|
6
5
|
export declare function getToolsTs(): string;
|
|
7
6
|
export declare function getBasicTestYaml(): string;
|
|
8
7
|
export declare function getEnvExample(): string;
|
|
9
8
|
export declare function getGitignore(): string;
|
|
10
9
|
export declare function getStruereJson(agentId: string, team: string, slug: string, name: string): string;
|
|
11
10
|
export declare function getEnvLocal(deploymentUrl: string): string;
|
|
12
|
-
export declare function
|
|
11
|
+
export declare function getClaudeMD(name: string): string;
|
|
13
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/index.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuBnD;AAED,wBAAgB,WAAW,IAAI,MAAM,CAsBpC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAgBzC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/index.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuBnD;AAED,wBAAgB,WAAW,IAAI,MAAM,CAsBpC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAgBzC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgC/C;AAED,wBAAgB,UAAU,IAAI,MAAM,CAoDnC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAmBzC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAatC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAgBrC;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAahG;AAED,wBAAgB,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuShD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/scaffold.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/scaffold.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB;AAeD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,cAAc,CAexF;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,cAAc,CA+BrF;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc,CA8BnF;AAsBD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAElD"}
|
package/dist/define/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/define/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/define/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export { defineAgent } from './define/agent';
|
|
2
|
-
export { defineContext } from './define/context';
|
|
3
2
|
export { defineTools } from './define/tools';
|
|
4
3
|
export { defineConfig } from './define/config';
|
|
5
|
-
export type { AgentConfig, ModelConfig, ToolReference, ToolParameters, ParameterDefinition, ToolHandler, ToolContext, StateAccessor, WorkflowReference, StateConfig,
|
|
4
|
+
export type { AgentConfig, ModelConfig, ToolReference, ToolParameters, ParameterDefinition, ToolHandler, ToolContext, StateAccessor, WorkflowReference, StateConfig, FrameworkConfig, CorsConfig, LoggingConfig, AuthConfig, Message, Conversation, TestCase, TestMessage, TestToolCall, TestAssertion, DeployConfig, ScalingConfig, } from './types';
|
|
6
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,YAAY,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,UAAU,EACV,aAAa,EACb,UAAU,EACV,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,aAAa,GACd,MAAM,SAAS,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -19,18 +19,6 @@ function defineAgent(config) {
|
|
|
19
19
|
...config
|
|
20
20
|
};
|
|
21
21
|
}
|
|
22
|
-
// src/define/context.ts
|
|
23
|
-
function defineContext(fn) {
|
|
24
|
-
return async (request) => {
|
|
25
|
-
try {
|
|
26
|
-
const result = await fn(request);
|
|
27
|
-
return result ?? {};
|
|
28
|
-
} catch (error) {
|
|
29
|
-
console.error("Context function error:", error);
|
|
30
|
-
return {};
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
22
|
// src/define/tools.ts
|
|
35
23
|
function defineTools(tools) {
|
|
36
24
|
return tools.map(validateTool);
|
|
@@ -92,7 +80,6 @@ function defineConfig(config = {}) {
|
|
|
92
80
|
}
|
|
93
81
|
export {
|
|
94
82
|
defineTools,
|
|
95
|
-
defineContext,
|
|
96
83
|
defineConfig,
|
|
97
84
|
defineAgent
|
|
98
85
|
};
|
package/dist/types.d.ts
CHANGED
|
@@ -7,7 +7,6 @@ export interface AgentConfig {
|
|
|
7
7
|
tools?: ToolReference[];
|
|
8
8
|
workflows?: WorkflowReference[];
|
|
9
9
|
state?: StateConfig;
|
|
10
|
-
context?: ContextFunction;
|
|
11
10
|
}
|
|
12
11
|
export interface ModelConfig {
|
|
13
12
|
provider: 'anthropic' | 'openai' | 'google' | 'custom';
|
|
@@ -54,18 +53,6 @@ export interface StateConfig {
|
|
|
54
53
|
ttl?: number;
|
|
55
54
|
prefix?: string;
|
|
56
55
|
}
|
|
57
|
-
export type ContextFunction = (request: ContextRequest) => Promise<ContextResult>;
|
|
58
|
-
export interface ContextRequest {
|
|
59
|
-
conversationId: string;
|
|
60
|
-
userId?: string;
|
|
61
|
-
channel: string;
|
|
62
|
-
message: string;
|
|
63
|
-
state: StateAccessor;
|
|
64
|
-
}
|
|
65
|
-
export interface ContextResult {
|
|
66
|
-
additionalContext?: string;
|
|
67
|
-
variables?: Record<string, unknown>;
|
|
68
|
-
}
|
|
69
56
|
export interface FrameworkConfig {
|
|
70
57
|
port?: number;
|
|
71
58
|
host?: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,YAAY,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;IACvD,KAAK,CAAC,EAAE,aAAa,EAAE,CAAA;IACvB,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAA;IAC/B,KAAK,CAAC,EAAE,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|