<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Cordis on AI</title>
        <link>https://ai.programnotes.cn/tags/cordis/</link>
        <description>Recent content in Cordis on AI</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-CN</language>
        <lastBuildDate>Mon, 17 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://ai.programnotes.cn/tags/cordis/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Cordis：时空可组合性的元框架</title>
        <link>https://ai.programnotes.cn/p/cordis%E6%97%B6%E7%A9%BA%E5%8F%AF%E7%BB%84%E5%90%88%E6%80%A7%E7%9A%84%E5%85%83%E6%A1%86%E6%9E%B6/</link>
        <pubDate>Mon, 17 Aug 2026 00:00:00 +0000</pubDate>
        
        <guid>https://ai.programnotes.cn/p/cordis%E6%97%B6%E7%A9%BA%E5%8F%AF%E7%BB%84%E5%90%88%E6%80%A7%E7%9A%84%E5%85%83%E6%A1%86%E6%9E%B6/</guid>
        <description>&lt;h2 id=&#34;今日-github-trending-1cordis&#34;&gt;今日 GitHub Trending #1：Cordis
&lt;/h2&gt;&lt;p&gt;今天 GitHub Trending 榜单第一名的项目是 &lt;a class=&#34;link&#34; href=&#34;https://github.com/cordiverse/cordis&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;cordiverse/cordis&lt;/a&gt;，一个 TypeScript 编写的元框架，主打&amp;quot;时空可组合性&amp;quot;（Spatiotemporal Composability）。截至发稿，该项目已获得 5,222 stars，今日新增 720 stars，281 forks，采用 MIT 许可证。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://opengraph.githubassets.com/1/cordiverse/cordis&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Cordis GitHub&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;cordis-是什么&#34;&gt;Cordis 是什么？
&lt;/h2&gt;&lt;p&gt;Cordis 是一个&lt;strong&gt;元框架&lt;/strong&gt;——不是用来写应用的框架，而是用来写框架的框架。它的核心理念是将经典的 &lt;strong&gt;effect&lt;/strong&gt;（副作用）和 &lt;strong&gt;coeffect&lt;/strong&gt;（协效）概念从编译时类型系统提升为运行时机制，从而为动态组合提供正式的理论基础。&lt;/p&gt;
&lt;p&gt;该项目由 &lt;strong&gt;shigma&lt;/strong&gt; 等开发者维护，已有 550+ 次提交，最早的提交可追溯到 2022 年 5 月。目前 Cordis 处于活跃开发阶段，API 尚未稳定，但已被 &lt;strong&gt;DeepSeek Harness&lt;/strong&gt; 以 vendor 方式引入作为底层插件框架。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;论文地址：&lt;a class=&#34;link&#34; href=&#34;https://github.com/cordiverse/paper&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;A Programming Paradigm for Spatiotemporal Composability&lt;/a&gt;（2026 年 8 月 13 日草稿）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;核心理论时空两个维度&#34;&gt;核心理论：时空两个维度
&lt;/h2&gt;&lt;p&gt;论文提出了动态组合问题的两个正交维度：&lt;/p&gt;
&lt;h3 id=&#34;时间可组合性temporal-composability&#34;&gt;时间可组合性（Temporal Composability）
&lt;/h3&gt;&lt;p&gt;组件被移除时，其所有副作用可以&lt;strong&gt;完全撤销&lt;/strong&gt;。Cordis 通过&lt;strong&gt;可逆效应&lt;/strong&gt;（Revertible Effects）实现——每一次上下文变换都携带一个逆操作，由运行时跟踪。&lt;/p&gt;
&lt;h3 id=&#34;空间可组合性spatial-composability&#34;&gt;空间可组合性（Spatial Composability）
&lt;/h3&gt;&lt;p&gt;组件可以&lt;strong&gt;声明并响应式管理&lt;/strong&gt;彼此之间的依赖关系。Cordis 通过&lt;strong&gt;响应式协效&lt;/strong&gt;（Reactive Coeffects）实现——上下文的每次变更都会根据组件的协效规格通知相关组件。&lt;/p&gt;
&lt;p&gt;这两种机制被统一到一个单一的&lt;strong&gt;上下文类型&lt;/strong&gt;（Context Type）中，构成了一种编程范式。&lt;/p&gt;
&lt;h2 id=&#34;五个核心概念&#34;&gt;五个核心概念
&lt;/h2&gt;&lt;p&gt;从实践角度看，Cordis 的设计围绕五个关键概念：&lt;/p&gt;
&lt;h3 id=&#34;1-插件是实现-service-的对象&#34;&gt;1. 插件是实现 Service 的对象
&lt;/h3&gt;&lt;p&gt;插件可以是一个带有可选 &lt;code&gt;inject&lt;/code&gt; 和 &lt;code&gt;apply(ctx)&lt;/code&gt; 字段的函数，也可以是一个 &lt;code&gt;Service&lt;/code&gt; 子类。其生命周期由 Cordis 挂载到当前上下文中管理。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Context&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;@deepseek-ai/cordis&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 函数式插件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;myPlugin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;Context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// 插件逻辑
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;effect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;插件启动&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;插件卸载&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// disposer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-上下文是服务的容器&#34;&gt;2. 上下文是服务的容器
&lt;/h3&gt;&lt;p&gt;一个服务占据一个稳定的 &lt;code&gt;ctx.&amp;lt;key&amp;gt;&lt;/code&gt;（如 &lt;code&gt;ctx.tools&lt;/code&gt;、&lt;code&gt;ctx.llm&lt;/code&gt;、&lt;code&gt;ctx.sessions&lt;/code&gt;）。其他插件通过 key 查找服务，而非导入具体实现。这实现了&lt;strong&gt;松耦合&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;3-通过-inject-声明服务依赖&#34;&gt;3. 通过 &lt;code&gt;inject&lt;/code&gt; 声明服务依赖
&lt;/h3&gt;&lt;p&gt;插件声明所需的服务后，会等待这些服务就绪才启动。加载顺序通过服务依赖自动推导，而非手动编排启动序列。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;myPlugin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;Context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;config&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;Config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// 通过 inject 声明依赖
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;effect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;result&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;someService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;doSomething&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;someService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;cleanup&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;myPlugin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inject&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;someService&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// 等待 someService 就绪
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;4-类型化事件用于通信&#34;&gt;4. 类型化事件用于通信
&lt;/h3&gt;&lt;p&gt;服务通过 TypeScript 声明合并注册事件名，然后以不同模式分发：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;模式&lt;/th&gt;
					&lt;th&gt;是否 await&lt;/th&gt;
					&lt;th&gt;分发顺序&lt;/th&gt;
					&lt;th&gt;是否有返回值&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;emit&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;否&lt;/td&gt;
					&lt;td&gt;注册顺序&lt;/td&gt;
					&lt;td&gt;否&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;waterfall&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;否&lt;/td&gt;
					&lt;td&gt;注册顺序&lt;/td&gt;
					&lt;td&gt;是&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;parallel&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;是&lt;/td&gt;
					&lt;td&gt;并行&lt;/td&gt;
					&lt;td&gt;否&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;serial&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;是&lt;/td&gt;
					&lt;td&gt;注册顺序&lt;/td&gt;
					&lt;td&gt;是&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Waterfall 模式&lt;/strong&gt;特别值得一提：它是一种环绕中间件模式。监听器接收 &lt;code&gt;(...args, next)&lt;/code&gt;，调用 &lt;code&gt;next()&lt;/code&gt; 会执行下游监听器，下游返回值通过 &lt;code&gt;next()&lt;/code&gt; 返回当前包装层。不调用 &lt;code&gt;next()&lt;/code&gt; 则短路——这对于单决策事件是设计意图。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Waterfall 示例：拦截式中间件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;my-event&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;next&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;前置处理&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;result&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;next&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// 委托下游
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;后置处理&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;result&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;5-注册是可逆的副作用&#34;&gt;5. 注册是可逆的副作用
&lt;/h3&gt;&lt;p&gt;提示词片段、工具 schema、适配器、提供方和监听器通过 &lt;code&gt;ctx.effect()&lt;/code&gt; 或 &lt;code&gt;ctx.on()&lt;/code&gt; 安装，在 reload 和 teardown 时会按预期撤销。每个注册都应有对应的 &lt;strong&gt;disposer&lt;/strong&gt;（资源释放函数）。&lt;/p&gt;
&lt;h2 id=&#34;实际应用deepseek-harness&#34;&gt;实际应用：DeepSeek Harness
&lt;/h2&gt;&lt;p&gt;Cordis 目前最引人注目的应用是 &lt;strong&gt;DeepSeek Harness&lt;/strong&gt;——一个 Agent 开发框架。在 DeepSeek Harness 中，每项能力（工具、LLM 适配器、文件访问、agent loop 本身）都是挂载到共享上下文中的插件。&lt;/p&gt;
&lt;h3 id=&#34;教程体系&#34;&gt;教程体系
&lt;/h3&gt;&lt;p&gt;DeepSeek Harness 提供了一个逐步实践的 Cordis 教程，共 7 章：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;你的第一个插件&lt;/strong&gt; — 插件是函数，由 loader 挂载&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生命周期与 effect&lt;/strong&gt; — Cordis 管理的注册会在卸载时撤销&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务&lt;/strong&gt; — 在 &lt;code&gt;ctx&lt;/code&gt; 上公开能力，通过 &lt;code&gt;inject&lt;/code&gt; 依赖&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;事件&lt;/strong&gt; — 类型化事件、广播分发和 waterfall 短路行为&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置&lt;/strong&gt; — 读取 YAML 中经过校验的配置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组合与 HMR&lt;/strong&gt; — 配置文件作为插件树，热模块替换&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;进入 harness&lt;/strong&gt; — 基于真实服务注册可由模型调用的工具&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;快速开始&#34;&gt;快速开始
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/deepseek-ai/deepseek-harness.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; deepseek-harness
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pnpm install
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 创建临时目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -p tmp/cordis-tutorial
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; tmp/cordis-tutorial
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 运行启动器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;node --import tsx ../../vendor/cordis/bin.js
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这个单文件启动器会创建根 &lt;code&gt;Context&lt;/code&gt;、挂载 Loader 插件，并从当前目录加载 &lt;code&gt;./cordis.yml&lt;/code&gt; 配置。所有插件和配置都来自你编写的 YAML 文件，&lt;code&gt;--import tsx&lt;/code&gt; 让 Node 无需构建步骤即可运行 TypeScript。&lt;/p&gt;
&lt;h2 id=&#34;架构设计亮点&#34;&gt;架构设计亮点
&lt;/h2&gt;&lt;h3 id=&#34;配置协调configuration-reconciliation&#34;&gt;配置协调（Configuration Reconciliation）
&lt;/h3&gt;&lt;p&gt;Cordis 的声明式组件加载器支持配置协调和热模块替换（HMR）。&lt;code&gt;@deepseek-ai/cordis-plugin-include&lt;/code&gt; 插件将 &lt;code&gt;!!js&lt;/code&gt; 解析为表达式节点，基于插件上下文插值配置，并在每次挂载决策时基于 loader 上下文插值 &lt;code&gt;disabled&lt;/code&gt; 字段。&lt;/p&gt;
&lt;h3 id=&#34;实践规则&#34;&gt;实践规则
&lt;/h3&gt;&lt;p&gt;Cordis 团队推荐以下实践：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;将行为封装为插件&lt;/strong&gt;：工具流水线事件属于 &lt;code&gt;ctx.tools&lt;/code&gt;，模型流式输出属于 &lt;code&gt;ctx.llm&lt;/code&gt;，Agent 协调属于 &lt;code&gt;ctx.agents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拦截和策略优先使用事件&lt;/strong&gt;；直接能力调用优先使用服务方法&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;每个注册都应有对应的 disposer&lt;/strong&gt;：从 &lt;code&gt;ctx.effect()&lt;/code&gt; 返回，或使用辅助方法自动处理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;teardown 顺序有要求时&lt;/strong&gt;，将相关工作放在同一个 effect 中&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;为什么值得关注&#34;&gt;为什么值得关注？
&lt;/h2&gt;&lt;h3 id=&#34;理论与实践结合&#34;&gt;理论与实践结合
&lt;/h3&gt;&lt;p&gt;Cordis 不是一个简单的插件系统，它有完整的&lt;strong&gt;形式化理论&lt;/strong&gt;支撑。论文从 effect/coeffect 类型论出发，建立了可逆效应和响应式协效的元理论，再将其统一为上下文类型。这种从理论到实现的完整闭环在开源项目中相当罕见。&lt;/p&gt;
&lt;h3 id=&#34;ai-agent-时代的底座&#34;&gt;AI Agent 时代的底座
&lt;/h3&gt;&lt;p&gt;随着 AI Agent 系统越来越复杂，&amp;ldquo;动态组合&amp;quot;成为核心需求——插件需要随时加载/卸载，组件之间需要声明依赖，副作用需要可靠撤销。Cordis 正是为这种场景设计的。&lt;/p&gt;
&lt;h3 id=&#34;deepseek-生态背书&#34;&gt;DeepSeek 生态背书
&lt;/h3&gt;&lt;p&gt;被 DeepSeek Harness 采用作为底层框架，意味着 Cordis 已经在大型生产级 AI Agent 系统中得到了验证。&lt;/p&gt;
&lt;h2 id=&#34;项目信息&#34;&gt;项目信息
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;属性&lt;/th&gt;
					&lt;th&gt;值&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;仓库&lt;/td&gt;
					&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/cordiverse/cordis&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;cordiverse/cordis&lt;/a&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;语言&lt;/td&gt;
					&lt;td&gt;TypeScript&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Stars&lt;/td&gt;
					&lt;td&gt;5,222 (+720 today)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Forks&lt;/td&gt;
					&lt;td&gt;281&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;许可证&lt;/td&gt;
					&lt;td&gt;MIT&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;论文&lt;/td&gt;
					&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/cordiverse/paper&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;A Programming Paradigm for Spatiotemporal Composability&lt;/a&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;文档&lt;/td&gt;
					&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://deepseek-harness.github.io/deepseek-harness/reference/cordis-primer&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Cordis Primer&lt;/a&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;教程&lt;/td&gt;
					&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://deepseek-harness.github.io/deepseek-harness/develop/cordis-tutorial/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Cordis Tutorial&lt;/a&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;状态&lt;/td&gt;
					&lt;td&gt;活跃开发中，API 未稳定&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;本文基于 2026-08-17 GitHub Trending 数据生成。Cordis 处于早期开发阶段，API 可能发生变化，请以官方仓库为准。&lt;/em&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
