create-windy 0.2.33 → 0.2.34

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.
Files changed (69) hide show
  1. package/dist/cli.js +7 -1
  2. package/package.json +1 -1
  3. package/template/.agents/skills/windy-business-module/SKILL.md +10 -1
  4. package/template/.windy-template.json +2 -2
  5. package/template/AGENTS.md +4 -0
  6. package/template/apps/agent-server/README.md +10 -0
  7. package/template/apps/agent-server/src/southwind_agent_server/app.py +62 -1
  8. package/template/apps/agent-server/src/southwind_agent_server/contracts.py +35 -0
  9. package/template/apps/agent-server/src/southwind_agent_server/engine.py +2 -0
  10. package/template/apps/agent-server/src/southwind_agent_server/openai_engine.py +31 -3
  11. package/template/apps/agent-server/src/southwind_agent_server/openai_provider.py +22 -9
  12. package/template/apps/agent-server/src/southwind_agent_server/provider_audit.py +144 -0
  13. package/template/apps/agent-server/src/southwind_agent_server/provider_governance.py +227 -0
  14. package/template/apps/agent-server/src/southwind_agent_server/service.py +1 -0
  15. package/template/apps/agent-server/tests/test_api.py +16 -1
  16. package/template/apps/agent-server/tests/test_openai_provider.py +79 -0
  17. package/template/apps/agent-server/tests/test_provider_governance.py +215 -0
  18. package/template/apps/server/src/agent/provider-input-governance.test.ts +82 -0
  19. package/template/apps/server/src/agent/provider-input-governance.ts +140 -0
  20. package/template/apps/server/src/agent/remote-runtime.test.ts +22 -0
  21. package/template/apps/server/src/agent/remote-runtime.ts +1 -0
  22. package/template/apps/server/src/agent/run-contracts.ts +2 -0
  23. package/template/apps/server/src/agent/run-facade.test.ts +52 -2
  24. package/template/apps/server/src/agent/run-facade.ts +36 -2
  25. package/template/apps/server/src/index.ts +28 -45
  26. package/template/apps/server/src/module-host/initialize-contracts.ts +6 -0
  27. package/template/apps/server/src/module-host/initialize.ts +30 -44
  28. package/template/apps/server/src/module-host/request-context.ts +23 -17
  29. package/template/apps/server/src/module-host/resource-file-policies.test.ts +197 -0
  30. package/template/apps/server/src/module-host/resource-file-policies.ts +108 -0
  31. package/template/apps/server/src/module-host/route-declaration.ts +45 -0
  32. package/template/apps/server/src/module-host/route-installer.ts +27 -3
  33. package/template/apps/server/src/module-host/storage-port.test.ts +170 -1
  34. package/template/apps/server/src/module-host/storage-port.ts +134 -1
  35. package/template/apps/server/src/module-host/storage-scope.ts +96 -0
  36. package/template/apps/server/src/module-host/tool-handlers.test.ts +305 -0
  37. package/template/apps/server/src/module-host/tool-handlers.ts +38 -4
  38. package/template/apps/server/src/module-host/user-directory-composition.test.ts +126 -0
  39. package/template/apps/server/src/module-host/user-directory-port.test.ts +238 -0
  40. package/template/apps/server/src/module-host/user-directory-port.ts +143 -0
  41. package/template/apps/server/src/module-host.ts +4 -0
  42. package/template/apps/server/src/runtime-development.ts +1 -0
  43. package/template/apps/server/src/system/built-in-roles.ts +1 -0
  44. package/template/docker-compose.yml +2 -0
  45. package/template/docs/architecture/ai-egress.md +49 -7
  46. package/template/docs/architecture/ai-runtime.md +20 -1
  47. package/template/docs/architecture/data-scope-query-enforcement.md +4 -0
  48. package/template/docs/architecture/object-storage.md +22 -2
  49. package/template/docs/development/custom-login-page.md +3 -3
  50. package/template/docs/platform/agent-runtime.md +44 -1
  51. package/template/docs/platform/business-user-directory.md +82 -0
  52. package/template/packages/modules/package.json +1 -1
  53. package/template/packages/modules/src/ai-operation-composition.test.ts +68 -0
  54. package/template/packages/modules/src/ai-operation-composition.ts +115 -0
  55. package/template/packages/modules/src/manifest.ts +26 -0
  56. package/template/packages/modules/src/provider-data-policy-composition.test.ts +74 -0
  57. package/template/packages/modules/src/system-audit-actions.ts +5 -0
  58. package/template/packages/modules/src/system-features.ts +5 -0
  59. package/template/packages/modules/src/system-module-catalog.test.ts +16 -0
  60. package/template/packages/modules/src/system-module-catalog.ts +26 -3
  61. package/template/packages/modules/src/system-permissions.ts +2 -0
  62. package/template/packages/server-sdk/index.ts +11 -0
  63. package/template/packages/server-sdk/package.json +3 -2
  64. package/template/packages/server-sdk/src/ai-operation-registration.ts +2 -1
  65. package/template/packages/server-sdk/src/module-host.ts +8 -0
  66. package/template/packages/server-sdk/src/request-context.ts +2 -0
  67. package/template/packages/server-sdk/src/storage-port.ts +66 -0
  68. package/template/packages/server-sdk/src/tool-registration.ts +6 -0
  69. package/template/packages/server-sdk/src/user-directory-port.ts +42 -0
