feat: add hello-world workflow and update sense-generator config
- Add hello-world workflow generated by workflow-generator
- Add package.json/tsconfig.json to sense-generator
- Update nerve.yaml
小橘 🍊(NEKO Team)
This commit is contained in:
parent
028125b74f
commit
714a320bdc
@ -26,6 +26,9 @@ workflows:
|
|||||||
pr-summarizer:
|
pr-summarizer:
|
||||||
concurrency: 1
|
concurrency: 1
|
||||||
overflow: drop
|
overflow: drop
|
||||||
|
hello-world:
|
||||||
|
concurrency: 1
|
||||||
|
overflow: drop
|
||||||
|
|
||||||
reflexes:
|
reflexes:
|
||||||
- kind: sense
|
- kind: sense
|
||||||
|
|||||||
86
workflows/hello-world/index.ts
Normal file
86
workflows/hello-world/index.ts
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
import type {
|
||||||
|
ModeratorContext,
|
||||||
|
RoleResult,
|
||||||
|
StartStep,
|
||||||
|
WorkflowDefinition,
|
||||||
|
WorkflowMessage,
|
||||||
|
} from "@uncaged/nerve-core";
|
||||||
|
import { END } from "@uncaged/nerve-core";
|
||||||
|
|
||||||
|
type WorkflowMeta = {
|
||||||
|
greeter: {
|
||||||
|
name: string;
|
||||||
|
error: string | null;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const DEFAULT_NAME = "friend";
|
||||||
|
|
||||||
|
function resolveNameFromContent(content: string): { name: string; error: string | null } {
|
||||||
|
const trimmed = content.trim();
|
||||||
|
if (trimmed === "") {
|
||||||
|
return { name: DEFAULT_NAME, error: "empty_input" };
|
||||||
|
}
|
||||||
|
|
||||||
|
let jsonParsed: unknown;
|
||||||
|
let parseOk: boolean;
|
||||||
|
try {
|
||||||
|
jsonParsed = JSON.parse(trimmed);
|
||||||
|
parseOk = true;
|
||||||
|
} catch {
|
||||||
|
parseOk = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parseOk) {
|
||||||
|
if (jsonParsed !== null && typeof jsonParsed === "object" && !Array.isArray(jsonParsed)) {
|
||||||
|
const nameField = (jsonParsed as Record<string, unknown>).name;
|
||||||
|
if (typeof nameField === "string") {
|
||||||
|
const n = nameField.trim();
|
||||||
|
if (n !== "") {
|
||||||
|
return { name: n, error: null };
|
||||||
|
}
|
||||||
|
return { name: DEFAULT_NAME, error: "name_empty" };
|
||||||
|
}
|
||||||
|
return { name: DEFAULT_NAME, error: "missing_name" };
|
||||||
|
}
|
||||||
|
return { name: DEFAULT_NAME, error: "invalid_json_shape" };
|
||||||
|
}
|
||||||
|
|
||||||
|
return { name: trimmed, error: null };
|
||||||
|
}
|
||||||
|
|
||||||
|
async function greeter(
|
||||||
|
start: StartStep,
|
||||||
|
_messages: WorkflowMessage[],
|
||||||
|
): Promise<RoleResult<WorkflowMeta["greeter"]>> {
|
||||||
|
try {
|
||||||
|
const { name, error } = resolveNameFromContent(start.content);
|
||||||
|
return {
|
||||||
|
content: `Hello, ${name}!`,
|
||||||
|
meta: { name, error },
|
||||||
|
};
|
||||||
|
} catch (unhandled) {
|
||||||
|
const msg = unhandled instanceof Error ? unhandled.message : String(unhandled);
|
||||||
|
return {
|
||||||
|
content: `Hello, ${DEFAULT_NAME}!`,
|
||||||
|
meta: { name: DEFAULT_NAME, error: `internal_error: ${msg}` },
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const workflow: WorkflowDefinition<WorkflowMeta> = {
|
||||||
|
name: "hello-world",
|
||||||
|
roles: { greeter },
|
||||||
|
moderator(context: ModeratorContext<WorkflowMeta>) {
|
||||||
|
if (context.steps.length === 0) {
|
||||||
|
return "greeter";
|
||||||
|
}
|
||||||
|
const last = context.steps[context.steps.length - 1];
|
||||||
|
if (last.role === "greeter") {
|
||||||
|
return END;
|
||||||
|
}
|
||||||
|
return END;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default workflow;
|
||||||
21
workflows/hello-world/package.json
Normal file
21
workflows/hello-world/package.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "hello-world-workflow",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"dependencies": {
|
||||||
|
"@uncaged/nerve-core": "latest",
|
||||||
|
"@uncaged/nerve-workflow-utils": "latest"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^22.0.0",
|
||||||
|
"typescript": "^5.7.0"
|
||||||
|
},
|
||||||
|
"pnpm": {
|
||||||
|
"overrides": {
|
||||||
|
"@uncaged/nerve-daemon": "link:../../../repos/nerve/packages/daemon",
|
||||||
|
"@uncaged/nerve-core": "link:../../../repos/nerve/packages/core",
|
||||||
|
"@uncaged/nerve-workflow-utils": "link:../../../repos/nerve/packages/workflow-utils"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
51
workflows/hello-world/pnpm-lock.yaml
generated
Normal file
51
workflows/hello-world/pnpm-lock.yaml
generated
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
lockfileVersion: '9.0'
|
||||||
|
|
||||||
|
settings:
|
||||||
|
autoInstallPeers: true
|
||||||
|
excludeLinksFromLockfile: false
|
||||||
|
|
||||||
|
overrides:
|
||||||
|
'@uncaged/nerve-daemon': link:../../../repos/nerve/packages/daemon
|
||||||
|
'@uncaged/nerve-core': link:../../../repos/nerve/packages/core
|
||||||
|
'@uncaged/nerve-workflow-utils': link:../../../repos/nerve/packages/workflow-utils
|
||||||
|
|
||||||
|
importers:
|
||||||
|
|
||||||
|
.:
|
||||||
|
dependencies:
|
||||||
|
'@uncaged/nerve-core':
|
||||||
|
specifier: link:../../../repos/nerve/packages/core
|
||||||
|
version: link:../../../repos/nerve/packages/core
|
||||||
|
'@uncaged/nerve-workflow-utils':
|
||||||
|
specifier: link:../../../repos/nerve/packages/workflow-utils
|
||||||
|
version: link:../../../repos/nerve/packages/workflow-utils
|
||||||
|
devDependencies:
|
||||||
|
'@types/node':
|
||||||
|
specifier: ^22.0.0
|
||||||
|
version: 22.19.17
|
||||||
|
typescript:
|
||||||
|
specifier: ^5.7.0
|
||||||
|
version: 5.9.3
|
||||||
|
|
||||||
|
packages:
|
||||||
|
|
||||||
|
'@types/node@22.19.17':
|
||||||
|
resolution: {integrity: sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==}
|
||||||
|
|
||||||
|
typescript@5.9.3:
|
||||||
|
resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
|
||||||
|
engines: {node: '>=14.17'}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
|
undici-types@6.21.0:
|
||||||
|
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
|
||||||
|
|
||||||
|
snapshots:
|
||||||
|
|
||||||
|
'@types/node@22.19.17':
|
||||||
|
dependencies:
|
||||||
|
undici-types: 6.21.0
|
||||||
|
|
||||||
|
typescript@5.9.3: {}
|
||||||
|
|
||||||
|
undici-types@6.21.0: {}
|
||||||
13
workflows/hello-world/tsconfig.json
Normal file
13
workflows/hello-world/tsconfig.json
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ES2022",
|
||||||
|
"lib": ["ES2022"],
|
||||||
|
"module": "NodeNext",
|
||||||
|
"moduleResolution": "NodeNext",
|
||||||
|
"strict": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"noEmit": true,
|
||||||
|
"types": ["node"]
|
||||||
|
},
|
||||||
|
"include": ["./**/*.ts"]
|
||||||
|
}
|
||||||
22
workflows/sense-generator/package.json
Normal file
22
workflows/sense-generator/package.json
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"name": "sense-generator-workflow",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"dependencies": {
|
||||||
|
"@uncaged/nerve-core": "latest",
|
||||||
|
"@uncaged/nerve-workflow-utils": "latest",
|
||||||
|
"zod": "^4.3.6"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^22.0.0",
|
||||||
|
"typescript": "^5.7.0"
|
||||||
|
},
|
||||||
|
"pnpm": {
|
||||||
|
"overrides": {
|
||||||
|
"@uncaged/nerve-daemon": "link:../../../repos/nerve/packages/daemon",
|
||||||
|
"@uncaged/nerve-core": "link:../../../repos/nerve/packages/core",
|
||||||
|
"@uncaged/nerve-workflow-utils": "link:../../../repos/nerve/packages/workflow-utils"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
59
workflows/sense-generator/pnpm-lock.yaml
generated
Normal file
59
workflows/sense-generator/pnpm-lock.yaml
generated
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
lockfileVersion: '9.0'
|
||||||
|
|
||||||
|
settings:
|
||||||
|
autoInstallPeers: true
|
||||||
|
excludeLinksFromLockfile: false
|
||||||
|
|
||||||
|
overrides:
|
||||||
|
'@uncaged/nerve-daemon': link:../../../repos/nerve/packages/daemon
|
||||||
|
'@uncaged/nerve-core': link:../../../repos/nerve/packages/core
|
||||||
|
'@uncaged/nerve-workflow-utils': link:../../../repos/nerve/packages/workflow-utils
|
||||||
|
|
||||||
|
importers:
|
||||||
|
|
||||||
|
.:
|
||||||
|
dependencies:
|
||||||
|
'@uncaged/nerve-core':
|
||||||
|
specifier: link:../../../repos/nerve/packages/core
|
||||||
|
version: link:../../../repos/nerve/packages/core
|
||||||
|
'@uncaged/nerve-workflow-utils':
|
||||||
|
specifier: link:../../../repos/nerve/packages/workflow-utils
|
||||||
|
version: link:../../../repos/nerve/packages/workflow-utils
|
||||||
|
zod:
|
||||||
|
specifier: ^4.3.6
|
||||||
|
version: 4.3.6
|
||||||
|
devDependencies:
|
||||||
|
'@types/node':
|
||||||
|
specifier: ^22.0.0
|
||||||
|
version: 22.19.17
|
||||||
|
typescript:
|
||||||
|
specifier: ^5.7.0
|
||||||
|
version: 5.9.3
|
||||||
|
|
||||||
|
packages:
|
||||||
|
|
||||||
|
'@types/node@22.19.17':
|
||||||
|
resolution: {integrity: sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==}
|
||||||
|
|
||||||
|
typescript@5.9.3:
|
||||||
|
resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
|
||||||
|
engines: {node: '>=14.17'}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
|
undici-types@6.21.0:
|
||||||
|
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
|
||||||
|
|
||||||
|
zod@4.3.6:
|
||||||
|
resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
|
||||||
|
|
||||||
|
snapshots:
|
||||||
|
|
||||||
|
'@types/node@22.19.17':
|
||||||
|
dependencies:
|
||||||
|
undici-types: 6.21.0
|
||||||
|
|
||||||
|
typescript@5.9.3: {}
|
||||||
|
|
||||||
|
undici-types@6.21.0: {}
|
||||||
|
|
||||||
|
zod@4.3.6: {}
|
||||||
13
workflows/sense-generator/tsconfig.json
Normal file
13
workflows/sense-generator/tsconfig.json
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ES2022",
|
||||||
|
"lib": ["ES2022"],
|
||||||
|
"module": "NodeNext",
|
||||||
|
"moduleResolution": "NodeNext",
|
||||||
|
"strict": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"noEmit": true,
|
||||||
|
"types": ["node"]
|
||||||
|
},
|
||||||
|
"include": ["./**/*.ts"]
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user