@migor/agentia 0.0.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/README.md +171 -0
- package/dist/container/container.d.ts +40 -0
- package/dist/container/container.js +66 -0
- package/dist/container/container.js.map +1 -0
- package/dist/core/schema.d.ts +14 -0
- package/dist/core/schema.js +116 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/tool.d.ts +60 -0
- package/dist/core/tool.js +2 -0
- package/dist/core/tool.js.map +1 -0
- package/dist/core/trace.d.ts +52 -0
- package/dist/core/trace.js +6 -0
- package/dist/core/trace.js.map +1 -0
- package/dist/engine/context.d.ts +47 -0
- package/dist/engine/context.js +146 -0
- package/dist/engine/context.js.map +1 -0
- package/dist/engine/errors.d.ts +3 -0
- package/dist/engine/errors.js +22 -0
- package/dist/engine/errors.js.map +1 -0
- package/dist/engine/loop.d.ts +33 -0
- package/dist/engine/loop.js +227 -0
- package/dist/engine/loop.js.map +1 -0
- package/dist/engine/policy.d.ts +30 -0
- package/dist/engine/policy.js +35 -0
- package/dist/engine/policy.js.map +1 -0
- package/dist/engine/tracer.d.ts +27 -0
- package/dist/engine/tracer.js +93 -0
- package/dist/engine/tracer.js.map +1 -0
- package/dist/engine/types.d.ts +58 -0
- package/dist/engine/types.js +2 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/engine/usage.d.ts +5 -0
- package/dist/engine/usage.js +30 -0
- package/dist/engine/usage.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/run/async.d.ts +64 -0
- package/dist/run/async.js +135 -0
- package/dist/run/async.js.map +1 -0
- package/dist/run/context.d.ts +16 -0
- package/dist/run/context.js +48 -0
- package/dist/run/context.js.map +1 -0
- package/dist/run/fsStore.d.ts +29 -0
- package/dist/run/fsStore.js +79 -0
- package/dist/run/fsStore.js.map +1 -0
- package/dist/run/run.d.ts +50 -0
- package/dist/run/run.js +98 -0
- package/dist/run/run.js.map +1 -0
- package/dist/run/scheduler.d.ts +27 -0
- package/dist/run/scheduler.js +85 -0
- package/dist/run/scheduler.js.map +1 -0
- package/dist/run/spec.d.ts +40 -0
- package/dist/run/spec.js +25 -0
- package/dist/run/spec.js.map +1 -0
- package/dist/run/store.d.ts +40 -0
- package/dist/run/store.js +28 -0
- package/dist/run/store.js.map +1 -0
- package/dist/run/systemPrompt.d.ts +25 -0
- package/dist/run/systemPrompt.js +41 -0
- package/dist/run/systemPrompt.js.map +1 -0
- package/dist/run/transport.d.ts +12 -0
- package/dist/run/transport.js +16 -0
- package/dist/run/transport.js.map +1 -0
- package/dist/run/types.d.ts +12 -0
- package/dist/run/types.js +2 -0
- package/dist/run/types.js.map +1 -0
- package/dist/toolkit/asset.d.ts +22 -0
- package/dist/toolkit/asset.js +26 -0
- package/dist/toolkit/asset.js.map +1 -0
- package/dist/toolkit/discover.d.ts +2 -0
- package/dist/toolkit/discover.js +61 -0
- package/dist/toolkit/discover.js.map +1 -0
- package/dist/toolkit/module.d.ts +74 -0
- package/dist/toolkit/module.js +114 -0
- package/dist/toolkit/module.js.map +1 -0
- package/dist/toolkit/prompt.d.ts +32 -0
- package/dist/toolkit/prompt.js +70 -0
- package/dist/toolkit/prompt.js.map +1 -0
- package/dist/toolkit/skill.d.ts +74 -0
- package/dist/toolkit/skill.js +125 -0
- package/dist/toolkit/skill.js.map +1 -0
- package/dist/toolkit/subagent.d.ts +54 -0
- package/dist/toolkit/subagent.js +120 -0
- package/dist/toolkit/subagent.js.map +1 -0
- package/dist/toolkit/tool.d.ts +36 -0
- package/dist/toolkit/tool.js +54 -0
- package/dist/toolkit/tool.js.map +1 -0
- package/package.json +39 -0
package/dist/run/run.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { runAgent } from '../engine/loop.js';
|
|
2
|
+
import { TraceRecorder } from '../engine/tracer.js';
|
|
3
|
+
import { classifyError } from '../engine/errors.js';
|
|
4
|
+
import { RunContext, withRunContext } from './context.js';
|
|
5
|
+
/**
|
|
6
|
+
* Run —— 一次运行的生命周期容器(spec §2/§6.1)。
|
|
7
|
+
* runId == recorder.traceId == traceId(1:1)。
|
|
8
|
+
* recorder 由 engine 的 runAgent 写入(run 根 span 归 engine 开)。
|
|
9
|
+
*/
|
|
10
|
+
export class Run {
|
|
11
|
+
recorder;
|
|
12
|
+
runId;
|
|
13
|
+
idempotencyKey;
|
|
14
|
+
createdAt = Date.now();
|
|
15
|
+
_status = 'queued';
|
|
16
|
+
startedAt;
|
|
17
|
+
finishedAt;
|
|
18
|
+
_result;
|
|
19
|
+
constructor(opts = {}) {
|
|
20
|
+
this.recorder = new TraceRecorder();
|
|
21
|
+
this.runId = this.recorder.traceId;
|
|
22
|
+
this.idempotencyKey = opts.idempotencyKey;
|
|
23
|
+
}
|
|
24
|
+
get status() {
|
|
25
|
+
return this._status;
|
|
26
|
+
}
|
|
27
|
+
get result() {
|
|
28
|
+
return this._result;
|
|
29
|
+
}
|
|
30
|
+
/** meta(供运行记录/持久化使用) */
|
|
31
|
+
toMeta() {
|
|
32
|
+
return {
|
|
33
|
+
runId: this.runId,
|
|
34
|
+
status: this._status,
|
|
35
|
+
idempotencyKey: this.idempotencyKey,
|
|
36
|
+
createdAt: this.createdAt,
|
|
37
|
+
startedAt: this.startedAt,
|
|
38
|
+
finishedAt: this.finishedAt,
|
|
39
|
+
error: this._result?.error,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
start() {
|
|
43
|
+
if (this._status !== 'queued')
|
|
44
|
+
throw new Error(`cannot start a run in status ${this._status}`);
|
|
45
|
+
this._status = 'running';
|
|
46
|
+
this.startedAt = Date.now();
|
|
47
|
+
}
|
|
48
|
+
finish(result) {
|
|
49
|
+
this._result = result;
|
|
50
|
+
this.finishedAt = Date.now();
|
|
51
|
+
this._status = result.stopReason === 'end_turn' ? 'succeeded' : 'failed';
|
|
52
|
+
}
|
|
53
|
+
fail(error) {
|
|
54
|
+
this._status = 'failed';
|
|
55
|
+
this.finishedAt = Date.now();
|
|
56
|
+
if (!this._result) {
|
|
57
|
+
// run 根可能尚未开(如 contextInit 抛错):补一个 error 根再 snapshot,
|
|
58
|
+
// 避免 snapshot 的 "run root not started" 掩盖原始错误。
|
|
59
|
+
if (!this.recorder.rootStarted) {
|
|
60
|
+
const rootId = this.recorder.begin('run', 'agent.run', null);
|
|
61
|
+
this.recorder.end(rootId, { status: 'error', error: classifyError(error) });
|
|
62
|
+
}
|
|
63
|
+
this._result = {
|
|
64
|
+
trace: this.recorder.snapshot('error'),
|
|
65
|
+
stopReason: 'error',
|
|
66
|
+
finalText: '',
|
|
67
|
+
iterations: 0,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
this._result.error = classifyError(error);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 高层入口:建 Run → start → 注入 recorder 跑 engine → finish。
|
|
75
|
+
* run 层持有 recorder,返回后 run.recorder 里的 trace 即本次完整调用树。
|
|
76
|
+
* RunContext 在整个执行期间经 AsyncLocalStorage 可被 `RunContext.current()` 读到,
|
|
77
|
+
* 工具/单元执行体无需把 ctx 作为参数层层下传。
|
|
78
|
+
*/
|
|
79
|
+
export async function executeRun(options) {
|
|
80
|
+
const run = new Run({ idempotencyKey: options.idempotencyKey });
|
|
81
|
+
run.start();
|
|
82
|
+
const ctx = new RunContext(run);
|
|
83
|
+
return withRunContext(ctx, async () => {
|
|
84
|
+
try {
|
|
85
|
+
options.contextInit?.(ctx);
|
|
86
|
+
const result = await runAgent({ ...options, recorder: run.recorder });
|
|
87
|
+
run.finish(result);
|
|
88
|
+
return { run, result };
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
run.fail(e);
|
|
92
|
+
if (options.rethrow === false)
|
|
93
|
+
return { run, result: run.result };
|
|
94
|
+
throw e;
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AsyncRunner } from './async.js';
|
|
2
|
+
import type { RunInvocationOptions } from './spec.js';
|
|
3
|
+
export interface ScheduleEveryOptions {
|
|
4
|
+
/** 任务级调用参数 */
|
|
5
|
+
options?: RunInvocationOptions;
|
|
6
|
+
/** 幂等键前缀;周期任务按 interval 窗口分片去重 */
|
|
7
|
+
idempotencyPrefix?: string;
|
|
8
|
+
/** 覆盖触发来源标记 */
|
|
9
|
+
source?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ScheduleHandle {
|
|
12
|
+
id: string;
|
|
13
|
+
cancel(): void;
|
|
14
|
+
}
|
|
15
|
+
export declare class Scheduler {
|
|
16
|
+
private readonly runner;
|
|
17
|
+
private readonly jobs;
|
|
18
|
+
constructor(runner: AsyncRunner);
|
|
19
|
+
/** 周期触发(毫秒间隔)。首次触发在 intervalMs 之后。 */
|
|
20
|
+
every(intervalMs: number, input: unknown, opts?: ScheduleEveryOptions): ScheduleHandle;
|
|
21
|
+
/** 单次触发(指定时刻)。 */
|
|
22
|
+
at(when: Date, input: unknown, opts?: ScheduleEveryOptions): ScheduleHandle;
|
|
23
|
+
cancel(id: string): void;
|
|
24
|
+
stop(): void;
|
|
25
|
+
get active(): number;
|
|
26
|
+
private dispatch;
|
|
27
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
export class Scheduler {
|
|
3
|
+
runner;
|
|
4
|
+
jobs = new Map();
|
|
5
|
+
constructor(runner) {
|
|
6
|
+
this.runner = runner;
|
|
7
|
+
}
|
|
8
|
+
/** 周期触发(毫秒间隔)。首次触发在 intervalMs 之后。 */
|
|
9
|
+
every(intervalMs, input, opts = {}) {
|
|
10
|
+
const id = randomUUID();
|
|
11
|
+
const timer = setInterval(() => {
|
|
12
|
+
const job = this.jobs.get(id);
|
|
13
|
+
if (job)
|
|
14
|
+
this.dispatch(job);
|
|
15
|
+
}, intervalMs);
|
|
16
|
+
if (typeof timer === 'object' && 'unref' in timer)
|
|
17
|
+
timer.unref?.();
|
|
18
|
+
this.jobs.set(id, {
|
|
19
|
+
id,
|
|
20
|
+
kind: 'every',
|
|
21
|
+
timer,
|
|
22
|
+
intervalMs,
|
|
23
|
+
input,
|
|
24
|
+
options: opts.options,
|
|
25
|
+
source: opts.source,
|
|
26
|
+
prefix: opts.idempotencyPrefix,
|
|
27
|
+
});
|
|
28
|
+
return { id, cancel: () => this.cancel(id) };
|
|
29
|
+
}
|
|
30
|
+
/** 单次触发(指定时刻)。 */
|
|
31
|
+
at(when, input, opts = {}) {
|
|
32
|
+
const id = randomUUID();
|
|
33
|
+
const delay = Math.max(0, when.getTime() - Date.now());
|
|
34
|
+
const timer = setTimeout(() => {
|
|
35
|
+
const job = this.jobs.get(id);
|
|
36
|
+
this.jobs.delete(id);
|
|
37
|
+
if (job)
|
|
38
|
+
this.dispatch(job);
|
|
39
|
+
}, delay);
|
|
40
|
+
this.jobs.set(id, {
|
|
41
|
+
id,
|
|
42
|
+
kind: 'at',
|
|
43
|
+
timer,
|
|
44
|
+
input,
|
|
45
|
+
options: opts.options,
|
|
46
|
+
source: opts.source,
|
|
47
|
+
prefix: opts.idempotencyPrefix,
|
|
48
|
+
});
|
|
49
|
+
return { id, cancel: () => this.cancel(id) };
|
|
50
|
+
}
|
|
51
|
+
cancel(id) {
|
|
52
|
+
const job = this.jobs.get(id);
|
|
53
|
+
if (!job)
|
|
54
|
+
return;
|
|
55
|
+
clearTimeout(job.timer);
|
|
56
|
+
this.jobs.delete(id);
|
|
57
|
+
}
|
|
58
|
+
stop() {
|
|
59
|
+
for (const id of [...this.jobs.keys()])
|
|
60
|
+
this.cancel(id);
|
|
61
|
+
}
|
|
62
|
+
get active() {
|
|
63
|
+
return this.jobs.size;
|
|
64
|
+
}
|
|
65
|
+
dispatch(job) {
|
|
66
|
+
// 'at' 单发:有 prefix 则用固定键(同次重复提交去重);周期任务用窗口键
|
|
67
|
+
const idempotencyKey = job.prefix
|
|
68
|
+
? job.kind === 'every'
|
|
69
|
+
? `${job.prefix}:${Math.floor(Date.now() / (job.intervalMs ?? 1))}`
|
|
70
|
+
: job.prefix
|
|
71
|
+
: undefined;
|
|
72
|
+
try {
|
|
73
|
+
this.runner.submit(job.input, {
|
|
74
|
+
idempotencyKey,
|
|
75
|
+
options: job.options,
|
|
76
|
+
source: job.source ?? `schedule:${job.id.slice(0, 8)}`,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
// 调度触发不应崩掉宿主进程:入参非法等以 console 形式暴露
|
|
81
|
+
console.error(`[agentia:scheduler] ${job.id} 触发失败`, e?.message ?? e);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/run/scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
import type { AgentTool } from '../core/tool.js';
|
|
3
|
+
import type { ContextPolicy } from '../engine/types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Agentia —— run 调用契约(spec §6.3 三类触发共用同一份入参形态)。
|
|
6
|
+
* transport 层(同步 RPC / 异步任务 / 定时)只谈 RunInput / RunSpec,
|
|
7
|
+
* 与具体 agent 装配解耦 —— 换宿主(HTTP/队列/DB)不换语义(spec §6.6)。
|
|
8
|
+
*/
|
|
9
|
+
/** 单次 run 透传给引擎/应用的可选调用参数(与 toolkit/module 的 RunAppOptions 子集对齐) */
|
|
10
|
+
export interface RunInvocationOptions {
|
|
11
|
+
model?: string;
|
|
12
|
+
maxTokens?: number;
|
|
13
|
+
maxIterations?: number;
|
|
14
|
+
client?: Anthropic;
|
|
15
|
+
onText?: (delta: string) => void;
|
|
16
|
+
/** 预置进本次 RunContext.blackboard */
|
|
17
|
+
blackboard?: Record<string, unknown>;
|
|
18
|
+
/** 上下文预算策略(compaction / context editing) */
|
|
19
|
+
contextPolicy?: ContextPolicy;
|
|
20
|
+
/** 幂等键:异步宿主的 at-least-once 去重依据 */
|
|
21
|
+
idempotencyKey?: string;
|
|
22
|
+
/** 硬失败是否抛出;缺省 true(异步宿主置 false 落 failed 记录) */
|
|
23
|
+
rethrow?: boolean;
|
|
24
|
+
tools?: AgentTool[];
|
|
25
|
+
}
|
|
26
|
+
/** 一次任务的规范化入参:messages(已由 normalizeMessages 规整) */
|
|
27
|
+
export interface RunSpec {
|
|
28
|
+
messages: Anthropic.MessageParam[];
|
|
29
|
+
options?: RunInvocationOptions;
|
|
30
|
+
/** 触发来源标记(sync / async / schedule:<id>),供 run 记录审计 */
|
|
31
|
+
source?: string;
|
|
32
|
+
}
|
|
33
|
+
/** transport 层接受的原始入参形态 */
|
|
34
|
+
export type RunInput = string | Anthropic.MessageParam[] | {
|
|
35
|
+
prompt?: string;
|
|
36
|
+
text?: string;
|
|
37
|
+
messages?: Anthropic.MessageParam[];
|
|
38
|
+
};
|
|
39
|
+
/** 把任意任务入参规范成 messages(首条缺省包成 user)。 */
|
|
40
|
+
export declare function normalizeMessages(input: RunInput | unknown): Anthropic.MessageParam[];
|
package/dist/run/spec.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** 把任意任务入参规范成 messages(首条缺省包成 user)。 */
|
|
2
|
+
export function normalizeMessages(input) {
|
|
3
|
+
if (typeof input === 'string') {
|
|
4
|
+
return input ? [{ role: 'user', content: input }] : [];
|
|
5
|
+
}
|
|
6
|
+
if (Array.isArray(input)) {
|
|
7
|
+
if (input.length === 0)
|
|
8
|
+
throw new Error('任务 messages 不能为空');
|
|
9
|
+
return input;
|
|
10
|
+
}
|
|
11
|
+
if (input && typeof input === 'object') {
|
|
12
|
+
const o = input;
|
|
13
|
+
if (Array.isArray(o.messages)) {
|
|
14
|
+
if (o.messages.length === 0)
|
|
15
|
+
throw new Error('任务 messages 不能为空');
|
|
16
|
+
return o.messages;
|
|
17
|
+
}
|
|
18
|
+
if (typeof o.prompt === 'string' && o.prompt)
|
|
19
|
+
return [{ role: 'user', content: o.prompt }];
|
|
20
|
+
if (typeof o.text === 'string' && o.text)
|
|
21
|
+
return [{ role: 'user', content: o.text }];
|
|
22
|
+
}
|
|
23
|
+
throw new Error(`无法识别为任务输入: ${JSON.stringify(input)?.slice(0, 200)}`);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/run/spec.ts"],"names":[],"mappings":"AA0CA,wCAAwC;AACxC,MAAM,UAAU,iBAAiB,CAAC,KAAyB;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC5D,OAAO,KAAiC,CAAC;IAC3C,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,KAAiE,CAAC;QAC5E,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACjE,OAAO,CAAC,CAAC,QAAoC,CAAC;QAChD,CAAC;QACD,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM;YAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3F,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI;YAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { AgentRunResult } from '../engine/types.js';
|
|
2
|
+
import type { SpanError } from '../core/trace.js';
|
|
3
|
+
import type { RunStatus } from './types.js';
|
|
4
|
+
import type { RunSpec } from './spec.js';
|
|
5
|
+
/**
|
|
6
|
+
* Agentia —— run 存储(spec §6.6:异步耐久 = 换宿主不换语义)。
|
|
7
|
+
* 宿主接口:队列/DB 版只需实现 TaskStore,AsyncRunner/调度逻辑不变。
|
|
8
|
+
* v1 交付 InMemoryTaskStore;trace 随 result 一同落记录(§9.3 v1:随 run 结果返回)。
|
|
9
|
+
*/
|
|
10
|
+
export interface TaskRecord {
|
|
11
|
+
taskId: string;
|
|
12
|
+
status: RunStatus;
|
|
13
|
+
idempotencyKey?: string;
|
|
14
|
+
spec: RunSpec;
|
|
15
|
+
/** 执行完成后回填 runId(runId == traceId) */
|
|
16
|
+
runId?: string;
|
|
17
|
+
createdAt: number;
|
|
18
|
+
startedAt?: number;
|
|
19
|
+
finishedAt?: number;
|
|
20
|
+
result?: AgentRunResult;
|
|
21
|
+
error?: SpanError;
|
|
22
|
+
}
|
|
23
|
+
export interface TaskStore {
|
|
24
|
+
save(rec: TaskRecord): void;
|
|
25
|
+
get(taskId: string): TaskRecord | undefined;
|
|
26
|
+
/** 幂等键 → 最近一次任务(last-wins) */
|
|
27
|
+
byIdempotency(key: string): TaskRecord | undefined;
|
|
28
|
+
list(): TaskRecord[];
|
|
29
|
+
clear(): void;
|
|
30
|
+
}
|
|
31
|
+
export declare class InMemoryTaskStore implements TaskStore {
|
|
32
|
+
private readonly byTask;
|
|
33
|
+
private readonly byKey;
|
|
34
|
+
save(rec: TaskRecord): void;
|
|
35
|
+
get(taskId: string): TaskRecord | undefined;
|
|
36
|
+
byIdempotency(key: string): TaskRecord | undefined;
|
|
37
|
+
list(): TaskRecord[];
|
|
38
|
+
clear(): void;
|
|
39
|
+
static nextTaskId(): string;
|
|
40
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
export class InMemoryTaskStore {
|
|
3
|
+
byTask = new Map();
|
|
4
|
+
byKey = new Map(); // idempotencyKey → taskId
|
|
5
|
+
save(rec) {
|
|
6
|
+
this.byTask.set(rec.taskId, rec);
|
|
7
|
+
if (rec.idempotencyKey)
|
|
8
|
+
this.byKey.set(rec.idempotencyKey, rec.taskId);
|
|
9
|
+
}
|
|
10
|
+
get(taskId) {
|
|
11
|
+
return this.byTask.get(taskId);
|
|
12
|
+
}
|
|
13
|
+
byIdempotency(key) {
|
|
14
|
+
const taskId = this.byKey.get(key);
|
|
15
|
+
return taskId ? this.byTask.get(taskId) : undefined;
|
|
16
|
+
}
|
|
17
|
+
list() {
|
|
18
|
+
return [...this.byTask.values()];
|
|
19
|
+
}
|
|
20
|
+
clear() {
|
|
21
|
+
this.byTask.clear();
|
|
22
|
+
this.byKey.clear();
|
|
23
|
+
}
|
|
24
|
+
static nextTaskId() {
|
|
25
|
+
return `task_${randomUUID()}`;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/run/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAmCzC,MAAM,OAAO,iBAAiB;IACX,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IACvC,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,0BAA0B;IAE9E,IAAI,CAAC,GAAe;QAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACjC,IAAI,GAAG,CAAC,cAAc;YAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzE,CAAC;IACD,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IACD,aAAa,CAAC,GAAW;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtD,CAAC;IACD,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IACD,MAAM,CAAC,UAAU;QACf,OAAO,QAAQ,UAAU,EAAE,EAAE,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SystemParam } from '../engine/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* SystemPrompt —— 系统提示拼装 + prompt cache 布局(spec §5)。
|
|
4
|
+
*
|
|
5
|
+
* 缓存是前缀匹配:渲染序 tools → system → messages。
|
|
6
|
+
* 规则:稳定段拼接成一整块并打一个 breakpoint(连带缓存 tools),
|
|
7
|
+
* volatile 段放其后、不带标记(每次重新发送,不污染稳定前缀)。
|
|
8
|
+
* 不要在此插入 Date.now()/随机 id —— 那是隐形 invalidator。
|
|
9
|
+
*/
|
|
10
|
+
export interface SystemSection {
|
|
11
|
+
name: string;
|
|
12
|
+
text: string;
|
|
13
|
+
/** stable=false 的段不进可缓存前缀,放在 breakpoint 之后 */
|
|
14
|
+
stable?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare class SystemPrompt {
|
|
17
|
+
private sections;
|
|
18
|
+
add(section: SystemSection): this;
|
|
19
|
+
add(name: string, text: string, stable?: boolean): this;
|
|
20
|
+
get stableText(): string;
|
|
21
|
+
/** cache=true 时给稳定前缀打 ephemeral breakpoint;否则拼成单个纯文本返回 */
|
|
22
|
+
build(opts?: {
|
|
23
|
+
cache?: boolean;
|
|
24
|
+
}): SystemParam;
|
|
25
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export class SystemPrompt {
|
|
2
|
+
sections = [];
|
|
3
|
+
add(nameOrSection, text, stable = true) {
|
|
4
|
+
if (typeof nameOrSection === 'string') {
|
|
5
|
+
this.sections.push({ name: nameOrSection, text: text ?? '', stable });
|
|
6
|
+
}
|
|
7
|
+
else {
|
|
8
|
+
this.sections.push(nameOrSection);
|
|
9
|
+
}
|
|
10
|
+
return this;
|
|
11
|
+
}
|
|
12
|
+
get stableText() {
|
|
13
|
+
return this.sections
|
|
14
|
+
.filter((s) => s.stable !== false)
|
|
15
|
+
.map((s) => s.text)
|
|
16
|
+
.join('\n\n');
|
|
17
|
+
}
|
|
18
|
+
/** cache=true 时给稳定前缀打 ephemeral breakpoint;否则拼成单个纯文本返回 */
|
|
19
|
+
build(opts = {}) {
|
|
20
|
+
const { cache = false } = opts;
|
|
21
|
+
const stable = this.sections.filter((s) => s.stable !== false).map((s) => s.text);
|
|
22
|
+
const volatile = this.sections.filter((s) => s.stable === false).map((s) => s.text);
|
|
23
|
+
if (!cache) {
|
|
24
|
+
return [...stable, ...volatile].filter(Boolean).join('\n\n');
|
|
25
|
+
}
|
|
26
|
+
const blocks = [];
|
|
27
|
+
if (stable.length) {
|
|
28
|
+
blocks.push({
|
|
29
|
+
type: 'text',
|
|
30
|
+
text: stable.join('\n\n'),
|
|
31
|
+
cache_control: { type: 'ephemeral' },
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
for (const v of volatile) {
|
|
35
|
+
if (v)
|
|
36
|
+
blocks.push({ type: 'text', text: v });
|
|
37
|
+
}
|
|
38
|
+
return blocks;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=systemPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systemPrompt.js","sourceRoot":"","sources":["../../src/run/systemPrompt.ts"],"names":[],"mappings":"AAiBA,MAAM,OAAO,YAAY;IACf,QAAQ,GAAoB,EAAE,CAAC;IAIvC,GAAG,CAAC,aAAqC,EAAE,IAAa,EAAE,MAAM,GAAG,IAAI;QACrE,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,QAAQ;aACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAED,0DAA0D;IAC1D,KAAK,CAAC,IAAI,GAAwB,EAAE;QAClC,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEpF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,MAAM,GAAsB,EAAE,CAAC;QACrC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBACzB,aAAa,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;aACrC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AppCallable } from './async.js';
|
|
2
|
+
import type { RunInvocationOptions } from './spec.js';
|
|
3
|
+
/**
|
|
4
|
+
* Agentia —— 同步 RPC 传输(spec §6.3 同步请求 / §6.6 v1 边界)。
|
|
5
|
+
* 纯适配层:把「任意任务入参 → messages」接 app.run。宿主(HTTP 路由 /
|
|
6
|
+
* AWS Lambda / RPC handler)直接调用返回的 handler,或 runSync。
|
|
7
|
+
* 同一入参形态与 AsyncRunner.submit 一致 —— 触发三类共用一份契约。
|
|
8
|
+
*/
|
|
9
|
+
/** 一次同步 run:规范化入参后立即执行并等待终态。 */
|
|
10
|
+
export declare function runSync(app: AppCallable, input: unknown, opts?: RunInvocationOptions): ReturnType<AppCallable['run']>;
|
|
11
|
+
/** 生成 (input, opts?) → run 结果的同步 handler。 */
|
|
12
|
+
export declare function createSyncHandler(app: AppCallable): (input: unknown, opts?: RunInvocationOptions) => ReturnType<AppCallable['run']>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { normalizeMessages } from './spec.js';
|
|
2
|
+
/**
|
|
3
|
+
* Agentia —— 同步 RPC 传输(spec §6.3 同步请求 / §6.6 v1 边界)。
|
|
4
|
+
* 纯适配层:把「任意任务入参 → messages」接 app.run。宿主(HTTP 路由 /
|
|
5
|
+
* AWS Lambda / RPC handler)直接调用返回的 handler,或 runSync。
|
|
6
|
+
* 同一入参形态与 AsyncRunner.submit 一致 —— 触发三类共用一份契约。
|
|
7
|
+
*/
|
|
8
|
+
/** 一次同步 run:规范化入参后立即执行并等待终态。 */
|
|
9
|
+
export function runSync(app, input, opts) {
|
|
10
|
+
return app.run(normalizeMessages(input), opts);
|
|
11
|
+
}
|
|
12
|
+
/** 生成 (input, opts?) → run 结果的同步 handler。 */
|
|
13
|
+
export function createSyncHandler(app) {
|
|
14
|
+
return (input, opts) => runSync(app, input, opts);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/run/transport.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C;;;;;GAKG;AAEH,gCAAgC;AAChC,MAAM,UAAU,OAAO,CACrB,GAAgB,EAChB,KAAc,EACd,IAA2B;IAE3B,OAAO,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,iBAAiB,CAC/B,GAAgB;IAEhB,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SpanError } from '../core/trace.js';
|
|
2
|
+
/** run 生命周期状态机(spec §6.1) */
|
|
3
|
+
export type RunStatus = 'queued' | 'running' | 'succeeded' | 'failed';
|
|
4
|
+
export interface RunMeta {
|
|
5
|
+
runId: string;
|
|
6
|
+
status: RunStatus;
|
|
7
|
+
idempotencyKey?: string;
|
|
8
|
+
createdAt: number;
|
|
9
|
+
startedAt?: number;
|
|
10
|
+
finishedAt?: number;
|
|
11
|
+
error?: SpanError;
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/run/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentia —— 文本资产加载(units/<name>/ 目录约定的配套 helper)。
|
|
3
|
+
*
|
|
4
|
+
* 一单元一文件夹时,长文本(prompt 模板、子 agent 的 system)放在单元目录里的
|
|
5
|
+
* .md 文件,单元代码里 `asset(import.meta.url, './system.md')` 直读:
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* // units/reviewer/index.ts
|
|
9
|
+
* import { SubAgent, asset } from 'agentia';
|
|
10
|
+
* export default class Reviewer {
|
|
11
|
+
* @SubAgent({ description: '…', schema: {...}, system: asset(import.meta.url, './system.md') })
|
|
12
|
+
* reviewer(_input: { doc: string }): void {}
|
|
13
|
+
* }
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* 每次调用现读、不缓存:@Prompt 的 volatile 语义(每次调用重算)要求资产新鲜;
|
|
17
|
+
* 文本文件读取开销可忽略。要在模块加载期固化,就在模块顶层调用一次存常量。
|
|
18
|
+
*
|
|
19
|
+
* @param base 调用方模块的 import.meta.url(相对它解析 rel)
|
|
20
|
+
* @param rel 相对资产路径('./system.md')
|
|
21
|
+
*/
|
|
22
|
+
export declare function asset(base: string | URL, rel: string): string;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
/**
|
|
3
|
+
* Agentia —— 文本资产加载(units/<name>/ 目录约定的配套 helper)。
|
|
4
|
+
*
|
|
5
|
+
* 一单元一文件夹时,长文本(prompt 模板、子 agent 的 system)放在单元目录里的
|
|
6
|
+
* .md 文件,单元代码里 `asset(import.meta.url, './system.md')` 直读:
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* // units/reviewer/index.ts
|
|
10
|
+
* import { SubAgent, asset } from 'agentia';
|
|
11
|
+
* export default class Reviewer {
|
|
12
|
+
* @SubAgent({ description: '…', schema: {...}, system: asset(import.meta.url, './system.md') })
|
|
13
|
+
* reviewer(_input: { doc: string }): void {}
|
|
14
|
+
* }
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* 每次调用现读、不缓存:@Prompt 的 volatile 语义(每次调用重算)要求资产新鲜;
|
|
18
|
+
* 文本文件读取开销可忽略。要在模块加载期固化,就在模块顶层调用一次存常量。
|
|
19
|
+
*
|
|
20
|
+
* @param base 调用方模块的 import.meta.url(相对它解析 rel)
|
|
21
|
+
* @param rel 相对资产路径('./system.md')
|
|
22
|
+
*/
|
|
23
|
+
export function asset(base, rel) {
|
|
24
|
+
return readFileSync(new URL(rel, base), 'utf8');
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=asset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset.js","sourceRoot":"","sources":["../../src/toolkit/asset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,KAAK,CAAC,IAAkB,EAAE,GAAW;IACnD,OAAO,YAAY,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { isAbsolute, join, resolve } from 'node:path';
|
|
3
|
+
import { pathToFileURL } from 'node:url';
|
|
4
|
+
import { isProvider } from '../container/container.js';
|
|
5
|
+
/**
|
|
6
|
+
* Agentia —— 单元目录发现(units/<name>/ 目录约定,spec §7 静态校验仍由装配层统一做)。
|
|
7
|
+
*
|
|
8
|
+
* 约定:
|
|
9
|
+
* - 每个子目录 = 一个单元文件夹,入口为 index.ts / index.mts / index.js / index.mjs(按序取先存在者);
|
|
10
|
+
* - 入口 default export 支持三种形态:
|
|
11
|
+
* 1. 类 → { provide: <文件夹名>, useClass: 该类 }
|
|
12
|
+
* 2. Provider 对象 → 原样使用(可用 useFactory/useValue 自定义 token)
|
|
13
|
+
* 3. Provider 数组 → 展开(一个文件夹暴露多个 provider)
|
|
14
|
+
* - DI token 缺省 = 文件夹名(kebab-case 文件夹即 kebab-case token,单元引用照写)。
|
|
15
|
+
*
|
|
16
|
+
* 与手动 providers 可混用:createApp({ providers, discover }) 合并注册,
|
|
17
|
+
* 重名/引用校验在装配期统一进行(AgentApp 构造函数)。
|
|
18
|
+
*
|
|
19
|
+
* 动态 import 决定本函数是异步的 —— createApp 带 discover 时同样返回 Promise。
|
|
20
|
+
*/
|
|
21
|
+
const ENTRY_CANDIDATES = ['index.ts', 'index.mts', 'index.js', 'index.mjs'];
|
|
22
|
+
export async function discoverProviders(dir) {
|
|
23
|
+
const root = isAbsolute(dir) ? dir : resolve(process.cwd(), dir);
|
|
24
|
+
if (!existsSync(root)) {
|
|
25
|
+
throw new Error(`单元目录不存在: ${root}(先创建或用 CLI: agentia g <type> <name>)`);
|
|
26
|
+
}
|
|
27
|
+
const providers = [];
|
|
28
|
+
const entries = readdirSync(root, { withFileTypes: true })
|
|
29
|
+
.filter((e) => e.isDirectory())
|
|
30
|
+
.map((e) => e.name)
|
|
31
|
+
.sort(); // 排序保证装配顺序稳定(菜单顺序 = 目录名序,可复现)
|
|
32
|
+
for (const name of entries) {
|
|
33
|
+
const entry = ENTRY_CANDIDATES.map((f) => join(root, name, f)).find(existsSync);
|
|
34
|
+
if (!entry)
|
|
35
|
+
continue; // 无入口的目录视为非单元目录(如 assets/),跳过
|
|
36
|
+
const mod = await import(pathToFileURL(entry).href);
|
|
37
|
+
const exported = mod.default;
|
|
38
|
+
providers.push(...normalizeExport(name, exported, entry));
|
|
39
|
+
}
|
|
40
|
+
return providers;
|
|
41
|
+
}
|
|
42
|
+
function normalizeExport(name, exported, entry) {
|
|
43
|
+
if (typeof exported === 'function') {
|
|
44
|
+
return [{ provide: name, useClass: exported }];
|
|
45
|
+
}
|
|
46
|
+
if (isProvider(exported)) {
|
|
47
|
+
return [exported];
|
|
48
|
+
}
|
|
49
|
+
if (Array.isArray(exported) && exported.every(isProvider)) {
|
|
50
|
+
return exported;
|
|
51
|
+
}
|
|
52
|
+
throw new Error(`单元入口 ${entry} 的 default export 形态非法:应为「类 / Provider / Provider[]」,实际 ${describe(exported)}`);
|
|
53
|
+
}
|
|
54
|
+
function describe(x) {
|
|
55
|
+
if (x === undefined)
|
|
56
|
+
return 'undefined(缺少 default export?)';
|
|
57
|
+
if (x === null)
|
|
58
|
+
return 'null';
|
|
59
|
+
return typeof x;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=discover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/toolkit/discover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW;IACjD,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;IACjE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,sCAAsC,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,SAAS,GAAe,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SACvD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,IAAI,EAAE,CAAC,CAAC,8BAA8B;IAEzC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChF,IAAI,CAAC,KAAK;YAAE,SAAS,CAAC,8BAA8B;QACpD,MAAM,GAAG,GAAY,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAI,GAA6B,CAAC,OAAO,CAAC;QACxD,SAAS,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,QAAiB,EAAE,KAAa;IACrE,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAA4B,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1D,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,KAAK,CACb,QAAQ,KAAK,2DAA2D,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAC7F,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU;IAC1B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,+BAA+B,CAAC;IAC5D,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAC9B,OAAO,OAAO,CAAC,CAAC;AAClB,CAAC"}
|