@@ -3,6 +3,7 @@ import type { ModuleAiOperationHandlerRegistration } from "./ai-operation-regist
3
3
  import type { ModuleRolePreset } from "./role-preset.js";
4
4
  import type { ModuleRouteDefinition } from "./route-definition.js";
5
5
  import type { ModuleSearchProvider } from "./search-provider-port.js";
6
+ import type { ModuleResourceFileAccessPolicy } from "./storage-port.js";
6
7
  import type { ModuleTaskHandlerRegistration } from "./task-registration.js";
7
8
  import type { ModuleToolHandlerRegistration } from "./tool-registration.js";
8
9
 
@@ -25,6 +26,13 @@ export interface ModuleUploadPolicy {
25
26
  export interface ModuleHost {
26
27
  readonly moduleName: string;
27
28
  registerUploadPolicy(policy: ModuleUploadPolicy): void;
29
+ /**
30
+ * 注册跨上传者资源文件读取策略;purpose 必须由本模块或 Manifest 显式依赖模块的
31
+ * Upload Policy 声明,Feature、Permission 与 Audit Action 必须来自当前 Manifest。
32
+ */
33
+ registerResourceFileAccessPolicies(
34
+ policies: readonly ModuleResourceFileAccessPolicy[],
35
+ ): void;
28
36
  registerDurableHandler<T>(definition: DurableHandlerDefinition<T>): void;
29
37
  /** 注册 Guarded API 路由;须与 Manifest `apiPermissions` 声明一致。 */
30
38
  registerRoutes(routes: readonly ModuleRouteDefinition[]): void;
@@ -2,6 +2,7 @@ import type { ModuleActor } from "./actor.js";
2
2
  import type { ModuleAuditEmitter } from "./audit-port.js";
3
3
  import type { ModuleJobSubmitter } from "./jobs-port.js";
4
4
  import type { ModuleStoragePort } from "./storage-port.js";
5
+ import type { ModuleUserDirectoryPort } from "./user-directory-port.js";
5
6
 
6
7
  /**
7
8
  * 模块路由 Handler 的受限请求上下文。
@@ -18,4 +19,5 @@ export interface ModuleRequestContext {
18
19
  readonly audit: ModuleAuditEmitter;
19
20
  readonly jobs: ModuleJobSubmitter;
20
21
  readonly storage: ModuleStoragePort;
22
+ readonly userDirectory: ModuleUserDirectoryPort;
21
23
  }
@@ -1,4 +1,5 @@
1
1
  import type { OpenedFile, UploadSession } from "@southwind-ai/storage";
2
+ import type { ModuleActor } from "./actor.js";
2
3
 
3
4
  export interface ModuleUploadSessionInput {
4
5
  readonly purpose: string;
@@ -9,6 +10,62 @@ export interface ModuleUploadSessionInput {
9
10
  readonly fileExpiresAt?: Date;
10
11
  }
11
12
 
13
+ export interface ModuleResourceFileRequest {
14
+ /** 平台文件元数据 ID;不能是 ArtifactRef、对象存储 Key 或主机路径。 */
15
+ readonly fileId: string;
16
+ /**
17
+ * 必须与本模块或 Manifest 显式依赖模块注册的 Upload Policy,以及当前模块的
18
+ * 资源文件访问策略完全一致。
19
+ */
20
+ readonly purpose: string;
21
+ /** 本模块命名空间内的稳定业务资源类型,例如 `evidence.file`。 */
22
+ readonly resourceType: string;
23
+ /** 由授权策略回查业务 Repository 的稳定资源 ID。 */
24
+ readonly resourceId: string;
25
+ }
26
+
27
+ /** 资源授权读取仅返回业务所需的最小元数据与受限文件流。 */
28
+ export interface ModuleOpenedResourceFile {
29
+ readonly id: string;
30
+ readonly purpose: string;
31
+ readonly filename: string;
32
+ readonly mimeType: string;
33
+ readonly byteSize: number;
34
+ readonly sha256: string;
35
+ readonly body: ReadableStream<Uint8Array>;
36
+ }
37
+
38
+ export interface ModuleResourceFileAccessContext {
39
+ readonly actor: ModuleActor;
40
+ readonly requestId: string;
41
+ readonly signal: AbortSignal;
42
+ }
43
+
44
+ /**
45
+ * 业务模块注册的资源到平台文件关联授权策略。
46
+ *
47
+ * `authorize` 必须从 project-owned Repository 回查 resourceId,确认当前 Actor
48
+ * 可访问该业务资源且该资源实际绑定 fileId;客户端或 Tool 输入不是授权证据。
49
+ */
50
+ export interface ModuleResourceFileAccessPolicy {
51
+ /**
52
+ * 本模块或 Manifest 显式依赖模块拥有的 Upload Policy purpose;
53
+ * 平台基础 purpose 与未声明跨模块 purpose 均不可引用。
54
+ */
55
+ readonly purpose: string;
56
+ readonly resourceType: string;
57
+ readonly featureKey: string;
58
+ readonly permissionKey: string;
59
+ readonly auditAction: string;
60
+ authorize(
61
+ input: Readonly<{
62
+ fileId: string;
63
+ resourceId: string;
64
+ }>,
65
+ context: ModuleResourceFileAccessContext,
66
+ ): Promise<boolean> | boolean;
67
+ }
68
+
12
69
  /**
13
70
  * 模块受限 Upload / BlobRead Port。
14
71
  *
@@ -22,4 +79,13 @@ export interface ModuleStoragePort {
22
79
  createUploadSession(input: ModuleUploadSessionInput): Promise<UploadSession>;
23
80
  openFile(fileId: string): Promise<OpenedFile>;
24
81
  openPublicFile(fileId: string, purpose: string): Promise<OpenedFile>;
82
+ /**
83
+ * 经 Host Feature / Permission 与业务资源策略双重授权后读取文件。
84
+ *
85
+ * 允许同一业务范围内跨上传者读取,但不授予任意 manage、Repository、BlobStore
86
+ * 或 ArtifactRef 能力。
87
+ */
88
+ openResourceFile(
89
+ input: ModuleResourceFileRequest,
90
+ ): Promise<ModuleOpenedResourceFile>;
25
91
  }
