create-theokit 1.24.0 → 1.25.1
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/cli.js +154 -55
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
- package/templates/_bot-preset/agents/lib/bot-scope.ts +62 -0
- package/templates/_bot-preset/agents/lib/sandbox.ts +21 -0
- package/templates/_bot-preset/agents/publisher.ts +33 -0
- package/templates/_bot-preset/agents/researcher.ts +30 -0
- package/templates/_bot-preset/agents/tools/publish.ts +28 -0
- package/templates/_bot-preset/agents/tools/read-notes.ts +34 -0
- package/templates/_bot-preset/agents/tools/write-note.ts +43 -0
- package/templates/_bot-preset/server/crons/daily-research.ts +44 -0
- package/templates/_bot-preset/server/delivery.ts +69 -0
- package/templates/default/.env.example +1 -1
- package/templates/default/README.md.tmpl +1 -1
- package/templates/default/agents/chat.ts +12 -4
- package/templates/default/app/about/page.tsx +7 -0
- package/templates/default/docs/ARCHITECTURE.md +1 -1
- package/templates/default/docs/ENVIRONMENT.md +11 -3
- package/templates/default/dot-claude/skills/theokit-agents/SKILL.md +8 -5
- package/templates/default/dot-claude/skills/theokit-gateways/SKILL.md +29 -1
- package/templates/default/package.json.tmpl +1 -1
package/dist/cli.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
// src/cli.ts
|
|
4
4
|
import { execSync } from "child_process";
|
|
5
|
-
import { readFileSync as
|
|
6
|
-
import { resolve as
|
|
5
|
+
import { readFileSync as readFileSync6, unlinkSync as unlinkSync5, mkdirSync, renameSync as renameSync2, existsSync as existsSync6, rmSync as rmSync5 } from "fs";
|
|
6
|
+
import { resolve as resolve5 } from "path";
|
|
7
7
|
|
|
8
8
|
// src/clone-example.ts
|
|
9
9
|
import { execFileSync } from "child_process";
|
|
@@ -82,17 +82,17 @@ var DEFAULTS = {
|
|
|
82
82
|
agentsMd: true
|
|
83
83
|
};
|
|
84
84
|
async function ask(rl, question, defaultVal) {
|
|
85
|
-
return new Promise((
|
|
85
|
+
return new Promise((resolve6) => {
|
|
86
86
|
const suffix = defaultVal ? "(Y/n)" : "(y/N)";
|
|
87
87
|
rl.question(` ${question} ${suffix} `, (answer) => {
|
|
88
88
|
const a = answer.trim().toLowerCase();
|
|
89
|
-
if (a === "")
|
|
90
|
-
else
|
|
89
|
+
if (a === "") resolve6(defaultVal);
|
|
90
|
+
else resolve6(a === "y" || a === "yes");
|
|
91
91
|
});
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
94
|
async function askChoice(rl, question, choices, defaultIdx = 0) {
|
|
95
|
-
return new Promise((
|
|
95
|
+
return new Promise((resolve6) => {
|
|
96
96
|
console.log(` ${question}`);
|
|
97
97
|
for (let i = 0; i < choices.length; i++) {
|
|
98
98
|
const marker = i === defaultIdx ? "\u276F" : " ";
|
|
@@ -100,7 +100,7 @@ async function askChoice(rl, question, choices, defaultIdx = 0) {
|
|
|
100
100
|
}
|
|
101
101
|
rl.question(" Choice (number): ", (answer) => {
|
|
102
102
|
const n = parseInt(answer.trim(), 10);
|
|
103
|
-
|
|
103
|
+
resolve6(n >= 1 && n <= choices.length ? n - 1 : defaultIdx);
|
|
104
104
|
});
|
|
105
105
|
});
|
|
106
106
|
}
|
|
@@ -472,17 +472,17 @@ var CLI_VERSION = readVersion();
|
|
|
472
472
|
|
|
473
473
|
// src/index.ts
|
|
474
474
|
import {
|
|
475
|
-
existsSync as
|
|
476
|
-
cpSync as
|
|
477
|
-
readFileSync as
|
|
475
|
+
existsSync as existsSync5,
|
|
476
|
+
cpSync as cpSync4,
|
|
477
|
+
readFileSync as readFileSync5,
|
|
478
478
|
renameSync,
|
|
479
479
|
unlinkSync as unlinkSync4,
|
|
480
480
|
readdirSync as readdirSync3,
|
|
481
481
|
rmSync as rmSync4,
|
|
482
482
|
statSync as statSync3
|
|
483
483
|
} from "fs";
|
|
484
|
-
import { resolve as
|
|
485
|
-
import { fileURLToPath as
|
|
484
|
+
import { resolve as resolve4, join as join6, dirname as dirname4 } from "path";
|
|
485
|
+
import { fileURLToPath as fileURLToPath4 } from "url";
|
|
486
486
|
|
|
487
487
|
// src/bare-transform.ts
|
|
488
488
|
import { existsSync as existsSync3, readFileSync as readFileSync3, unlinkSync as unlinkSync3, rmSync as rmSync3 } from "fs";
|
|
@@ -546,10 +546,86 @@ function applyBareTransform(targetDir, options = {}) {
|
|
|
546
546
|
}
|
|
547
547
|
}
|
|
548
548
|
|
|
549
|
+
// src/bot-preset.ts
|
|
550
|
+
import { cpSync as cpSync3, existsSync as existsSync4, readFileSync as readFileSync4, writeFileSync } from "fs";
|
|
551
|
+
import { dirname as dirname3, join as join5, resolve as resolve3 } from "path";
|
|
552
|
+
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
553
|
+
var PRESET_FILES = [
|
|
554
|
+
"agents/researcher.ts",
|
|
555
|
+
"agents/publisher.ts",
|
|
556
|
+
"agents/lib/bot-scope.ts",
|
|
557
|
+
"agents/lib/sandbox.ts",
|
|
558
|
+
"agents/tools/read-notes.ts",
|
|
559
|
+
"agents/tools/write-note.ts",
|
|
560
|
+
"agents/tools/publish.ts",
|
|
561
|
+
"server/delivery.ts",
|
|
562
|
+
"server/crons/daily-research.ts"
|
|
563
|
+
];
|
|
564
|
+
function presetRoot() {
|
|
565
|
+
return resolve3(dirname3(fileURLToPath3(import.meta.url)), "../templates/_bot-preset");
|
|
566
|
+
}
|
|
567
|
+
function applyBotPreset(options) {
|
|
568
|
+
const from = presetRoot();
|
|
569
|
+
const missing = PRESET_FILES.filter((f) => !existsSync4(join5(from, f)));
|
|
570
|
+
if (missing.length > 0) {
|
|
571
|
+
throw new Error(
|
|
572
|
+
`--preset=bot is incomplete in this build: missing ${missing.join(", ")}. Refusing to scaffold a partial preset.`
|
|
573
|
+
);
|
|
574
|
+
}
|
|
575
|
+
for (const file of PRESET_FILES) {
|
|
576
|
+
cpSync3(join5(from, file), join5(options.targetDir, file), { recursive: true });
|
|
577
|
+
}
|
|
578
|
+
appendBotReadme(options.targetDir);
|
|
579
|
+
}
|
|
580
|
+
function appendBotReadme(targetDir) {
|
|
581
|
+
const path = join5(targetDir, "README.md");
|
|
582
|
+
let current;
|
|
583
|
+
try {
|
|
584
|
+
current = readFileSync4(path, "utf-8");
|
|
585
|
+
} catch (error) {
|
|
586
|
+
if (error.code === "ENOENT") return;
|
|
587
|
+
throw error;
|
|
588
|
+
}
|
|
589
|
+
writeFileSync(path, `${current}
|
|
590
|
+
${BOT_README_SECTION}`, "utf-8");
|
|
591
|
+
}
|
|
592
|
+
var BOT_README_SECTION = `
|
|
593
|
+
## Bots (\`--preset=bot\`)
|
|
594
|
+
|
|
595
|
+
Two agents that work unattended:
|
|
596
|
+
|
|
597
|
+
- **researcher** \u2014 writes notes into its own workspace on a schedule
|
|
598
|
+
- **publisher** \u2014 reads those notes and publishes, behind a human approval
|
|
599
|
+
|
|
600
|
+
\`\`\`bash
|
|
601
|
+
# drive one directly
|
|
602
|
+
curl -X POST localhost:3000/api/agents/researcher \\
|
|
603
|
+
-H 'content-type: application/json' -H 'X-Theo-Action: 1' \\
|
|
604
|
+
-d '{"topic":"what changed in our dependencies this week"}'
|
|
605
|
+
\`\`\`
|
|
606
|
+
|
|
607
|
+
### What to change first
|
|
608
|
+
|
|
609
|
+
**\`server/delivery.ts\`** prints to the console. That is the honest local behaviour and the reason
|
|
610
|
+
the scaffold runs before you configure anything \u2014 but a bot whose approvals only print is a bot
|
|
611
|
+
nobody can approve. Point it at a channel you actually read; one commented example is in the file.
|
|
612
|
+
|
|
613
|
+
**\`server/crons/daily-research.ts\`** runs at 09:00 UTC. Cron schedules are UTC, not local.
|
|
614
|
+
|
|
615
|
+
### What is already decided for you
|
|
616
|
+
|
|
617
|
+
Each bot writes only inside \`.bots/<id>/\`, enforced by a resolved-path check rather than by asking
|
|
618
|
+
the model nicely. \`publisher\` can read the researcher's notes and cannot write them \u2014 that
|
|
619
|
+
asymmetry comes from \`botScope\`'s write root, so it holds even when a prompt says otherwise.
|
|
620
|
+
|
|
621
|
+
\`publish\` is gated by \`.approval()\`. On an attended run the surface shows the prompt; on a
|
|
622
|
+
scheduled one there is no attached client, which is what \`server/delivery.ts\` exists for.
|
|
623
|
+
`;
|
|
624
|
+
|
|
549
625
|
// src/index.ts
|
|
550
|
-
var __dirname3 =
|
|
626
|
+
var __dirname3 = dirname4(fileURLToPath4(import.meta.url));
|
|
551
627
|
function getTemplateDir(templateName = "default") {
|
|
552
|
-
return
|
|
628
|
+
return resolve4(__dirname3, "../templates", templateName);
|
|
553
629
|
}
|
|
554
630
|
function isValidProjectName(name) {
|
|
555
631
|
return /^[a-z0-9][a-z0-9._-]*$/.test(name);
|
|
@@ -561,43 +637,43 @@ function scaffold(targetDir, projectName, templateName = "default", options = {}
|
|
|
561
637
|
);
|
|
562
638
|
}
|
|
563
639
|
const templateDir = getTemplateDir(templateName);
|
|
564
|
-
if (!
|
|
640
|
+
if (!existsSync5(templateDir)) {
|
|
565
641
|
throw new Error(`Template "${templateName}" not found. Available templates: default`);
|
|
566
642
|
}
|
|
567
|
-
const resolvedName = projectName === "." ?
|
|
643
|
+
const resolvedName = projectName === "." ? resolve4(targetDir).split("/").pop() ?? "my-app" : projectName;
|
|
568
644
|
if (!isValidProjectName(resolvedName)) {
|
|
569
645
|
throw new Error(
|
|
570
646
|
`Invalid project name "${resolvedName}". Use lowercase letters, numbers, hyphens, and dots. Must start with a letter or number.`
|
|
571
647
|
);
|
|
572
648
|
}
|
|
573
|
-
if (
|
|
649
|
+
if (existsSync5(targetDir)) {
|
|
574
650
|
const contents = readdirSync3(targetDir);
|
|
575
651
|
if (contents.length > 0) {
|
|
576
652
|
throw new Error(`Directory "${targetDir}" is not empty. Please use an empty directory.`);
|
|
577
653
|
}
|
|
578
654
|
}
|
|
579
|
-
|
|
655
|
+
cpSync4(templateDir, targetDir, { recursive: true });
|
|
580
656
|
for (const [from, to] of [
|
|
581
657
|
["_gitignore", ".gitignore"],
|
|
582
658
|
["_prettierignore", ".prettierignore"]
|
|
583
659
|
]) {
|
|
584
|
-
const src =
|
|
585
|
-
if (
|
|
586
|
-
renameSync(src,
|
|
660
|
+
const src = join6(targetDir, from);
|
|
661
|
+
if (existsSync5(src)) {
|
|
662
|
+
renameSync(src, join6(targetDir, to));
|
|
587
663
|
}
|
|
588
664
|
}
|
|
589
|
-
const dotClaudeSrc =
|
|
590
|
-
const dotClaudeDest =
|
|
591
|
-
if (
|
|
665
|
+
const dotClaudeSrc = join6(targetDir, "dot-claude");
|
|
666
|
+
const dotClaudeDest = join6(targetDir, ".claude");
|
|
667
|
+
if (existsSync5(dotClaudeSrc)) {
|
|
592
668
|
renameSync(dotClaudeSrc, dotClaudeDest);
|
|
593
669
|
}
|
|
594
670
|
for (const entry of readdirSync3(targetDir)) {
|
|
595
671
|
if (!entry.endsWith(".tmpl")) continue;
|
|
596
|
-
const src =
|
|
672
|
+
const src = join6(targetDir, entry);
|
|
597
673
|
const stat = statSync3(src);
|
|
598
674
|
if (!stat.isFile()) continue;
|
|
599
|
-
const dst =
|
|
600
|
-
const content =
|
|
675
|
+
const dst = join6(targetDir, entry.slice(0, -".tmpl".length));
|
|
676
|
+
const content = readFileSync5(src, "utf-8");
|
|
601
677
|
const replaced = content.replace(/\{\{name\}\}/g, resolvedName);
|
|
602
678
|
writeScaffoldFile(dst, replaced);
|
|
603
679
|
unlinkSync4(src);
|
|
@@ -616,6 +692,16 @@ Original error: ${original}`
|
|
|
616
692
|
);
|
|
617
693
|
}
|
|
618
694
|
}
|
|
695
|
+
if (options.botPreset) {
|
|
696
|
+
try {
|
|
697
|
+
applyBotPreset({ targetDir });
|
|
698
|
+
} catch (err) {
|
|
699
|
+
rmSync4(targetDir, { recursive: true, force: true });
|
|
700
|
+
const original = err instanceof Error ? err.message : String(err);
|
|
701
|
+
throw new Error(`Scaffold rolled back: bot preset failed.
|
|
702
|
+
Original error: ${original}`);
|
|
703
|
+
}
|
|
704
|
+
}
|
|
619
705
|
}
|
|
620
706
|
|
|
621
707
|
// src/cli.ts
|
|
@@ -640,6 +726,7 @@ function showHelp() {
|
|
|
640
726
|
--template=<name> Template to use (default: "default")
|
|
641
727
|
--surface=<web|tui|desktop> App surface (default: "web") \u2014 tui (Ink) / desktop (Tauri)
|
|
642
728
|
--bare Minimal app (no @theokit/* deps)
|
|
729
|
+
--preset=bot Layer the unattended-agent shape over the template
|
|
643
730
|
--skip-install Scaffold files only, skip package install
|
|
644
731
|
--disable-git Skip git init
|
|
645
732
|
--use-npm Use npm as package manager
|
|
@@ -656,12 +743,23 @@ function showHelp() {
|
|
|
656
743
|
npx create-theokit my-app
|
|
657
744
|
npx create-theokit my-app --bare --skip-install
|
|
658
745
|
npx create-theokit my-app --surface=tui
|
|
746
|
+
npx create-theokit my-app --preset=bot
|
|
659
747
|
npx create-theokit my-app --surface=desktop
|
|
660
748
|
npx create-theokit my-app --use-bun --biome
|
|
661
749
|
npx create-theokit my-app --example=https://github.com/user/repo
|
|
662
750
|
npx create-theokit my-app --import-alias="~/*"
|
|
663
751
|
`);
|
|
664
752
|
}
|
|
753
|
+
function parsePresetFlag(args) {
|
|
754
|
+
const preset = getFlag(args, "preset");
|
|
755
|
+
if (preset === void 0) return false;
|
|
756
|
+
if (preset !== "bot") {
|
|
757
|
+
console.error("");
|
|
758
|
+
console.error(`Unknown preset "${preset}". The only preset today is \`bot\`.`);
|
|
759
|
+
process.exit(1);
|
|
760
|
+
}
|
|
761
|
+
return true;
|
|
762
|
+
}
|
|
665
763
|
async function main() {
|
|
666
764
|
try {
|
|
667
765
|
assertNodeVersion(process.version);
|
|
@@ -687,6 +785,7 @@ async function main() {
|
|
|
687
785
|
}
|
|
688
786
|
const templateName = getFlag(args, "template") ?? "default";
|
|
689
787
|
const bare = hasFlag(args, "bare");
|
|
788
|
+
const botPreset = parsePresetFlag(args);
|
|
690
789
|
const skipInstall = hasFlag(args, "skip-install");
|
|
691
790
|
const useDefaults = hasFlag(args, "yes");
|
|
692
791
|
const disableGit = hasFlag(args, "disable-git");
|
|
@@ -722,7 +821,7 @@ async function main() {
|
|
|
722
821
|
);
|
|
723
822
|
process.exit(1);
|
|
724
823
|
}
|
|
725
|
-
const targetDir =
|
|
824
|
+
const targetDir = resolve5(process.cwd(), projectName);
|
|
726
825
|
if (exampleFlag) {
|
|
727
826
|
try {
|
|
728
827
|
console.log(`
|
|
@@ -763,10 +862,10 @@ Cloning example "${exampleFlag}" into ${projectName}...
|
|
|
763
862
|
const backendsSuffix = backends.length > 0 ? ` [+services: ${backends.join(", ")}]` : "";
|
|
764
863
|
console.log(
|
|
765
864
|
`
|
|
766
|
-
Creating TheoKit project "${projectName}" (template: ${templateName})${suffix}${surfaceSuffix}${backendsSuffix}...
|
|
865
|
+
Creating TheoKit project "${projectName}" (template: ${templateName})${suffix}${surfaceSuffix}${backendsSuffix}${botPreset ? " + bot preset" : ""}...
|
|
767
866
|
`
|
|
768
867
|
);
|
|
769
|
-
scaffold(targetDir, projectName, templateName, { bare });
|
|
868
|
+
scaffold(targetDir, projectName, templateName, { bare, botPreset });
|
|
770
869
|
applySurfaceStep(targetDir, projectName, surface, options);
|
|
771
870
|
applyOptions(targetDir, options, { importAlias, useBiome });
|
|
772
871
|
if (backends.length > 0) {
|
|
@@ -813,11 +912,11 @@ Original error: ${original}`);
|
|
|
813
912
|
options.srcDir = false;
|
|
814
913
|
}
|
|
815
914
|
function applyOptions(targetDir, options, opts) {
|
|
816
|
-
const pkgPath =
|
|
915
|
+
const pkgPath = resolve5(targetDir, "package.json");
|
|
817
916
|
if (opts.useBiome) {
|
|
818
|
-
const eslintPath =
|
|
819
|
-
if (
|
|
820
|
-
const pkg = JSON.parse(
|
|
917
|
+
const eslintPath = resolve5(targetDir, "eslint.config.mjs");
|
|
918
|
+
if (existsSync6(eslintPath)) unlinkSync5(eslintPath);
|
|
919
|
+
const pkg = JSON.parse(readFileSync6(pkgPath, "utf-8"));
|
|
821
920
|
delete pkg.devDependencies.eslint;
|
|
822
921
|
delete pkg.devDependencies["eslint-config-prettier"];
|
|
823
922
|
delete pkg.devDependencies["typescript-eslint"];
|
|
@@ -828,7 +927,7 @@ function applyOptions(targetDir, options, opts) {
|
|
|
828
927
|
pkg.scripts["format:check"] = "biome format .";
|
|
829
928
|
writeScaffoldFile(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
|
|
830
929
|
writeScaffoldFile(
|
|
831
|
-
|
|
930
|
+
resolve5(targetDir, "biome.json"),
|
|
832
931
|
JSON.stringify(
|
|
833
932
|
{
|
|
834
933
|
$schema: "https://biomejs.dev/schemas/1.9.0/schema.json",
|
|
@@ -841,9 +940,9 @@ function applyOptions(targetDir, options, opts) {
|
|
|
841
940
|
) + "\n"
|
|
842
941
|
);
|
|
843
942
|
} else if (!options.eslint) {
|
|
844
|
-
const eslintPath =
|
|
845
|
-
if (
|
|
846
|
-
const pkg = JSON.parse(
|
|
943
|
+
const eslintPath = resolve5(targetDir, "eslint.config.mjs");
|
|
944
|
+
if (existsSync6(eslintPath)) unlinkSync5(eslintPath);
|
|
945
|
+
const pkg = JSON.parse(readFileSync6(pkgPath, "utf-8"));
|
|
847
946
|
delete pkg.scripts.lint;
|
|
848
947
|
delete pkg.scripts["lint:fix"];
|
|
849
948
|
delete pkg.devDependencies.eslint;
|
|
@@ -852,34 +951,34 @@ function applyOptions(targetDir, options, opts) {
|
|
|
852
951
|
writeScaffoldFile(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
|
|
853
952
|
}
|
|
854
953
|
if (options.tailwind) {
|
|
855
|
-
const pkg = JSON.parse(
|
|
954
|
+
const pkg = JSON.parse(readFileSync6(pkgPath, "utf-8"));
|
|
856
955
|
pkg.devDependencies = pkg.devDependencies ?? {};
|
|
857
956
|
pkg.devDependencies.tailwindcss = "^4.0.0";
|
|
858
957
|
pkg.devDependencies["@tailwindcss/vite"] = "^4.0.0";
|
|
859
958
|
writeScaffoldFile(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
|
|
860
|
-
const cssDir =
|
|
861
|
-
const cssPath =
|
|
862
|
-
const existing =
|
|
959
|
+
const cssDir = existsSync6(resolve5(targetDir, "src/app")) ? "src/app" : "app";
|
|
960
|
+
const cssPath = resolve5(targetDir, `${cssDir}/globals.css`);
|
|
961
|
+
const existing = existsSync6(cssPath) ? readFileSync6(cssPath, "utf-8") : "";
|
|
863
962
|
writeScaffoldFile(cssPath, '@import "tailwindcss";\n\n' + existing);
|
|
864
963
|
}
|
|
865
964
|
if (options.srcDir) {
|
|
866
|
-
const srcDir =
|
|
965
|
+
const srcDir = resolve5(targetDir, "src");
|
|
867
966
|
mkdirSync(srcDir, { recursive: true });
|
|
868
967
|
for (const dir of ["app", "server"]) {
|
|
869
|
-
const from =
|
|
870
|
-
const to =
|
|
871
|
-
if (
|
|
968
|
+
const from = resolve5(targetDir, dir);
|
|
969
|
+
const to = resolve5(srcDir, dir);
|
|
970
|
+
if (existsSync6(from)) renameSync2(from, to);
|
|
872
971
|
}
|
|
873
|
-
const configFrom =
|
|
874
|
-
if (
|
|
875
|
-
const tscPath2 =
|
|
876
|
-
const tsc2 = JSON.parse(
|
|
972
|
+
const configFrom = resolve5(targetDir, "theo.config.ts");
|
|
973
|
+
if (existsSync6(configFrom)) renameSync2(configFrom, resolve5(srcDir, "theo.config.ts"));
|
|
974
|
+
const tscPath2 = resolve5(targetDir, "tsconfig.json");
|
|
975
|
+
const tsc2 = JSON.parse(readFileSync6(tscPath2, "utf-8"));
|
|
877
976
|
tsc2.compilerOptions.baseUrl = "src";
|
|
878
977
|
tsc2.include = ["src/**/*.ts", "src/**/*.tsx"];
|
|
879
978
|
writeScaffoldFile(tscPath2, JSON.stringify(tsc2, null, 2) + "\n");
|
|
880
979
|
}
|
|
881
|
-
const tscPath =
|
|
882
|
-
const tsc = JSON.parse(
|
|
980
|
+
const tscPath = resolve5(targetDir, "tsconfig.json");
|
|
981
|
+
const tsc = JSON.parse(readFileSync6(tscPath, "utf-8"));
|
|
883
982
|
if (!options.aliases) {
|
|
884
983
|
delete tsc.compilerOptions.baseUrl;
|
|
885
984
|
delete tsc.compilerOptions.paths;
|
|
@@ -893,8 +992,8 @@ function applyOptions(targetDir, options, opts) {
|
|
|
893
992
|
}
|
|
894
993
|
writeScaffoldFile(tscPath, JSON.stringify(tsc, null, 2) + "\n");
|
|
895
994
|
if (!options.agentsMd) {
|
|
896
|
-
const agentsPath =
|
|
897
|
-
if (
|
|
995
|
+
const agentsPath = resolve5(targetDir, "AGENTS.md");
|
|
996
|
+
if (existsSync6(agentsPath)) unlinkSync5(agentsPath);
|
|
898
997
|
}
|
|
899
998
|
}
|
|
900
999
|
function initGit(targetDir) {
|
|
@@ -913,6 +1012,6 @@ main().catch((err) => {
|
|
|
913
1012
|
process.exit(1);
|
|
914
1013
|
});
|
|
915
1014
|
export {
|
|
916
|
-
|
|
1015
|
+
parsePresetFlag
|
|
917
1016
|
};
|
|
918
1017
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/clone-example.ts","../src/install.ts","../src/pkg-manager.ts","../src/preflight-node.ts","../src/prompts.ts","../src/scaffold-services.ts","../src/write-file.ts","../src/scaffold-surface.ts","../src/version.ts","../src/index.ts","../src/bare-transform.ts"],"mappings":"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","names":["readFileSync","unlinkSync","renameSync","existsSync","rmSync","resolve","resolve","join","join","cpSync","existsSync","readdirSync","readFileSync","rmSync","statSync","unlinkSync","dirname","join","resolve","fileURLToPath","__dirname","dirname","fileURLToPath","resolve","substituteTmpls","readdirSync","join","statSync","readFileSync","unlinkSync","existsSync","cpSync","rmSync","require","existsSync","cpSync","readFileSync","unlinkSync","readdirSync","rmSync","statSync","resolve","join","dirname","fileURLToPath","existsSync","readFileSync","unlinkSync","rmSync","join","join","existsSync","readFileSync","unlinkSync","rmSync","__dirname","dirname","fileURLToPath","resolve","existsSync","readdirSync","cpSync","join","statSync","readFileSync","unlinkSync","rmSync","resolve","rmSync","existsSync","unlinkSync","readFileSync","renameSync","tscPath","tsc"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/clone-example.ts","../src/install.ts","../src/pkg-manager.ts","../src/preflight-node.ts","../src/prompts.ts","../src/scaffold-services.ts","../src/write-file.ts","../src/scaffold-surface.ts","../src/version.ts","../src/index.ts","../src/bare-transform.ts","../src/bot-preset.ts"],"mappings":"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","names":["readFileSync","unlinkSync","renameSync","existsSync","rmSync","resolve","resolve","join","join","cpSync","existsSync","readdirSync","readFileSync","rmSync","statSync","unlinkSync","dirname","join","resolve","fileURLToPath","__dirname","dirname","fileURLToPath","resolve","substituteTmpls","readdirSync","join","statSync","readFileSync","unlinkSync","existsSync","cpSync","rmSync","require","existsSync","cpSync","readFileSync","unlinkSync","readdirSync","rmSync","statSync","resolve","join","dirname","fileURLToPath","existsSync","readFileSync","unlinkSync","rmSync","join","join","existsSync","readFileSync","unlinkSync","rmSync","cpSync","existsSync","readFileSync","dirname","join","resolve","fileURLToPath","__dirname","dirname","fileURLToPath","resolve","existsSync","readdirSync","cpSync","join","statSync","readFileSync","unlinkSync","rmSync","resolve","rmSync","existsSync","unlinkSync","readFileSync","renameSync","tscPath","tsc"]}
|
package/package.json
CHANGED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { deriveConversationId } from '@theokit/agents'
|
|
2
|
+
import { bindToolScope } from '@theokit/agents/tool-scope'
|
|
3
|
+
import type { SandboxProvider } from '@theokit/agents/sandbox'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Everything one bot needs, per request, in one call.
|
|
7
|
+
*
|
|
8
|
+
* This is the piece a bot builder currently rediscovers. Three separate providers have to line up
|
|
9
|
+
* for a bot to be isolated from its siblings, and each is documented somewhere else:
|
|
10
|
+
*
|
|
11
|
+
* - **conversation** — `deriveConversationId(resource, thread)` keeps one bot's history out of
|
|
12
|
+
* another's. Without it, two bots sharing a store read each other's turns.
|
|
13
|
+
* - **tools** — `bindToolScope({ projectRoot, writeRoot, sandbox })` confines what the bot can
|
|
14
|
+
* touch. The sandbox is REQUIRED by that API on purpose: an omitted one used to produce an
|
|
15
|
+
* unconfined shell in silence.
|
|
16
|
+
* - **workspace** — a directory per bot, so "confined" means confined to its own work and not to
|
|
17
|
+
* the whole app.
|
|
18
|
+
*
|
|
19
|
+
* Composing them here means a new bot is one call rather than three decisions, and — more to the
|
|
20
|
+
* point — the isolation is the DEFAULT instead of something each bot has to remember.
|
|
21
|
+
*/
|
|
22
|
+
export interface BotScope {
|
|
23
|
+
/** Pass to the run so this bot's history is its own. */
|
|
24
|
+
readonly conversationId: string
|
|
25
|
+
/** Pass to tools so this bot writes only inside its own workspace. */
|
|
26
|
+
readonly tools: ReturnType<typeof bindToolScope>
|
|
27
|
+
/** Where this bot's work lives on disk. */
|
|
28
|
+
readonly workspace: string
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface BotScopeInput {
|
|
32
|
+
/** Which bot. Becomes the conversation `resource` and the workspace directory name. */
|
|
33
|
+
readonly botId: string
|
|
34
|
+
/**
|
|
35
|
+
* Which thread of that bot's work — a ticket id, a channel, a schedule name. Defaults to
|
|
36
|
+
* `'default'` so a single-threaded bot needs no ceremony.
|
|
37
|
+
*/
|
|
38
|
+
readonly thread?: string
|
|
39
|
+
/** The app root. Everything is derived under it. */
|
|
40
|
+
readonly projectRoot: string
|
|
41
|
+
/**
|
|
42
|
+
* The confinement, required for the same reason `bindToolScope` requires it: a caller who wants
|
|
43
|
+
* none must say so with a `danger-full-access` provider, which appears in a review. An omission
|
|
44
|
+
* appears nowhere.
|
|
45
|
+
*/
|
|
46
|
+
readonly sandbox: SandboxProvider
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function botScope(input: BotScopeInput): BotScope {
|
|
50
|
+
const workspace = `${input.projectRoot}/.bots/${input.botId}`
|
|
51
|
+
return {
|
|
52
|
+
conversationId: deriveConversationId(input.botId, input.thread ?? 'default'),
|
|
53
|
+
// `writeRoot` is the bot's own directory, not the project: a bot that can write anywhere in the
|
|
54
|
+
// app is a bot that can edit its siblings' work, and nothing here asked for that.
|
|
55
|
+
tools: bindToolScope({
|
|
56
|
+
projectRoot: input.projectRoot,
|
|
57
|
+
writeRoot: workspace,
|
|
58
|
+
sandbox: input.sandbox,
|
|
59
|
+
}),
|
|
60
|
+
workspace,
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createSandboxBackend, type SandboxProvider } from '@theokit/agents/sandbox'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The confinement every bot in this scaffold runs under.
|
|
5
|
+
*
|
|
6
|
+
* `workspace-write` is the honest default for a bot: it writes, and only inside the roots the
|
|
7
|
+
* sandbox names. The two alternatives are wrong here in opposite directions — `read-only` makes a
|
|
8
|
+
* bot that cannot do its job, and `danger-full-access` hands an unattended agent the whole machine.
|
|
9
|
+
*
|
|
10
|
+
* Built through the SDK's own factory rather than by hand. The first draft of this file returned
|
|
11
|
+
* `{ mode: 'workspace-write' }` cast to the type, which `tsc` refused on the scaffolded app — and it
|
|
12
|
+
* was right to: a `SandboxProvider` is a BACKEND (or a function returning one), not a config object.
|
|
13
|
+
* The factory is documented as an "honest factory": it uses kernel enforcement where bwrap exists,
|
|
14
|
+
* and where it does not it warns once and falls back rather than pretending to sandbox.
|
|
15
|
+
*
|
|
16
|
+
* It is a function rather than a constant so a real deployment can swap the backend — a container, a
|
|
17
|
+
* remote sandbox — without every tool learning a new shape.
|
|
18
|
+
*/
|
|
19
|
+
export function workspaceSandbox(): SandboxProvider {
|
|
20
|
+
return createSandboxBackend({ mode: 'workspace-write' })
|
|
21
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { AgentBuilder } from '@theokit/agents'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
|
|
4
|
+
import { publishTool } from './tools/publish.js'
|
|
5
|
+
import { readNotesTool } from './tools/read-notes.js'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* `publisher` — turns the researcher's notes into something that leaves the building.
|
|
9
|
+
*
|
|
10
|
+
* The second bot, and the one that shows what a bot product has to solve that a chat app does not:
|
|
11
|
+
* **nobody is watching when this runs**. The approval below pauses the run, and on a schedule there
|
|
12
|
+
* is no attached client to show it to — which is why `server/delivery.ts` exists and why its seam is
|
|
13
|
+
* not optional in a template called `bot`.
|
|
14
|
+
*
|
|
15
|
+
* It can read the researcher's notes and cannot write them. That asymmetry is enforced by
|
|
16
|
+
* `botScope`'s `writeRoot`, not by instruction: a prompt asking a model not to write is a request,
|
|
17
|
+
* and a write root is a wall.
|
|
18
|
+
*/
|
|
19
|
+
export const policy = 'public'
|
|
20
|
+
|
|
21
|
+
export default AgentBuilder.create()
|
|
22
|
+
.input(z.object({ instruction: z.string() }))
|
|
23
|
+
.model(process.env.LLM_MODEL ?? 'openrouter/openai/gpt-4o-mini')
|
|
24
|
+
.system(
|
|
25
|
+
'You turn research notes into published output. Read notes with read_notes, then publish. ' +
|
|
26
|
+
'Publishing is gated: a human approves it before it happens.',
|
|
27
|
+
)
|
|
28
|
+
.tool(readNotesTool)
|
|
29
|
+
.tool(publishTool)
|
|
30
|
+
// The gate that makes this a bot rather than a script. On an attended run the surface shows the
|
|
31
|
+
// prompt; on a scheduled one it reaches the owner through `server/delivery.ts`.
|
|
32
|
+
.approval('publish', { question: 'Publish this?' })
|
|
33
|
+
.build()
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { AgentBuilder } from '@theokit/agents'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
|
|
4
|
+
import { readNotesTool } from './tools/read-notes.js'
|
|
5
|
+
import { writeNoteTool } from './tools/write-note.js'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* `researcher` — gathers and writes notes, unattended.
|
|
9
|
+
*
|
|
10
|
+
* The first of two bots, and the pair is the point: one bot is a chat app with a cron. Two is where
|
|
11
|
+
* the questions a bot product actually has start — whose conversation is this, whose workspace can
|
|
12
|
+
* it write to, who approves the thing that leaves the building.
|
|
13
|
+
*
|
|
14
|
+
* It has NO approval gate, deliberately: everything it does is confined to its own workspace by
|
|
15
|
+
* `botScope`, and gating a write nobody outside can see would teach the ceremony without the reason.
|
|
16
|
+
* `publisher` is the one that needs it.
|
|
17
|
+
*/
|
|
18
|
+
export const policy = 'public'
|
|
19
|
+
|
|
20
|
+
export default AgentBuilder.create()
|
|
21
|
+
.input(z.object({ topic: z.string() }))
|
|
22
|
+
.model(process.env.LLM_MODEL ?? 'openrouter/openai/gpt-4o-mini')
|
|
23
|
+
.system(
|
|
24
|
+
'You research a topic and leave notes for the publisher bot. ' +
|
|
25
|
+
'Write what you find with write_note; read what you already know with read_notes. ' +
|
|
26
|
+
"You cannot publish — that is another bot's job, and it needs a human to approve.",
|
|
27
|
+
)
|
|
28
|
+
.tool(readNotesTool)
|
|
29
|
+
.tool(writeNoteTool)
|
|
30
|
+
.build()
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { tool } from 'theokit/server/define'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
|
|
4
|
+
import { deliver } from '../../server/delivery.js'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The action that leaves the building — and therefore the one behind an approval.
|
|
8
|
+
*
|
|
9
|
+
* `publisher.ts` marks it `.approval('publish', …)`, so the run PAUSES here. On an attended run the
|
|
10
|
+
* surface shows the prompt. On a scheduled one nobody is attached, which is the whole problem a bot
|
|
11
|
+
* product has and a chat app does not — see `server/delivery.ts`.
|
|
12
|
+
*
|
|
13
|
+
* It "publishes" by delivering the text, because a scaffold should not guess whether your product
|
|
14
|
+
* means a blog, a channel or a queue. Replace the body; keep the gate.
|
|
15
|
+
*/
|
|
16
|
+
export const publishTool = tool('publish')
|
|
17
|
+
.describe('Publish finished output. A gated action — a human approves it before it runs.')
|
|
18
|
+
.input(
|
|
19
|
+
z.object({
|
|
20
|
+
title: z.string().describe('What is being published.'),
|
|
21
|
+
body: z.string().describe('The content.'),
|
|
22
|
+
}),
|
|
23
|
+
)
|
|
24
|
+
.execute(async ({ title, body }) => {
|
|
25
|
+
await deliver({ subject: `Published: ${title}`, body })
|
|
26
|
+
return `Published "${title}".`
|
|
27
|
+
})
|
|
28
|
+
.build()
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { tool } from 'theokit/server/define'
|
|
2
|
+
import { readdir, readFile } from 'node:fs/promises'
|
|
3
|
+
import { join } from 'node:path'
|
|
4
|
+
import { z } from 'zod'
|
|
5
|
+
|
|
6
|
+
import { botScope } from '../lib/bot-scope.js'
|
|
7
|
+
import { workspaceSandbox } from '../lib/sandbox.js'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Read the researcher's notes. Both bots use this, and only one can write them.
|
|
11
|
+
*
|
|
12
|
+
* That asymmetry is the multi-bot shape in one file: `publisher` reads a workspace it has no write
|
|
13
|
+
* root for, so "the publisher cannot edit the research" is enforced by `botScope` rather than by
|
|
14
|
+
* instructions the model may ignore.
|
|
15
|
+
*/
|
|
16
|
+
export const readNotesTool = tool('read_notes')
|
|
17
|
+
.describe("Read the researcher bot's notes.")
|
|
18
|
+
.input(z.object({}))
|
|
19
|
+
.execute(async () => {
|
|
20
|
+
const scope = botScope({
|
|
21
|
+
botId: 'researcher',
|
|
22
|
+
projectRoot: process.cwd(),
|
|
23
|
+
sandbox: workspaceSandbox(),
|
|
24
|
+
})
|
|
25
|
+
// An empty workspace is a normal state on a first run, not an error: the researcher may simply
|
|
26
|
+
// not have run yet. Saying so beats an ENOENT the model has to interpret.
|
|
27
|
+
const names = await readdir(scope.workspace).catch(() => [] as string[])
|
|
28
|
+
if (names.length === 0) return 'No notes yet — the researcher has not written any.'
|
|
29
|
+
const notes = await Promise.all(
|
|
30
|
+
names.map(async (n) => `## ${n}\n${await readFile(join(scope.workspace, n), 'utf-8')}`),
|
|
31
|
+
)
|
|
32
|
+
return notes.join('\n\n')
|
|
33
|
+
})
|
|
34
|
+
.build()
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { tool } from 'theokit/server/define'
|
|
2
|
+
import { mkdir, writeFile } from 'node:fs/promises'
|
|
3
|
+
import { dirname, join, resolve } from 'node:path'
|
|
4
|
+
import { z } from 'zod'
|
|
5
|
+
|
|
6
|
+
import { botScope } from '../lib/bot-scope.js'
|
|
7
|
+
import { workspaceSandbox } from '../lib/sandbox.js'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Write a note into THIS bot's workspace — and nowhere else.
|
|
11
|
+
*
|
|
12
|
+
* The confinement is the interesting part, and it is not the prompt's job. `botScope` derives a
|
|
13
|
+
* `writeRoot` per bot; this resolves the caller's path against it and refuses anything that escapes.
|
|
14
|
+
* A model asked politely not to write outside its folder is a request; a resolved-path check is a
|
|
15
|
+
* wall.
|
|
16
|
+
*/
|
|
17
|
+
export const writeNoteTool = tool('write_note')
|
|
18
|
+
.describe('Write a research note into your own workspace. Paths are relative to it.')
|
|
19
|
+
.input(
|
|
20
|
+
z.object({
|
|
21
|
+
path: z.string().describe('Relative path for the note, e.g. "topic/summary.md".'),
|
|
22
|
+
content: z.string().describe('The note body.'),
|
|
23
|
+
}),
|
|
24
|
+
)
|
|
25
|
+
.execute(async ({ path, content }) => {
|
|
26
|
+
const scope = botScope({
|
|
27
|
+
botId: 'researcher',
|
|
28
|
+
projectRoot: process.cwd(),
|
|
29
|
+
sandbox: workspaceSandbox(),
|
|
30
|
+
})
|
|
31
|
+
const target = resolve(join(scope.workspace, path))
|
|
32
|
+
// Fail fast, fail clear: name what was refused and why, rather than writing somewhere surprising.
|
|
33
|
+
if (!target.startsWith(resolve(scope.workspace))) {
|
|
34
|
+
throw new Error(
|
|
35
|
+
`write_note: "${path}" resolves outside this bot's workspace (${scope.workspace}). ` +
|
|
36
|
+
'A bot writes only its own work; use a relative path.',
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
await mkdir(dirname(target), { recursive: true })
|
|
40
|
+
await writeFile(target, content, 'utf-8')
|
|
41
|
+
return `Wrote ${path}`
|
|
42
|
+
})
|
|
43
|
+
.build()
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { defineCron } from 'theokit/server/cron'
|
|
2
|
+
|
|
3
|
+
import { botScope } from '../../agents/lib/bot-scope.js'
|
|
4
|
+
import { workspaceSandbox } from '../../agents/lib/sandbox.js'
|
|
5
|
+
import { deliver } from '../delivery.js'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The entry point that makes this a bot: a schedule, not a page.
|
|
9
|
+
*
|
|
10
|
+
* A chat app starts when someone opens it. This starts at 09:00 whether or not anyone is looking,
|
|
11
|
+
* which is the whole shape the `bot` preset exists to demonstrate — and every hard question follows
|
|
12
|
+
* from it. Whose conversation does an unattended run continue? (`botScope`, so the bot resumes its
|
|
13
|
+
* own history rather than starting blank each morning.) Where does its output go when nobody is
|
|
14
|
+
* attached? (`deliver`.)
|
|
15
|
+
*
|
|
16
|
+
* `concurrency: 'forbid'` is the default and the right one here: yesterday's run still going when
|
|
17
|
+
* today's fires means the model is slow or stuck, and starting a second one against the same
|
|
18
|
+
* workspace makes two bots fight over one directory.
|
|
19
|
+
*/
|
|
20
|
+
export default defineCron('daily-research', {
|
|
21
|
+
// 09:00 UTC. Cron schedules are UTC — a bot that appears to run an hour early twice a year is
|
|
22
|
+
// this line read as local time.
|
|
23
|
+
schedule: '0 9 * * *',
|
|
24
|
+
async handler({ traceId, scheduledAt }: { traceId: string; scheduledAt: Date }) {
|
|
25
|
+
const scope = botScope({
|
|
26
|
+
botId: 'researcher',
|
|
27
|
+
// The thread is the DATE, so each day is its own conversation. One endless thread would grow
|
|
28
|
+
// until the model spent its context re-reading last month.
|
|
29
|
+
thread: scheduledAt.toISOString().slice(0, 10),
|
|
30
|
+
projectRoot: process.cwd(),
|
|
31
|
+
sandbox: workspaceSandbox(),
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
await deliver({
|
|
35
|
+
subject: `daily-research started (${scope.conversationId})`,
|
|
36
|
+
body:
|
|
37
|
+
`Workspace: ${scope.workspace}\n` +
|
|
38
|
+
`Trace: ${traceId}\n\n` +
|
|
39
|
+
'Drive the researcher agent from here — POST /api/agents/researcher with a topic, or call\n' +
|
|
40
|
+
'it in-process. The scope above is what keeps this run isolated from the publisher and from\n' +
|
|
41
|
+
"yesterday's.",
|
|
42
|
+
})
|
|
43
|
+
},
|
|
44
|
+
})
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How something reaches you when nobody is watching.
|
|
3
|
+
*
|
|
4
|
+
* This is the seam a `bot` template cannot omit. In a chat app an approval renders inline: the
|
|
5
|
+
* person who triggered the run is looking at it. On a schedule there is no attached client, so a
|
|
6
|
+
* paused run waits for an approval that has nowhere to appear — the difference between an agent and
|
|
7
|
+
* a bot, in one sentence.
|
|
8
|
+
*
|
|
9
|
+
* ## No channel is wired, and that is the decision
|
|
10
|
+
*
|
|
11
|
+
* A scaffold that defaulted to email would put your address in a file you did not write; one that
|
|
12
|
+
* defaulted to Slack would assume a workspace. Both are product decisions a starting point should
|
|
13
|
+
* not make for you. So the seam is here, it is called from the places that need it, and it prints
|
|
14
|
+
* until you point it somewhere.
|
|
15
|
+
*
|
|
16
|
+
* Printing is not a placeholder for "unimplemented" — it is the honest local behaviour, and it is
|
|
17
|
+
* why the scaffold RUNS before you have configured anything.
|
|
18
|
+
*
|
|
19
|
+
* ## Wiring a real channel
|
|
20
|
+
*
|
|
21
|
+
* Replace the body. One example, deliberately commented rather than installed:
|
|
22
|
+
*
|
|
23
|
+
* ```ts
|
|
24
|
+
* import { Resend } from 'resend'
|
|
25
|
+
* const resend = new Resend(process.env.RESEND_API_KEY)
|
|
26
|
+
* await resend.emails.send({
|
|
27
|
+
* from: 'bots@yourdomain.dev',
|
|
28
|
+
* to: process.env.BOT_OWNER_EMAIL!,
|
|
29
|
+
* subject: message.subject,
|
|
30
|
+
* text: message.body,
|
|
31
|
+
* })
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* `@theokit/plugin-email` gives you the same thing with a provider contract, if you would rather not
|
|
35
|
+
* bind to one vendor.
|
|
36
|
+
*/
|
|
37
|
+
export interface DeliveryMessage {
|
|
38
|
+
readonly subject: string
|
|
39
|
+
readonly body: string
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export async function deliver(message: DeliveryMessage): Promise<void> {
|
|
43
|
+
// `await` on nothing keeps the signature honest: every real channel is async, and a caller that
|
|
44
|
+
// learned to omit `await` here would break the day you wire one.
|
|
45
|
+
await Promise.resolve()
|
|
46
|
+
console.log(`\n[bot] ${message.subject}\n${message.body}\n`)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* The approval that could not be shown, delivered instead.
|
|
51
|
+
*
|
|
52
|
+
* Called when a scheduled run pauses on an `.approval()` gate. It carries the run id because
|
|
53
|
+
* approving happens against the run, not against the message — whoever receives this has to be able
|
|
54
|
+
* to act on it.
|
|
55
|
+
*/
|
|
56
|
+
export async function deliverApproval(input: {
|
|
57
|
+
readonly agent: string
|
|
58
|
+
readonly runId: string
|
|
59
|
+
readonly question: string
|
|
60
|
+
}): Promise<void> {
|
|
61
|
+
await deliver({
|
|
62
|
+
subject: `Approval needed: ${input.agent}`,
|
|
63
|
+
body:
|
|
64
|
+
`${input.question}\n\n` +
|
|
65
|
+
`Run: ${input.runId}\n` +
|
|
66
|
+
`Approve: POST /api/agents/${input.agent}/approvals/${input.runId}\n\n` +
|
|
67
|
+
'Nobody was attached when this paused, which is why it reached you here.',
|
|
68
|
+
})
|
|
69
|
+
}
|
|
@@ -56,7 +56,7 @@ your environment.
|
|
|
56
56
|
```ts
|
|
57
57
|
export default AgentBuilder.create()
|
|
58
58
|
.input(z.object({ message: z.string() }))
|
|
59
|
-
.model('openai/gpt-4o-mini')
|
|
59
|
+
.model('openrouter/openai/gpt-4o-mini')
|
|
60
60
|
.system(BASE_INSTRUCTIONS)
|
|
61
61
|
.tool(weatherTool)
|
|
62
62
|
.approval('send_notification', { question: 'Send this notification?' })
|
|
@@ -14,9 +14,17 @@ import { weatherTool } from './tools/weather.js'
|
|
|
14
14
|
* treats `prompts/ tools/ skills/ lib/ …` as semantic folders, so `agents/tools/weather.ts` never becomes
|
|
15
15
|
* a `/api/agents/tools/weather` endpoint. Add a second agent as another `agents/<name>.ts`.
|
|
16
16
|
*
|
|
17
|
-
* `@theokit/sdk` runs the agent; conversation turns auto-persist per session.
|
|
18
|
-
*
|
|
19
|
-
* provider
|
|
17
|
+
* `@theokit/sdk` runs the agent; conversation turns auto-persist per session.
|
|
18
|
+
*
|
|
19
|
+
* The FIRST segment of the model id picks the provider, and the key it needs follows from that:
|
|
20
|
+
* `openrouter/…` needs `OPENROUTER_API_KEY`, `anthropic/…` needs `ANTHROPIC_API_KEY`, `openai/…`
|
|
21
|
+
* needs `OPENAI_API_KEY`. There is no magic routing — a bare `openai/gpt-4o-mini` goes to OpenAI,
|
|
22
|
+
* not through a gateway, even with an OpenRouter key present. Reaching OpenAI's catalog THROUGH
|
|
23
|
+
* OpenRouter means naming the gateway: `openrouter/openai/gpt-4o-mini`, which is what this file
|
|
24
|
+
* declares, because `.env.example` asks for `OPENROUTER_API_KEY` (one key, many models —
|
|
25
|
+
* https://openrouter.ai/models).
|
|
26
|
+
*
|
|
27
|
+
* Change the id and the key changes with it. Both live in `.env` and here; nothing else to wire.
|
|
20
28
|
*/
|
|
21
29
|
/**
|
|
22
30
|
* Who may run this agent, and against which conversation (ADR 0001).
|
|
@@ -48,7 +56,7 @@ export default AgentBuilder.create()
|
|
|
48
56
|
// so setting it changed the model to exactly what it already was (#398, #408). One expression is
|
|
49
57
|
// cheaper than an override path through the framework, and it keeps the value visible in the file
|
|
50
58
|
// that decides it. The literal stays as the fallback: a scaffold has to run with no environment.
|
|
51
|
-
.model(process.env.LLM_MODEL ?? 'openai/gpt-4o-mini')
|
|
59
|
+
.model(process.env.LLM_MODEL ?? 'openrouter/openai/gpt-4o-mini')
|
|
52
60
|
.system(BASE_INSTRUCTIONS)
|
|
53
61
|
.tool(weatherTool)
|
|
54
62
|
.tool(currentTimeTool)
|
|
@@ -37,6 +37,13 @@ export default function AboutPage() {
|
|
|
37
37
|
screen. See <code>docs/ARCHITECTURE.md</code> § Adding a screen. Delete this page when you
|
|
38
38
|
don't need it.
|
|
39
39
|
</p>
|
|
40
|
+
<p className="text-muted-foreground text-sm leading-relaxed">
|
|
41
|
+
Before you write markup for that screen, look at what is already installed:{' '}
|
|
42
|
+
<code>@theokit/ui</code> for agent surfaces and <code>@usetheo/ui</code> for app chrome —
|
|
43
|
+
sidebars, tables, selects, badges, empty states. The catalogue is{' '}
|
|
44
|
+
<code>node_modules/@theokit/ui/llms.txt</code>, written to be read by an agent. The README
|
|
45
|
+
has the routing table.
|
|
46
|
+
</p>
|
|
40
47
|
<Link to="/" prefetch="intent" className="text-primary text-sm hover:underline">
|
|
41
48
|
← Back to the chat
|
|
42
49
|
</Link>
|
|
@@ -59,7 +59,7 @@ An agent that outgrows one file becomes a folder that co-locates its own composi
|
|
|
59
59
|
```ts
|
|
60
60
|
export default AgentBuilder.create()
|
|
61
61
|
.input(z.object({ message: z.string() }))
|
|
62
|
-
.model('openai/gpt-4o-mini')
|
|
62
|
+
.model('openrouter/openai/gpt-4o-mini')
|
|
63
63
|
.system(BASE_INSTRUCTIONS) // agents/prompts/instructions.ts
|
|
64
64
|
.tool(weatherTool) // agents/tools/weather.ts
|
|
65
65
|
.tool(currentTimeTool) // agents/tools/current-time.ts
|
|
@@ -8,9 +8,17 @@ Configuration lives in `.env` (copy `.env.example`). Nothing here is committed
|
|
|
8
8
|
| `ANTHROPIC_API_KEY` | one of these | Use Anthropic directly instead of OpenRouter. |
|
|
9
9
|
| `OPENAI_API_KEY` | one of these | Use OpenAI directly. |
|
|
10
10
|
|
|
11
|
-
The
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
The FIRST segment of the model id in `agents/chat.ts` picks the provider, and that decides which key
|
|
12
|
+
is needed. It is not a hint: `openai/gpt-4o-mini` goes to OpenAI and needs `OPENAI_API_KEY`, even
|
|
13
|
+
with an OpenRouter key present. Reaching another vendor's catalog THROUGH OpenRouter means naming
|
|
14
|
+
the gateway first — `openrouter/openai/gpt-4o-mini`, which is what the scaffold declares, matching
|
|
15
|
+
the key above. See <https://openrouter.ai/models> for the ids OpenRouter serves.
|
|
16
|
+
|
|
17
|
+
| Model id in `agents/chat.ts` | Key it needs |
|
|
18
|
+
| ------------------------------- | -------------------- |
|
|
19
|
+
| `openrouter/openai/gpt-4o-mini` | `OPENROUTER_API_KEY` |
|
|
20
|
+
| `anthropic/claude-sonnet-4-6` | `ANTHROPIC_API_KEY` |
|
|
21
|
+
| `openai/gpt-4o-mini` | `OPENAI_API_KEY` |
|
|
14
22
|
|
|
15
23
|
```bash
|
|
16
24
|
cp .env.example .env
|
|
@@ -25,7 +25,7 @@ import { z } from 'zod'
|
|
|
25
25
|
|
|
26
26
|
export default defineAgent({
|
|
27
27
|
input: z.object({ message: z.string() }),
|
|
28
|
-
model: 'openai/gpt-4o-mini',
|
|
28
|
+
model: 'openrouter/openai/gpt-4o-mini',
|
|
29
29
|
system: 'You are a helpful assistant.',
|
|
30
30
|
})
|
|
31
31
|
```
|
|
@@ -33,8 +33,11 @@ export default defineAgent({
|
|
|
33
33
|
The endpoint streams the ai-sdk `UIMessageStream` that `useAgent` (client hook) consumes.
|
|
34
34
|
`@theokit/sdk` runs the agent; conversation turns auto-persist per session — the SDK owns storage.
|
|
35
35
|
|
|
36
|
-
**Provider resolution:**
|
|
37
|
-
|
|
36
|
+
**Provider resolution:** the FIRST segment of the model id picks the provider, and that decides
|
|
37
|
+
which key is needed — `openrouter/…` needs `OPENROUTER_API_KEY`, `anthropic/…` needs
|
|
38
|
+
`ANTHROPIC_API_KEY`, `openai/…` needs `OPENAI_API_KEY`. A bare vendor prefix is a selection of that
|
|
39
|
+
vendor, not a hint: reaching OpenAI's catalog through OpenRouter means naming the gateway first
|
|
40
|
+
(`openrouter/openai/gpt-4o-mini`). Set the matching key in `.env`.
|
|
38
41
|
|
|
39
42
|
## Advanced Surface — @Agent Decorator (DI / class-based)
|
|
40
43
|
|
|
@@ -46,7 +49,7 @@ When you need dependency injection or composition, build the agent from **capabi
|
|
|
46
49
|
import { applyCapabilities, AgentConfigCapability, ModelCapability } from '@theokit/agents'
|
|
47
50
|
|
|
48
51
|
export const assistantAgent = applyCapabilities([
|
|
49
|
-
new ModelCapability('openai/gpt-4o-mini'),
|
|
52
|
+
new ModelCapability('openrouter/openai/gpt-4o-mini'),
|
|
50
53
|
new AgentConfigCapability({
|
|
51
54
|
systemPrompt: 'You are a helpful assistant.',
|
|
52
55
|
maxIterations: 5,
|
|
@@ -75,7 +78,7 @@ const currentTimeTool = defineAgentTool({
|
|
|
75
78
|
|
|
76
79
|
export default defineAgent({
|
|
77
80
|
input: z.object({ message: z.string() }),
|
|
78
|
-
model: 'openai/gpt-4o-mini',
|
|
81
|
+
model: 'openrouter/openai/gpt-4o-mini',
|
|
79
82
|
system: 'You are a helpful assistant.',
|
|
80
83
|
tools: [currentTimeTool],
|
|
81
84
|
})
|
|
@@ -26,7 +26,7 @@ returns the `Response` your route must return.
|
|
|
26
26
|
|
|
27
27
|
```typescript
|
|
28
28
|
import { handleChannelWebhook } from 'theokit/server/agent'
|
|
29
|
-
import { telegram } from 'theokit/server/webhook' // also: discord, slack, github, stripe
|
|
29
|
+
import { telegram } from 'theokit/server/webhook' // also: discord, slack, github, stripe, whatsapp
|
|
30
30
|
import { parseInbound } from '@theokit/gateway-telegram'
|
|
31
31
|
|
|
32
32
|
const response = await handleChannelWebhook(request, new URL(request.url).pathname, {
|
|
@@ -42,6 +42,34 @@ const response = await handleChannelWebhook(request, new URL(request.url).pathna
|
|
|
42
42
|
The path it expects is `POST /api/agents/<name>/channels/<platform>/webhook`; `<name>` and
|
|
43
43
|
`<platform>` arrive in `onMessage` as `agent` and `platform`.
|
|
44
44
|
|
|
45
|
+
## Platforms that verify the endpoint first (WhatsApp, Instagram, Messenger)
|
|
46
|
+
|
|
47
|
+
Meta will not deliver anything until it has verified the URL with a `GET` carrying
|
|
48
|
+
`hub.mode=subscribe`, `hub.verify_token` and `hub.challenge`, and it requires the challenge echoed
|
|
49
|
+
back as `text/plain`. Declare a responder per platform and mount the route for `GET` as well as
|
|
50
|
+
`POST`:
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
import { whatsapp, whatsappSubscribe } from 'theokit/server/webhook'
|
|
54
|
+
|
|
55
|
+
const response = await handleChannelWebhook(request, new URL(request.url).pathname, {
|
|
56
|
+
validators: { whatsapp: whatsapp({ appSecret: process.env.META_APP_SECRET! }) },
|
|
57
|
+
subscribe: { whatsapp: whatsappSubscribe({ verifyToken: process.env.META_VERIFY_TOKEN! }) },
|
|
58
|
+
onMessage: async ({ payload }) => {
|
|
59
|
+
/* … */
|
|
60
|
+
},
|
|
61
|
+
})
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
`appSecret` is the Meta **app secret**, not the access token — the signature is HMAC-SHA256 of it
|
|
65
|
+
over the raw body. `verifyToken` is the string you typed into the Meta app when registering the URL;
|
|
66
|
+
comparing it is the only thing standing between an arbitrary caller and a subscription. A `GET` for
|
|
67
|
+
a platform with no `subscribe` entry answers `405`, not `404`: the platform is configured, it just
|
|
68
|
+
does not do handshakes.
|
|
69
|
+
|
|
70
|
+
Developing against any of this needs a public URL. `theo.config.ts` has `allowedHosts` for exactly
|
|
71
|
+
that — see the framework README.
|
|
72
|
+
|
|
45
73
|
**Give it a `Request` whose body has not been read.** It calls `request.json()` itself, so a wrapper
|
|
46
74
|
that has already parsed the body — `defineRoute` offers a parsed `body` in its handler context —
|
|
47
75
|
leaves nothing for it to read. Mount it where you still hold the original request, or pass a clone.
|