86 lines
2.6 KiB
Go
86 lines
2.6 KiB
Go
package tools
|
|
|
|
// ── Built-in Predicates (v0.25.0) ──────────
|
|
//
|
|
// Predicates determine tool availability based on runtime context.
|
|
// Tools declare their availability by returning a Require from
|
|
// Availability(). The registry evaluates predicates in AvailableFor()
|
|
// before sending tool definitions to the LLM.
|
|
//
|
|
// AlwaysAvailable is defined in types.go (BaseTool references it).
|
|
|
|
// RequireWorkspace returns true when a workspace is bound to the
|
|
// channel. Workspace and git tools use this.
|
|
func RequireWorkspace(tc ToolContext) bool {
|
|
return tc.WorkspaceID != ""
|
|
}
|
|
|
|
// RequireWorkflow returns true when the channel is a workflow instance.
|
|
// Workflow-specific tools (e.g. workflow_advance) use this.
|
|
func RequireWorkflow(tc ToolContext) bool {
|
|
return tc.WorkflowID != ""
|
|
}
|
|
|
|
// RequireTeam returns true when the channel belongs to a team.
|
|
func RequireTeam(tc ToolContext) bool {
|
|
return tc.TeamID != ""
|
|
}
|
|
|
|
// DenyVisitor returns true for authenticated users, false for anonymous
|
|
// session participants (v0.24.3). Tools that expose personal data
|
|
// (memory, notes) or perform privileged operations use this.
|
|
func DenyVisitor(tc ToolContext) bool {
|
|
return !tc.IsVisitor
|
|
}
|
|
|
|
// All combines multiple predicates — all must pass for the tool to be
|
|
// available. Short-circuits on first failure.
|
|
func All(reqs ...Require) Require {
|
|
return func(tc ToolContext) bool {
|
|
for _, r := range reqs {
|
|
if !r(tc) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
}
|
|
|
|
// Any combines multiple predicates — at least one must pass.
|
|
// Short-circuits on first success.
|
|
func Any(reqs ...Require) Require {
|
|
return func(tc ToolContext) bool {
|
|
for _, r := range reqs {
|
|
if r(tc) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
}
|
|
|
|
// Not inverts a predicate.
|
|
func Not(req Require) Require {
|
|
return func(tc ToolContext) bool {
|
|
return !req(tc)
|
|
}
|
|
}
|
|
|
|
// ── Shared Base Types ───────────────────────
|
|
// Embedded in tool structs to provide common availability predicates
|
|
// without repeating Availability() overrides on every struct.
|
|
|
|
// workspaceToolBase provides RequireWorkspace + DenyVisitor availability.
|
|
// Embed in workspace and git tool structs.
|
|
type workspaceToolBase struct{ BaseTool }
|
|
|
|
var _requireWorkspaceAndDenyVisitor = All(RequireWorkspace, DenyVisitor)
|
|
|
|
func (workspaceToolBase) Availability() Require { return _requireWorkspaceAndDenyVisitor }
|
|
|
|
// visitorDeniedBase provides DenyVisitor availability.
|
|
// Embed in memory and notes tool structs.
|
|
type visitorDeniedBase struct{ BaseTool }
|
|
|
|
func (visitorDeniedBase) Availability() Require { return DenyVisitor }
|