@@ -1,10 +1,16 @@
1
1
  import type { ModuleActor } from "./actor.js";
2
2
  import type { ModuleAiJsonValue } from "./ai-operation-registration.js";
3
+ import type { ModuleStoragePort } from "./storage-port.js";
3
4
 
4
5
  export interface ModuleToolContext {
5
6
  readonly actor: ModuleActor;
6
7
  readonly requestId: string;
7
8
  readonly signal: AbortSignal;
9
+ /**
10
+ * 与当前 Tool Actor、请求范围和模块命名空间绑定的受限存储 Port。
11
+ * Host 未安装 Storage 时为 fail-closed 实现。
12
+ */
13
+ readonly storage: ModuleStoragePort;
8
14
  }
9
15
 
10
16
  export type ModuleToolInput = Readonly<Record<string, ModuleAiJsonValue>>;
@@ -0,0 +1,42 @@
1
+ export interface ModuleUserDirectoryQuery {
2
+ readonly page?: number;
3
+ readonly pageSize?: number;
4
+ readonly q?: string;
5
+ }
6
+
7
+ export interface ModuleUserDirectoryEntry {
8
+ readonly id: string;
9
+ readonly displayName: string;
10
+ }
11
+
12
+ export interface ModuleUserDirectoryPage {
13
+ readonly items: readonly ModuleUserDirectoryEntry[];
14
+ readonly total: number;
15
+ readonly page: number;
16
+ readonly pageSize: number;
17
+ }
18
+
19
+ export type ModuleUserDirectoryErrorCode =
20
+ | "USER_DIRECTORY_FORBIDDEN"
21
+ | "USER_DIRECTORY_UNAVAILABLE"
22
+ | "USER_DIRECTORY_INVALID_QUERY";
23
+
24
+ export class ModuleUserDirectoryError extends Error {
25
+ constructor(
26
+ readonly code: ModuleUserDirectoryErrorCode,
27
+ message: string,
28
+ ) {
29
+ super(message);
30
+ this.name = "ModuleUserDirectoryError";
31
+ }
32
+ }
33
+
34
+ /**
35
+ * 业务模块使用的只读启用用户目录。
36
+ *
37
+ * Actor、租户、部门与 Data Scope 全部由宿主绑定;调用方只能提交分页和搜索条件。
38
+ * 宿主会执行 Feature、Permission、数据范围与审计,失败时不会降级为全量用户查询。
39
+ */
40
+ export interface ModuleUserDirectoryPort {
41
+ list(query?: ModuleUserDirectoryQuery): Promise<ModuleUserDirectoryPage>;
42
+ }